From 266253c14264c1ffdbf4602b2e8a6d7eda0e36c9 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Fri, 29 Sep 2023 17:02:56 +0800 Subject: [PATCH] fix: ts parsing error (#940) Fixed https://github.com/web-infra-dev/oxc/issues/932 --- crates/oxc_ast/src/ast/ts.rs | 2 +- crates/oxc_ast/src/ast_builder.rs | 2 +- crates/oxc_ast/src/visit.rs | 4 +++- crates/oxc_ast/src/visit_mut.rs | 4 +++- crates/oxc_parser/src/ts/types.rs | 4 +--- tasks/coverage/parser_typescript.snap | 20 +++----------------- 6 files changed, 12 insertions(+), 24 deletions(-) diff --git a/crates/oxc_ast/src/ast/ts.rs b/crates/oxc_ast/src/ast/ts.rs index e825ab468..14db099be 100644 --- a/crates/oxc_ast/src/ast/ts.rs +++ b/crates/oxc_ast/src/ast/ts.rs @@ -726,7 +726,7 @@ pub struct TSMappedType<'a> { pub span: Span, pub type_parameter: Box<'a, TSTypeParameter<'a>>, pub name_type: Option>, - pub type_annotation: TSType<'a>, + pub type_annotation: Option>>, pub optional: TSMappedTypeModifierOperator, pub readonly: TSMappedTypeModifierOperator, } diff --git a/crates/oxc_ast/src/ast_builder.rs b/crates/oxc_ast/src/ast_builder.rs index 6b911748e..235fc885e 100644 --- a/crates/oxc_ast/src/ast_builder.rs +++ b/crates/oxc_ast/src/ast_builder.rs @@ -1407,7 +1407,7 @@ impl<'a> AstBuilder<'a> { span: Span, type_parameter: Box<'a, TSTypeParameter<'a>>, name_type: Option>, - type_annotation: TSType<'a>, + type_annotation: Option>>, optional: TSMappedTypeModifierOperator, readonly: TSMappedTypeModifierOperator, ) -> TSType<'a> { diff --git a/crates/oxc_ast/src/visit.rs b/crates/oxc_ast/src/visit.rs index 4ebc71bd3..e0a3b222b 100644 --- a/crates/oxc_ast/src/visit.rs +++ b/crates/oxc_ast/src/visit.rs @@ -1447,7 +1447,9 @@ pub trait Visit<'a>: Sized { if let Some(name) = &ty.name_type { self.visit_ts_type(name); } - self.visit_ts_type(&ty.type_annotation); + if let Some(type_annotation) = &ty.type_annotation { + self.visit_ts_type_annotation(type_annotation); + } } fn visit_ts_function_type(&mut self, ty: &'a TSFunctionType<'a>) { diff --git a/crates/oxc_ast/src/visit_mut.rs b/crates/oxc_ast/src/visit_mut.rs index 8307d210d..58acdfbff 100644 --- a/crates/oxc_ast/src/visit_mut.rs +++ b/crates/oxc_ast/src/visit_mut.rs @@ -1107,7 +1107,9 @@ pub trait VisitMut<'a, 'b>: Sized { if let Some(name) = &mut ty.name_type { self.visit_ts_type(name); } - self.visit_ts_type(&mut ty.type_annotation); + if let Some(type_annotation) = &mut ty.type_annotation { + self.visit_ts_type_annotation(type_annotation); + } } fn visit_ts_function_type(&mut self, ty: &'b mut TSFunctionType<'a>) { diff --git a/crates/oxc_parser/src/ts/types.rs b/crates/oxc_parser/src/ts/types.rs index 9ac41fab8..eef4f4210 100644 --- a/crates/oxc_parser/src/ts/types.rs +++ b/crates/oxc_parser/src/ts/types.rs @@ -656,9 +656,7 @@ impl<'a> Parser<'a> { _ => TSMappedTypeModifierOperator::None, }; - self.expect(Kind::Colon)?; - let type_annotation = self.parse_ts_type()?; - + let type_annotation = self.parse_ts_type_annotation()?; self.bump(Kind::Semicolon); self.expect(Kind::RCurly)?; diff --git a/tasks/coverage/parser_typescript.snap b/tasks/coverage/parser_typescript.snap index 264203bbb..2380d173b 100644 --- a/tasks/coverage/parser_typescript.snap +++ b/tasks/coverage/parser_typescript.snap @@ -1,7 +1,7 @@ parser_typescript Summary: AST Parsed : 5060/5063 (99.94%) Positive Passed: 5051/5063 (99.76%) -Negative Passed: 996/4761 (20.92%) +Negative Passed: 994/4761 (20.88%) Expect Syntax Error: "compiler/ClassDeclaration10.ts" Expect Syntax Error: "compiler/ClassDeclaration11.ts" Expect Syntax Error: "compiler/ClassDeclaration13.ts" @@ -71,6 +71,7 @@ Expect Syntax Error: "compiler/anonymousClassExpression2.ts" Expect Syntax Error: "compiler/anyDeclare.ts" Expect Syntax Error: "compiler/anyIdenticalToItself.ts" Expect Syntax Error: "compiler/anyIndexedAccessArrayNoException.ts" +Expect Syntax Error: "compiler/anyMappedTypesError.ts" Expect Syntax Error: "compiler/arguments.ts" Expect Syntax Error: "compiler/argumentsBindsToFunctionScopeArgumentList.ts" Expect Syntax Error: "compiler/argumentsObjectIterator01_ES5.ts" @@ -1104,6 +1105,7 @@ Expect Syntax Error: "compiler/logicalNotExpression1.ts" Expect Syntax Error: "compiler/mappedTypeAsStringTemplate.ts" Expect Syntax Error: "compiler/mappedTypeGenericWithKnownKeys.ts" Expect Syntax Error: "compiler/mappedTypeIndexedAccess.ts" +Expect Syntax Error: "compiler/mappedTypeNoTypeNoCrash.ts" Expect Syntax Error: "compiler/mappedTypeNotMistakenlyHomomorphic.ts" Expect Syntax Error: "compiler/mappedTypeRecursiveInference.ts" Expect Syntax Error: "compiler/mappedTypeUnionConstrainTupleTreatedAsArrayLike.ts" @@ -4045,14 +4047,6 @@ Expect to Parse: "conformance/salsa/plainJSRedeclare3.ts" ╰──── help: Try insert a semicolon here - × Expected `:` but found `}` - ╭─[compiler/anyMappedTypesError.ts:2:1] - 2 │ - 3 │ type Foo = {[P in "bar"]}; - · ┬ - · ╰── `:` expected - ╰──── - × 'arguments' is not allowed in class field initializer ╭─[compiler/argumentsUsedInClassFieldInitializerOrStaticInitializationBlock.ts:2:1] 2 │ return class T { @@ -7290,14 +7284,6 @@ Expect to Parse: "conformance/salsa/plainJSRedeclare3.ts" 10 │ a.length; ╰──── - × Expected `)` but found `}` - ╭─[compiler/mappedTypeNoTypeNoCrash.ts:1:1] - 1 │ // @declaration: true - 2 │ type T0 = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never; - · ┬ - · ╰── `)` expected - ╰──── - × Identifier `baz` has already been declared ╭─[compiler/mismatchedClassConstructorVariable.ts:1:1] 1 │ var baz: foo;