diff --git a/ets2panda/parser/ETSparser.cpp b/ets2panda/parser/ETSparser.cpp index 33176a5cc15d1a9904e4dfebb90fec0794bc31fe..fed89787d667a9a65b38310562a9a25c6444e62b 100644 --- a/ets2panda/parser/ETSparser.cpp +++ b/ets2panda/parser/ETSparser.cpp @@ -1001,7 +1001,8 @@ ir::TypeNode *ETSParser::ParseLiteralIdent(TypeAnnotationParsingOptions *options } if (Lexer()->TryEatTokenFromKeywordType(lexer::TokenType::KEYW_KEYOF)) { - auto *typeAnnotation = ParseTypeAnnotationNoPreferParam(options); + auto keyofOptions = TypeAnnotationParsingOptions::REPORT_ERROR; + auto *typeAnnotation = ParseTypeAnnotationNoPreferParam(&keyofOptions); typeAnnotation = AllocNode(typeAnnotation, Allocator()); typeAnnotation->SetRange(Lexer()->GetToken().Loc()); return typeAnnotation; diff --git a/ets2panda/test/ast/compiler/ets/keyof_invalid_argument.ets b/ets2panda/test/ast/compiler/ets/keyof_invalid_argument.ets new file mode 100644 index 0000000000000000000000000000000000000000..2f2807b6f56d84b3683ef2e7c6253d5f1baa1ae7 --- /dev/null +++ b/ets2panda/test/ast/compiler/ets/keyof_invalid_argument.ets @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function foo(t: T | {}, k: keyof (T | {})) {} + +class ObservableImpl extends Observable { + extendObservable(extraProps: U) { + new ObservableImpl<{ [K in keyof (T & U)]: (T & U)[K] }>(); + } +} + +type NestedKey = T[K] extends object ? keyof T[K] : never; + +/* @@? 16:24 Error SyntaxError: Unexpected token, expected ',' or ')'. */ +/* @@? 16:24 Error SyntaxError: Invalid Type. */ +/* @@? 16:26 Error SyntaxError: Unexpected token ','. */ +/* @@? 16:28 Error SyntaxError: Unexpected token 'k'. */ +/* @@? 16:31 Error SyntaxError: Label must be followed by a loop statement. */ +/* @@? 16:31 Error TypeError: Unresolved reference keyof */ +/* @@? 16:42 Error SyntaxError: Invalid Type. */ +/* @@? 16:42 Error SyntaxError: Unexpected token, expected ')'. */ +/* @@? 16:45 Error SyntaxError: Unexpected token ')'. */ +/* @@? 16:47 Error SyntaxError: Unexpected token '{'. */ +/* @@? 18:33 Error TypeError: Cannot find type 'Observable'. */ +/* @@? 18:33 Error TypeError: The super type of 'ObservableImpl' class is not extensible. */ +/* @@? 20:9 Error TypeError: Type 'ObservableImpl' is generic but type argument were not provided. */ +/* @@? 20:24 Error SyntaxError: Invalid Type. */ +/* @@? 20:24 Error SyntaxError: Unexpected token, expected '>'. */ +/* @@? 20:27 Error TypeError: Unresolved reference K */ +/* @@? 20:29 Error SyntaxError: Unexpected token, expected ',' or ']'. */ +/* @@? 20:29 Error SyntaxError: Unexpected token 'in'. */ +/* @@? 20:29 Error TypeError: Unresolved reference in */ +/* @@? 20:32 Error SyntaxError: Unexpected token 'keyof'. */ +/* @@? 20:32 Error TypeError: This expression is not callable. */ +/* @@? 20:41 Error SyntaxError: Unexpected token, expected ')'. */ +/* @@? 20:45 Error SyntaxError: Unexpected token ']'. */ +/* @@? 20:46 Error SyntaxError: Unexpected token ':'. */ +/* @@? 20:46 Error TypeError: Indexed access is not supported for such expression type. */ +/* @@? 20:60 Error SyntaxError: Unexpected token '>'. */ +/* @@? 20:61 Error SyntaxError: Unexpected token '('. */ +/* @@? 20:62 Error SyntaxError: Unexpected token ')'. */ +/* @@? 22:1 Error SyntaxError: Unexpected token '}'. */ +/* @@? 24:36 Error TypeError: The `keyof` keyword can only be used for class or interface type. */ +/* @@? 24:42 Error SyntaxError: Unexpected token ']'. */ +/* @@? 24:42 Error SyntaxError: Unexpected token, expected ']'. */ +/* @@? 24:43 Error SyntaxError: Unexpected token ']'. */ +/* @@? 24:45 Error SyntaxError: Unexpected token 'extends'. */ +/* @@? 24:53 Error SyntaxError: Unexpected token 'object'. */ +/* @@? 24:53 Error TypeError: Type name 'object' used in the wrong context */ +/* @@? 24:68 Error SyntaxError: Unexpected token. */ +/* @@? 24:68 Error TypeError: Unresolved reference T */ +/* @@? 24:68 Error TypeError: Indexed access is not supported for such expression type. */ +/* @@? 24:70 Error SyntaxError: Unexpected token, expected ']'. */ +/* @@? 24:73 Error SyntaxError: Unexpected token ':'. */ +/* @@? 24:75 Error SyntaxError: Unexpected token 'never'. */ +/* @@? 24:75 Error SyntaxError: Class cannot be used as object. */