diff --git a/crates/oxc_linter/src/rules/unicorn/no_static_only_class.rs b/crates/oxc_linter/src/rules/unicorn/no_static_only_class.rs index ccabbcc2ae8b3..e98db5ce748c9 100644 --- a/crates/oxc_linter/src/rules/unicorn/no_static_only_class.rs +++ b/crates/oxc_linter/src/rules/unicorn/no_static_only_class.rs @@ -243,8 +243,8 @@ fn test() { r"const A = class { static #a() {}; }", r"const A = class { static #a = 1; }", r"@decorator class A { static a = 1; }", - r"class A { static public a = 1; }", - r"class A { static private a = 1; }", + r"class A { public static a = 1; }", + r"class A { private static a = 1; }", r"class A { static readonly a = 1; }", r"class A { static declare a = 1; }", r"class A { static {}; }", diff --git a/crates/oxc_parser/src/js/class.rs b/crates/oxc_parser/src/js/class.rs index 106947adeb9bb..ccd81429448e2 100644 --- a/crates/oxc_parser/src/js/class.rs +++ b/crates/oxc_parser/src/js/class.rs @@ -292,31 +292,13 @@ impl<'a> ParserImpl<'a> { self.error(diagnostics::decorators_are_not_valid_here(decorator.span)); } - // No modifiers except `static` and `readonly` are valid here, and they must appear in that order + // No modifiers except `static` and `readonly` are valid here self.verify_modifiers( &modifiers, ModifierFlags::READONLY | ModifierFlags::STATIC, true, diagnostics::cannot_appear_on_an_index_signature, ); - if modifiers.contains_all_flags(ModifierFlags::READONLY | ModifierFlags::STATIC) { - // Has both `readonly` and `static` modifiers. Make sure `static` comes before `readonly`. - let mut has_seen_readonly_modifier = false; - for modifier in modifiers.iter() { - match modifier.kind { - ModifierKind::Readonly => has_seen_readonly_modifier = true, - ModifierKind::Static => { - if has_seen_readonly_modifier { - self.error(diagnostics::modifier_must_precede_other_modifier( - modifier, - ModifierKind::Readonly, - )); - } - } - _ => {} - } - } - } return ClassElement::TSIndexSignature( self.parse_index_signature_declaration(span, &modifiers), diff --git a/crates/oxc_parser/src/modifiers.rs b/crates/oxc_parser/src/modifiers.rs index e9f98912eb929..fa29b164b3345 100644 --- a/crates/oxc_parser/src/modifiers.rs +++ b/crates/oxc_parser/src/modifiers.rs @@ -202,10 +202,6 @@ impl<'a> Modifiers<'a> { self.flags.contains(target.into()) } - pub fn contains_all_flags(&self, flags: ModifierFlags) -> bool { - self.flags.contains(flags) - } - pub fn iter(&self) -> impl Iterator + '_ { self.modifiers.as_ref().into_iter().flat_map(|modifiers| modifiers.iter()) } @@ -330,13 +326,7 @@ impl<'a> ParserImpl<'a> { let kind = self.cur_kind(); self.bump_any(); let modifier = self.modifier(kind, self.end_span(span)); - if modifier.kind == ModifierKind::Export { - self.error(diagnostics::modifier_must_precede_other_modifier( - &modifier, - ModifierKind::Declare, - )); - } - self.check_for_duplicate_modifiers(flags, &modifier); + self.check_modifier(flags, &modifier); flags.set(modifier_flags, true); modifiers.push(modifier); } @@ -395,7 +385,7 @@ impl<'a> ParserImpl<'a> { if modifier.is_static() { has_seen_static_modifier = true; } - self.check_for_duplicate_modifiers(modifier_flags, &modifier); + self.check_modifier(modifier_flags, &modifier); modifier_flags.set(modifier.kind.into(), true); modifiers.get_or_insert_with(|| self.ast.vec()).push(modifier); } @@ -492,16 +482,128 @@ impl<'a> ParserImpl<'a> { kind == Kind::LBrack || kind == Kind::PrivateIdentifier || kind.is_literal_property_name() } - fn check_for_duplicate_modifiers(&mut self, seen_flags: ModifierFlags, modifier: &Modifier) { - if matches!( - modifier.kind, - ModifierKind::Public | ModifierKind::Protected | ModifierKind::Private - ) && seen_flags - .intersects(ModifierFlags::PUBLIC | ModifierFlags::PROTECTED | ModifierFlags::PRIVATE) - { - self.error(diagnostics::accessibility_modifier_already_seen(modifier)); - } else if seen_flags.contains(modifier.kind.into()) { - self.error(diagnostics::modifier_already_seen(modifier)); + fn check_modifier(&mut self, flags: ModifierFlags, modifier: &Modifier) { + match modifier.kind { + ModifierKind::Public | ModifierKind::Private | ModifierKind::Protected => { + if flags.intersects(ModifierFlags::ACCESSIBILITY) { + self.error(diagnostics::accessibility_modifier_already_seen(modifier)); + } else if flags.contains(ModifierFlags::OVERRIDE) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Override, + )); + } else if flags.contains(ModifierFlags::STATIC) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Static, + )); + } else if flags.contains(ModifierFlags::ACCESSOR) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Accessor, + )); + } else if flags.contains(ModifierFlags::READONLY) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Readonly, + )); + } else if flags.contains(ModifierFlags::ASYNC) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Async, + )); + } else if flags.contains(ModifierFlags::ABSTRACT) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Abstract, + )); + } + } + ModifierKind::Static => { + if flags.contains(ModifierFlags::STATIC) { + self.error(diagnostics::modifier_already_seen(modifier)); + } else if flags.contains(ModifierFlags::READONLY) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Readonly, + )); + } else if flags.contains(ModifierFlags::ASYNC) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Async, + )); + } else if flags.contains(ModifierFlags::ACCESSOR) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Accessor, + )); + } else if flags.contains(ModifierFlags::OVERRIDE) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Override, + )); + } + } + ModifierKind::Override => { + if flags.contains(ModifierFlags::OVERRIDE) { + self.error(diagnostics::modifier_already_seen(modifier)); + } else if flags.contains(ModifierFlags::READONLY) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Readonly, + )); + } else if flags.contains(ModifierFlags::ACCESSOR) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Accessor, + )); + } else if flags.contains(ModifierFlags::ASYNC) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Async, + )); + } + } + ModifierKind::Abstract => { + if flags.contains(ModifierFlags::ABSTRACT) { + self.error(diagnostics::modifier_already_seen(modifier)); + } else if flags.contains(ModifierFlags::OVERRIDE) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Override, + )); + } else if flags.contains(ModifierFlags::ACCESSOR) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Accessor, + )); + } + } + ModifierKind::Export => { + if flags.contains(ModifierFlags::EXPORT) { + self.error(diagnostics::modifier_already_seen(modifier)); + } else if flags.contains(ModifierFlags::DECLARE) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Declare, + )); + } else if flags.contains(ModifierFlags::ABSTRACT) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Abstract, + )); + } else if flags.contains(ModifierFlags::ASYNC) { + self.error(diagnostics::modifier_must_precede_other_modifier( + modifier, + ModifierKind::Async, + )); + } + } + _ => { + if flags.contains(modifier.kind.into()) { + self.error(diagnostics::modifier_already_seen(modifier)); + } + } } } diff --git a/tasks/coverage/snapshots/parser_babel.snap b/tasks/coverage/snapshots/parser_babel.snap index 0478e42eed829..0c080a4e82081 100644 --- a/tasks/coverage/snapshots/parser_babel.snap +++ b/tasks/coverage/snapshots/parser_babel.snap @@ -3,31 +3,21 @@ commit: 92c052dc parser_babel Summary: AST Parsed : 2224/2224 (100.00%) Positive Passed: 2211/2224 (99.42%) -Negative Passed: 1660/1689 (98.28%) +Negative Passed: 1665/1689 (98.58%) Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/es2026/explicit-resource-management/invalid-for-using-of-no-initializer/input.js Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/cast/unparenthesized-assert-and-assign/input.ts Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/cast/unparenthesized-type-assertion-and-assign/input.ts -Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/constructor-with-invalid-order-modifiers-1/input.ts - -Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/constructor-with-invalid-order-modifiers-2/input.ts - -Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/constructor-with-invalid-order-modifiers-3/input.ts - Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/declare-field-initializer/input.ts Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/declare-initializer/input.ts Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/declare-readonly-field-initializer-w-annotation/input.ts -Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/invalid-modifiers-order/input.ts - Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-incompatible/input.ts -Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts - Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/declare/invalid-namespace-var/input.ts Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/declare/module-class/input.ts @@ -12414,6 +12404,30 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc ╰──── help: Allowed modifiers are: private, protected, public, static, abstract, override + × TS(1029): 'override' modifier must precede 'readonly' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/constructor-with-invalid-order-modifiers-1/input.ts:2:24] + 1 │ class D extends B { + 2 │ constructor(readonly override foo: string) {} + · ──────── + 3 │ } + ╰──── + + × TS(1029): 'public' modifier must precede 'readonly' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/constructor-with-invalid-order-modifiers-2/input.ts:2:24] + 1 │ class D extends B { + 2 │ constructor(readonly public foo: string) {} + · ────── + 3 │ } + ╰──── + + × TS(1029): 'public' modifier must precede 'override' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/constructor-with-invalid-order-modifiers-3/input.ts:2:33] + 1 │ class D extends B { + 2 │ constructor(override readonly public foo: string) {} + · ────── + 3 │ } + ╰──── + × TS(1092): Type parameters cannot appear on a constructor declaration ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/constructor-with-type-parameters/input.ts:2:14] 1 │ class C { @@ -12635,6 +12649,46 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc 3 │ } ╰──── + × TS(1029): 'private' modifier must precede 'override' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/invalid-modifiers-order/input.ts:2:12] + 1 │ class Foo extends Bar { + 2 │ override private foo1: string + · ─────── + 3 │ readonly private foo2: string; + ╰──── + + × TS(1029): 'private' modifier must precede 'readonly' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/invalid-modifiers-order/input.ts:3:12] + 2 │ override private foo1: string + 3 │ readonly private foo2: string; + · ─────── + 4 │ readonly private override foo3: string; + ╰──── + + × TS(1029): 'private' modifier must precede 'readonly' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/invalid-modifiers-order/input.ts:4:12] + 3 │ readonly private foo2: string; + 4 │ readonly private override foo3: string; + · ─────── + 5 │ private readonly override foo4: string; + ╰──── + + × TS(1029): 'override' modifier must precede 'readonly' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/invalid-modifiers-order/input.ts:4:20] + 3 │ readonly private foo2: string; + 4 │ readonly private override foo3: string; + · ──────── + 5 │ private readonly override foo4: string; + ╰──── + + × TS(1029): 'override' modifier must precede 'readonly' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/invalid-modifiers-order/input.ts:5:20] + 4 │ readonly private override foo3: string; + 5 │ private readonly override foo4: string; + · ──────── + 6 │ } + ╰──── + × TS(1024): 'readonly' modifier can only appear on a property declaration or index signature. ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/method-readonly/input.ts:2:5] 1 │ class C { @@ -12713,6 +12767,78 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc ╰──── help: Allowed modifiers are: static, readonly + × TS(1029): 'static' modifier must precede 'override' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:3:12] + 2 │ static override m1() {} + 3 │ override static m2() {} + · ────── + 4 │ + ╰──── + + × TS(1029): 'override' modifier must precede 'readonly' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:6:12] + 5 │ override readonly p4; + 6 │ readonly override p3; + · ──────── + 7 │ + ╰──── + + × TS(1029): 'public' modifier must precede 'override' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:9:12] + 8 │ public override m5() {} + 9 │ override public m6() {} + · ────── + 10 │ + ╰──── + + × TS(1029): 'protected' modifier must precede 'override' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:12:12] + 11 │ protected override m7() {} + 12 │ override protected m8() {} + · ───────── + 13 │ + ╰──── + + × TS(1029): 'private' modifier must precede 'override' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:15:12] + 14 │ private override m9() {} + 15 │ override private m10() {} + · ─────── + 16 │ + ╰──── + + × TS(1029): 'abstract' modifier must precede 'override' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:18:12] + 17 │ abstract override m12(); + 18 │ override abstract m11(); + · ──────── + 19 │ + ╰──── + + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:21:10] + 20 │ public static m14() {} + 21 │ static public m13() {} + · ────── + 22 │ + ╰──── + + × TS(1029): 'protected' modifier must precede 'static' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:24:10] + 23 │ protected static m16() {} + 24 │ static protected m15() {} + · ───────── + 25 │ + ╰──── + + × TS(1029): 'private' modifier must precede 'static' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-invalid-order/input.ts:27:10] + 26 │ private static m18() {} + 27 │ static private m17() {} + · ─────── + 28 │ } + ╰──── + × TS(1071): 'override' modifier cannot appear on an index signature. ╭─[babel/packages/babel-parser/test/fixtures/typescript/class/modifiers-override-errors/input.ts:3:3] 2 │ override constructor() {} @@ -13846,6 +13972,14 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc 3 │ } ╰──── + × TS(1029): 'private' modifier must precede 'static' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-private-02/input.ts:2:10] + 1 │ class Foo { + 2 │ static private {} + · ─────── + 3 │ } + ╰──── + × Unexpected token ╭─[babel/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-private-02/input.ts:2:18] 1 │ class Foo { @@ -13862,6 +13996,14 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc 3 │ } ╰──── + × TS(1029): 'protected' modifier must precede 'static' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-protected-02/input.ts:2:10] + 1 │ class Foo { + 2 │ static protected {} + · ───────── + 3 │ } + ╰──── + × Unexpected token ╭─[babel/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-protected-02/input.ts:2:20] 1 │ class Foo { @@ -13878,6 +14020,14 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc 3 │ } ╰──── + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[babel/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-public-02/input.ts:2:10] + 1 │ class Foo { + 2 │ static public {} + · ────── + 3 │ } + ╰──── + × Unexpected token ╭─[babel/packages/babel-parser/test/fixtures/typescript/static-blocks/invalid-static-block-with-accessibility-public-02/input.ts:2:17] 1 │ class Foo { diff --git a/tasks/coverage/snapshots/parser_typescript.snap b/tasks/coverage/snapshots/parser_typescript.snap index b8cf0f262b5b3..33e2fafe37f89 100644 --- a/tasks/coverage/snapshots/parser_typescript.snap +++ b/tasks/coverage/snapshots/parser_typescript.snap @@ -3,7 +3,7 @@ commit: 95e3aaa9 parser_typescript Summary: AST Parsed : 9843/9843 (100.00%) Positive Passed: 9839/9843 (99.96%) -Negative Passed: 1515/2557 (59.25%) +Negative Passed: 1529/2557 (59.80%) Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/FunctionDeclaration3.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/FunctionDeclaration4.ts @@ -666,8 +666,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/moduleVariab Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/moduleVisibilityTest2.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/multipleClassPropertyModifiers.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/multipleExportAssignments.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/multipleExportAssignmentsInAmbientDeclaration.ts @@ -844,8 +842,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/staticInstan Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/staticMemberExportAccess.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/staticMustPrecedePublic.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/staticPropSuper.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/staticVisibility.ts @@ -992,8 +988,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/async/es6 Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/async/es6/functionDeclarations/asyncFunctionDeclaration3_es6.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractProperties.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/classExpressions/classWithStaticFieldInParameterBindingPattern.2.ts @@ -1012,8 +1006,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/c Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorParameterProperties2.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/readonlyInConstructorParameters.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassParameterProperties.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/constructorDeclarations/superCalls/derivedClassSuperCallsWithThisArg.ts @@ -1060,8 +1052,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/m Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/members/privateNames/privateNamesAndDecorators.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields.ts @@ -1706,10 +1696,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/node/node Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/node/nodeModulesTopLevelAwait.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/override/override11.ts - -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/override/overrideKeywordOrder.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/override/override_js3.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript3/Accessors/parserES3Accessors1.ts @@ -1740,12 +1726,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ec Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/EnumDeclarations/parserEnumDeclaration3.d.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic1.ts - -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic10.ts - -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic7.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/parserModifierOnStatementInBlock1.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/parserModifierOnStatementInBlock2.ts @@ -1782,12 +1762,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ec Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/MemberAccessorDeclarations/parserMemberAccessorDeclaration3.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/MemberAccessorDeclarations/parserMemberAccessorDeclaration9.ts - -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/MemberFunctionDeclarations/parserMemberFunctionDeclaration3.ts - -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration3.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/ModuleDeclarations/parserModuleDeclaration1.d.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/ModuleDeclarations/parserModuleDeclaration1.ts @@ -1810,8 +1784,6 @@ Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ec Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/ParameterLists/parserParameterList17.ts -Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/Protected/Protected6.ts - Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509618.ts Expect Syntax Error: tasks/coverage/typescript/tests/cases/conformance/parser/ecmascript5/Statements/ContinueStatements/parser_continueNotInIterationStatement4.ts @@ -8305,6 +8277,22 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 2 │ .then((role: Role) => ╰──── + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/compiler/multipleClassPropertyModifiers.ts:3:12] + 2 │ public static p1; + 3 │ static public p2; + · ────── + 4 │ private static p3; + ╰──── + + × TS(1029): 'private' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/compiler/multipleClassPropertyModifiers.ts:5:12] + 4 │ private static p3; + 5 │ static private p4; + · ─────── + 6 │ } + ╰──── + × TS(1028): Accessibility modifier already seen. ╭─[typescript/tests/cases/compiler/multipleClassPropertyModifiersErrors.ts:2:9] 1 │ class C { @@ -10565,6 +10553,22 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 3 │ public static static bar() { } ╰──── + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/compiler/staticMustPrecedePublic.ts:2:12] + 1 │ class Outer { + 2 │ static public intI: number; + · ────── + 3 │ static private stringF: string; + ╰──── + + × TS(1029): 'private' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/compiler/staticMustPrecedePublic.ts:3:12] + 2 │ static public intI: number; + 3 │ static private stringF: string; + · ─────── + 4 │ } + ╰──── + × Classes may not have a static property named 'prototype' ╭─[typescript/tests/cases/compiler/staticPrototypeProperty.ts:2:11] 1 │ class C { @@ -13042,6 +13046,30 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 3 │ } ╰──── + × TS(1029): 'public' modifier must precede 'abstract' modifier. + ╭─[typescript/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts:8:14] + 7 │ + 8 │ abstract public foo_bb(); + · ────── + 9 │ abstract protected foo_cc(); + ╰──── + + × TS(1029): 'protected' modifier must precede 'abstract' modifier. + ╭─[typescript/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts:9:14] + 8 │ abstract public foo_bb(); + 9 │ abstract protected foo_cc(); + · ───────── + 10 │ abstract private foo_dd(); + ╰──── + + × TS(1029): 'private' modifier must precede 'abstract' modifier. + ╭─[typescript/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts:10:14] + 9 │ abstract protected foo_cc(); + 10 │ abstract private foo_dd(); + · ─────── + 11 │ + ╰──── + × TS(2391): Function implementation is missing or not immediately following the declaration. ╭─[typescript/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverloads.ts:15:5] 14 │ @@ -13248,6 +13276,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 7 │ // something ╰──── + × TS(1029): 'private' modifier must precede 'readonly' modifier. + ╭─[typescript/tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts:10:14] + 9 │ + 10 │ readonly private static { + · ─────── + 11 │ // something + ╰──── + × TS(1184): Modifiers cannot appear here. ╭─[typescript/tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts:10:5] 9 │ @@ -13485,6 +13521,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 3 │ method(readonly x: number); ╰──── + × TS(1029): 'public' modifier must precede 'readonly' modifier. + ╭─[typescript/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/readonlyInConstructorParameters.ts:7:26] + 6 │ class E { + 7 │ constructor(readonly public x: number) {} + · ────── + 8 │ } + ╰──── + × TS(1030): 'readonly' modifier already seen. ╭─[typescript/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/readonlyReadonly.ts:2:14] 1 │ class C { @@ -14710,6 +14754,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 13 │ } ╰──── + × TS(1029): 'static' modifier must precede 'async' modifier. + ╭─[typescript/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts:11:11] + 10 │ } + 11 │ async static *#bazBad() { yield 42; } + · ────── + 12 │ } + ╰──── + × Private identifier '#method' is not allowed outside class bodies ╭─[typescript/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts:9:14] 8 │ console.log(C.getClass().getField()); @@ -15023,6 +15075,102 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 3 │ } ╰──── + × TS(1029): 'private' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:21:12] + 20 │ class D { + 21 │ static private privateProperty; + · ─────── + 22 │ static private privateMethod() { } + ╰──── + + × TS(1029): 'private' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:22:12] + 21 │ static private privateProperty; + 22 │ static private privateMethod() { } + · ─────── + 23 │ static private get privateGetter() { return 0; } + ╰──── + + × TS(1029): 'private' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:23:12] + 22 │ static private privateMethod() { } + 23 │ static private get privateGetter() { return 0; } + · ─────── + 24 │ static private set privateSetter(a: number) { } + ╰──── + + × TS(1029): 'private' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:24:12] + 23 │ static private get privateGetter() { return 0; } + 24 │ static private set privateSetter(a: number) { } + · ─────── + 25 │ + ╰──── + + × TS(1029): 'protected' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:26:12] + 25 │ + 26 │ static protected protectedProperty; + · ───────── + 27 │ static protected protectedMethod() { } + ╰──── + + × TS(1029): 'protected' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:27:12] + 26 │ static protected protectedProperty; + 27 │ static protected protectedMethod() { } + · ───────── + 28 │ static protected get protectedGetter() { return 0; } + ╰──── + + × TS(1029): 'protected' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:28:12] + 27 │ static protected protectedMethod() { } + 28 │ static protected get protectedGetter() { return 0; } + · ───────── + 29 │ static protected set protectedSetter(a: number) { } + ╰──── + + × TS(1029): 'protected' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:29:12] + 28 │ static protected get protectedGetter() { return 0; } + 29 │ static protected set protectedSetter(a: number) { } + · ───────── + 30 │ + ╰──── + + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:31:12] + 30 │ + 31 │ static public publicProperty; + · ────── + 32 │ static public publicMethod() { } + ╰──── + + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:32:12] + 31 │ static public publicProperty; + 32 │ static public publicMethod() { } + · ────── + 33 │ static public get publicGetter() { return 0; } + ╰──── + + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:33:12] + 32 │ static public publicMethod() { } + 33 │ static public get publicGetter() { return 0; } + · ────── + 34 │ static public set publicSetter(a: number) { } + ╰──── + + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:34:12] + 33 │ static public get publicGetter() { return 0; } + 34 │ static public set publicSetter(a: number) { } + · ────── + 35 │ } + ╰──── + × TS(1028): Accessibility modifier already seen. ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/accessibilityModifiers.ts:39:13] 38 │ class E { @@ -15118,6 +15266,46 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va ╰──── help: Allowed modifiers are: private, protected, public, static, abstract, override + × TS(1029): 'public' modifier must precede 'accessor' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/autoAccessorDisallowedModifiers.ts:5:14] + 4 │ declare accessor c: any; + 5 │ accessor public d: any; + · ────── + 6 │ accessor private e: any; + ╰──── + + × TS(1029): 'private' modifier must precede 'accessor' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/autoAccessorDisallowedModifiers.ts:6:14] + 5 │ accessor public d: any; + 6 │ accessor private e: any; + · ─────── + 7 │ accessor protected f: any; + ╰──── + + × TS(1029): 'protected' modifier must precede 'accessor' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/autoAccessorDisallowedModifiers.ts:7:14] + 6 │ accessor private e: any; + 7 │ accessor protected f: any; + · ───────── + 8 │ accessor abstract g: any; + ╰──── + + × TS(1029): 'abstract' modifier must precede 'accessor' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/autoAccessorDisallowedModifiers.ts:8:14] + 7 │ accessor protected f: any; + 8 │ accessor abstract g: any; + · ──────── + 9 │ accessor static h: any; + ╰──── + + × TS(1029): 'static' modifier must precede 'accessor' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/autoAccessorDisallowedModifiers.ts:9:14] + 8 │ accessor abstract g: any; + 9 │ accessor static h: any; + · ────── + 10 │ accessor i() {} + ╰──── + × TS(1276): An 'accessor' property cannot be declared optional. ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/autoAccessorDisallowedModifiers.ts:14:15] 13 │ accessor constructor() {} @@ -15145,6 +15333,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va ╰──── help: Allowed modifiers are: private, protected, public, static, abstract, override + × TS(1029): 'override' modifier must precede 'accessor' modifier. + ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/autoAccessorDisallowedModifiers.ts:20:14] + 19 │ class C2 extends C1 { + 20 │ accessor override g: any; + · ──────── + 21 │ } + ╰──── + × TS(1070): 'accessor' modifier cannot appear on a type member. ╭─[typescript/tests/cases/conformance/classes/propertyMemberDeclarations/autoAccessorDisallowedModifiers.ts:24:5] 23 │ interface I1 { @@ -20031,14 +20227,6 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va · ╰── Opened here ╰──── - × TS(1029): 'export' modifier must precede 'declare' modifier. - ╭─[typescript/tests/cases/conformance/externalModules/umd-errors.ts:3:8] - 2 │ export var p; - 3 │ static export as namespace oo1; - · ────── - 4 │ declare export as namespace oo2; - ╰──── - × Unexpected token ╭─[typescript/tests/cases/conformance/externalModules/umd-errors.ts:3:15] 2 │ export var p; @@ -21197,6 +21385,22 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va · ───────────────── ╰──── + × TS(1029): 'public' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/override11.ts:6:27] + 5 │ class Sub extends Base { + 6 │ constructor (override public foo: number) { + · ────── + 7 │ super(); + ╰──── + + × TS(1029): 'override' modifier must precede 'readonly' modifier. + ╭─[typescript/tests/cases/conformance/override/override5.ts:16:14] + 15 │ + 16 │ readonly override p3: number; + · ──────── + 17 │ + ╰──── + × TS(1030): 'override' modifier already seen. ╭─[typescript/tests/cases/conformance/override/override5.ts:22:14] 21 │ @@ -21206,6 +21410,38 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va ╰──── help: Remove the duplicate modifier. + × TS(1029): 'public' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/override5.ts:25:14] + 24 │ public override pp: number; + 25 │ override public op: number; + · ────── + 26 │ + ╰──── + + × TS(1029): 'abstract' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/override5.ts:39:14] + 38 │ abstract class AD extends AB { + 39 │ override abstract f(): void; + · ──────── + 40 │ abstract override b(): void; + ╰──── + + × TS(1029): 'abstract' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/override5.ts:44:14] + 43 │ abstract class AND { + 44 │ override abstract f(): void; + · ──────── + 45 │ abstract override b(): void; + ╰──── + + × TS(1029): 'override' modifier must precede 'readonly' modifier. + ╭─[typescript/tests/cases/conformance/override/override7.ts:13:14] + 12 │ + 13 │ readonly override p3: number; + · ──────── + 14 │ + ╰──── + × TS(1030): 'override' modifier already seen. ╭─[typescript/tests/cases/conformance/override/override7.ts:19:14] 18 │ @@ -21215,6 +21451,30 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va ╰──── help: Remove the duplicate modifier. + × TS(1029): 'public' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/override7.ts:22:14] + 21 │ public override pp: number; + 22 │ override public op: number; + · ────── + 23 │ + ╰──── + + × TS(1029): 'abstract' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/override7.ts:36:14] + 35 │ abstract class AD extends AB { + 36 │ override abstract f(): void; + · ──────── + 37 │ abstract override b(): void; + ╰──── + + × TS(1029): 'abstract' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/override7.ts:41:14] + 40 │ abstract class AND { + 41 │ override abstract f(): void; + · ──────── + 42 │ abstract override b(): void; + ╰──── + × TS(1070): 'override' modifier cannot appear on a type member. ╭─[typescript/tests/cases/conformance/override/override9.ts:8:5] 7 │ foo (): void; @@ -21233,6 +21493,54 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va ╰──── help: Only 'readonly' modifier is allowed here. + × TS(1029): 'override' modifier must precede 'async' modifier. + ╭─[typescript/tests/cases/conformance/override/overrideKeywordOrder.ts:12:9] + 11 │ override async m1() {} + 12 │ async override m2() {} // error + · ──────── + 13 │ } + ╰──── + + × TS(1029): 'static' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/overrideKeywordOrder.ts:15:12] + 14 │ class Test2 extends Base { + 15 │ override static s1() {} // error + · ────── + 16 │ static override s2() {} + ╰──── + + × TS(1029): 'public' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/overrideKeywordOrder.ts:21:12] + 20 │ class Test3 extends Base { + 21 │ override public m1() {} // error + · ────── + 22 │ public override m2() {} + ╰──── + + × TS(1029): 'override' modifier must precede 'readonly' modifier. + ╭─[typescript/tests/cases/conformance/override/overrideKeywordOrder.ts:26:12] + 25 │ override readonly p1: any; + 26 │ readonly override p2: any; // error + · ──────── + 27 │ m1() {} + ╰──── + + × TS(1029): 'abstract' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/overrideKeywordOrder.ts:32:12] + 31 │ abstract class Test5 extends Base { + 32 │ override abstract m1(): void; // error + · ──────── + 33 │ abstract override m2(): void; + ╰──── + + × TS(1029): 'public' modifier must precede 'override' modifier. + ╭─[typescript/tests/cases/conformance/override/overrideParameterProperty.ts:20:24] + 19 │ class C3 extends Base { + 20 │ constructor(override public p1: "hello") { + · ────── + 21 │ super(); + ╰──── + × TS(1090): 'override' modifier cannot appear on a parameter. ╭─[typescript/tests/cases/conformance/override/overrideParameterProperty.ts:25:5] 24 │ @@ -21709,6 +22017,22 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 2 │ } ╰──── + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic1.ts:3:8] + 2 │ { + 3 │ static public intI: number; + · ────── + 4 │ } + ╰──── + + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic10.ts:3:8] + 2 │ { + 3 │ static public intI() {} + · ────── + 4 │ } + ╰──── + × Expected `}` but found `EOF` ╭─[typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic6.ts:3:14] 1 │ class Outer @@ -21718,6 +22042,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 3 │ static public ╰──── + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic7.ts:3:8] + 2 │ { + 3 │ static public intI() {} + · ────── + 4 │ } + ╰──── + × Unexpected token ╭─[typescript/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList1.ts:3:4] 2 │ bar( @@ -22777,6 +23109,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 3 │ } ╰──── + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/parser/ecmascript5/MemberAccessorDeclarations/parserMemberAccessorDeclaration9.ts:2:12] + 1 │ class C { + 2 │ static public get Foo() { } + · ────── + 3 │ } + ╰──── + × TS(1028): Accessibility modifier already seen. ╭─[typescript/tests/cases/conformance/parser/ecmascript5/MemberFunctionDeclarations/parserMemberFunctionDeclaration1.ts:2:12] 1 │ class C { @@ -22795,6 +23135,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 3 │ } ╰──── + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/parser/ecmascript5/MemberFunctionDeclarations/parserMemberFunctionDeclaration3.ts:2:12] + 1 │ class C { + 2 │ static public Foo() { } + · ────── + 3 │ } + ╰──── + × TS(1031): 'export' modifier cannot appear on class elements of this kind. ╭─[typescript/tests/cases/conformance/parser/ecmascript5/MemberFunctionDeclarations/parserMemberFunctionDeclaration4.ts:2:5] 1 │ class C { @@ -22894,6 +23242,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va 3 │ } ╰──── + × TS(1029): 'public' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration3.ts:2:10] + 1 │ class C { + 2 │ static public Foo; + · ────── + 3 │ } + ╰──── + × TS(1031): 'export' modifier cannot appear on class elements of this kind. ╭─[typescript/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration4.ts:2:3] 1 │ class C { @@ -23084,6 +23440,14 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/statements/Va ╰──── help: Remove the duplicate modifier. + × TS(1029): 'protected' modifier must precede 'static' modifier. + ╭─[typescript/tests/cases/conformance/parser/ecmascript5/Protected/Protected6.ts:2:10] + 1 │ class C { + 2 │ static protected m() { } + · ───────── + 3 │ } + ╰──── + × TS(1028): Accessibility modifier already seen. ╭─[typescript/tests/cases/conformance/parser/ecmascript5/Protected/Protected7.ts:2:13] 1 │ class C {