Skip to content

Commit

Permalink
fix(es/parser): Set class property to abstract or override even i…
Browse files Browse the repository at this point in the history
…n error states (#8610)

**Description:**

Ensures that a class property with `abstract` or `override` is marked as such in the AST, even in error states.
  • Loading branch information
dsherret committed Feb 6, 2024
1 parent 3ee12cf commit 5a77306
Show file tree
Hide file tree
Showing 7 changed files with 459 additions and 10 deletions.
6 changes: 2 additions & 4 deletions crates/swc_ecma_parser/src/parser/class_and_fn.rs
Expand Up @@ -622,9 +622,8 @@ impl<I: Tokens> Parser<I> {
self.input.prev_span(),
SyntaxError::TS1029("abstract".into(), "override".into()),
);
} else {
is_abstract = true;
}
is_abstract = true;
}
"override" => {
if is_override {
Expand All @@ -644,9 +643,8 @@ impl<I: Tokens> Parser<I> {
);
} else if !self.ctx().has_super_class {
self.emit_err(self.input.prev_span(), SyntaxError::TS4112);
} else {
is_override = true;
}
is_override = true;
}
"readonly" => {
let readonly_span = self.input.prev_span();
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_ecma_parser/tests/tsc/override1.json
Expand Up @@ -585,7 +585,7 @@
"accessibility": null,
"isAbstract": false,
"isOptional": false,
"isOverride": false
"isOverride": true
}
],
"superClass": null,
Expand Down Expand Up @@ -1328,7 +1328,7 @@
"accessibility": null,
"isAbstract": false,
"isOptional": false,
"isOverride": false
"isOverride": true
}
],
"superClass": null,
Expand Down
Expand Up @@ -85,7 +85,7 @@
"accessibility": null,
"isAbstract": false,
"isOptional": false,
"isOverride": false
"isOverride": true
}
],
"superClass": null,
Expand Down Expand Up @@ -182,7 +182,7 @@
"accessibility": null,
"isAbstract": false,
"isOptional": false,
"isOverride": false
"isOverride": true
}
],
"superClass": null,
Expand Down
12 changes: 12 additions & 0 deletions crates/swc_ecma_parser/tests/typescript/class/abstract/input.ts
Expand Up @@ -5,3 +5,15 @@ export abstract class C {}
export default abstract class { }
export default abstract class C { }
// `abstract class` is not valid as an expression.

export abstract class C {
abstract prop: number;
abstract method(): void;
}
export class C {
// should still have as abstract even though parent is not
abstract prop: number;
abstract method(): void;
// should be abstract in spite of override in wrong place
override abstract method(): string;
}

0 comments on commit 5a77306

Please sign in to comment.