diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e75515cbb56..48b66562fa6 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -12012,35 +12012,22 @@ module ts { } // Report an error for each identifier in QualifiedName // Example: - // foo (x: public.private.bar) // Error at public, private - // foo (x: public.private.package) // Error at public, private, package + // foo (x: public.private.bar) // no Error + // foo (x: public.private.package) // error at package else if (typeName.kind === SyntaxKind.QualifiedName) { - let partOfTypeName = typeName; - - // Keep traverse from right to left in QualifiedName and report an error at each one - // Stop when the next left is not longer a QualifiedName, then it must be the first component - // in QualifiedName and must be an Identifier. + // Report strict mode at the property of memberExpression // Example: - // x1: public.private.package // Error at public, private - while (partOfTypeName && partOfTypeName.kind === SyntaxKind.QualifiedName) { - let name = (partOfTypeName).right; - checkGrammarTypeNameInStrictMode(name); - partOfTypeName = (partOfTypeName).left; - } - - // Report and error at the component in QualifiedName which must be an identifier. - // Example: - // x1: public.private.package // Error at package - checkGrammarTypeNameInStrictMode(partOfTypeName); + // x1: public.private.package // error at package as memberExpression can be IdentifierName + checkGrammarTypeNameInStrictMode((typeName).right); } } // This function will report an error for every identifier in property access expression // whether it violates strict mode reserved words. // Example: - // public.B // error at public - // public.private.A // error at public and private - // public.private.package // error at public and private and package + // public // error at public + // public.private.package // error at package + // public.private.B // no error function checkGrammarHeritageClauseElementInStrictMode(expression: Expression) { // Example: // class C extends public // error at public @@ -12050,21 +12037,10 @@ module ts { else if (expression && expression.kind === SyntaxKind.PropertyAccessExpression) { let propertyAccessExp = expression; - // Keep traverse from right to left in propertyAccessExpression and report an error at each name - // in the PropertyAccessExpression. - // Stop when expression is no longer a propertyAccessExpression, then it must be the first - // expression in PropertyAccessExpression and must be an Identifier. + // Report strict mode at the property of memberExpression // Example: - // public.private.package // error at package, private - while (propertyAccessExp && propertyAccessExp.kind === SyntaxKind.PropertyAccessExpression) { - checkGrammarIdentifierInStrictMode(propertyAccessExp.name); - propertyAccessExp = propertyAccessExp.expression; - } - - // Report an error at the first expression in PropertyAccessExpression - // Example: - // public.private.package // error at public - checkGrammarIdentifierInStrictMode(propertyAccessExp); + // public.private.package // error at package as memberExpression can be IdentifierName + checkGrammarIdentifierInStrictMode((expression).name); } } diff --git a/tests/baselines/reference/strictModeCode1.errors.txt b/tests/baselines/reference/strictModeCode1.errors.txt index f33163a7f03..c32fca7997d 100644 --- a/tests/baselines/reference/strictModeCode1.errors.txt +++ b/tests/baselines/reference/strictModeCode1.errors.txt @@ -14,16 +14,15 @@ tests/cases/compiler/strictModeCode1.ts(14,18): error TS1213: Identifier expecte tests/cases/compiler/strictModeCode1.ts(21,9): error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/compiler/strictModeCode1.ts(21,17): error TS1213: Identifier expected. 'private' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/compiler/strictModeCode1.ts(23,20): error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode. -tests/cases/compiler/strictModeCode1.ts(25,20): error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/compiler/strictModeCode1.ts(25,20): error TS2304: Cannot find name 'public'. -tests/cases/compiler/strictModeCode1.ts(25,27): error TS1213: Identifier expected. 'private' is a reserved word in strict mode. Class definitions are automatically in strict mode. -tests/cases/compiler/strictModeCode1.ts(26,17): error TS1213: Identifier expected. 'package' is a reserved word in strict mode. Class definitions are automatically in strict mode. -tests/cases/compiler/strictModeCode1.ts(26,17): error TS2304: Cannot find name 'package'. +tests/cases/compiler/strictModeCode1.ts(26,21): error TS2304: Cannot find name 'public'. +tests/cases/compiler/strictModeCode1.ts(26,36): error TS1213: Identifier expected. 'implements' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/compiler/strictModeCode1.ts(27,17): error TS1213: Identifier expected. 'package' is a reserved word in strict mode. Class definitions are automatically in strict mode. tests/cases/compiler/strictModeCode1.ts(27,17): error TS2304: Cannot find name 'package'. +tests/cases/compiler/strictModeCode1.ts(28,17): error TS2304: Cannot find name 'package'. -==== tests/cases/compiler/strictModeCode1.ts (23 errors) ==== +==== tests/cases/compiler/strictModeCode1.ts (22 errors) ==== interface public { } class Foo { @@ -82,11 +81,12 @@ tests/cases/compiler/strictModeCode1.ts(27,17): error TS2304: Cannot find name ' class F implements public.private.B { } ~~~~~~ -!!! error TS1213: Identifier expected. 'public' is a reserved word in strict mode. Class definitions are automatically in strict mode. - ~~~~~~ !!! error TS2304: Cannot find name 'public'. - ~~~~~~~ -!!! error TS1213: Identifier expected. 'private' is a reserved word in strict mode. Class definitions are automatically in strict mode. + class F1 implements public.private.implements { } + ~~~~~~ +!!! error TS2304: Cannot find name 'public'. + ~~~~~~~~~~ +!!! error TS1213: Identifier expected. 'implements' is a reserved word in strict mode. Class definitions are automatically in strict mode. class G extends package { } ~~~~~~~ !!! error TS1213: Identifier expected. 'package' is a reserved word in strict mode. Class definitions are automatically in strict mode. @@ -94,6 +94,4 @@ tests/cases/compiler/strictModeCode1.ts(27,17): error TS2304: Cannot find name ' !!! error TS2304: Cannot find name 'package'. class H extends package.A { } ~~~~~~~ -!!! error TS1213: Identifier expected. 'package' is a reserved word in strict mode. Class definitions are automatically in strict mode. - ~~~~~~~ !!! error TS2304: Cannot find name 'package'. \ No newline at end of file diff --git a/tests/baselines/reference/strictModeCode1.js b/tests/baselines/reference/strictModeCode1.js index 88ff24d1b36..1a7b93417c6 100644 --- a/tests/baselines/reference/strictModeCode1.js +++ b/tests/baselines/reference/strictModeCode1.js @@ -24,6 +24,7 @@ class D{ } class E implements public { } class F implements public.private.B { } +class F1 implements public.private.implements { } class G extends package { } class H extends package.A { } @@ -67,6 +68,11 @@ var F = (function () { } return F; })(); +var F1 = (function () { + function F1() { + } + return F1; +})(); var G = (function (_super) { __extends(G, _super); function G() { diff --git a/tests/baselines/reference/strictModeCode2.errors.txt b/tests/baselines/reference/strictModeCode2.errors.txt index 3016f02af7a..e6c338a2def 100644 --- a/tests/baselines/reference/strictModeCode2.errors.txt +++ b/tests/baselines/reference/strictModeCode2.errors.txt @@ -18,25 +18,16 @@ tests/cases/compiler/strictModeCode2.ts(13,20): error TS1212: Identifier expecte tests/cases/compiler/strictModeCode2.ts(13,28): error TS1212: Identifier expected. 'package' is a reserved word in strict mode tests/cases/compiler/strictModeCode2.ts(15,25): error TS9003: 'class' expressions are not currently supported. tests/cases/compiler/strictModeCode2.ts(17,9): error TS2300: Duplicate identifier 'b'. -tests/cases/compiler/strictModeCode2.ts(17,12): error TS1215: Type expected. 'public' is a reserved word in strict mode tests/cases/compiler/strictModeCode2.ts(17,12): error TS2304: Cannot find name 'public'. -tests/cases/compiler/strictModeCode2.ts(19,21): error TS1215: Type expected. 'private' is a reserved word in strict mode tests/cases/compiler/strictModeCode2.ts(19,21): error TS2304: Cannot find name 'private'. -tests/cases/compiler/strictModeCode2.ts(20,22): error TS1215: Type expected. 'private' is a reserved word in strict mode tests/cases/compiler/strictModeCode2.ts(20,22): error TS2304: Cannot find name 'private'. -tests/cases/compiler/strictModeCode2.ts(20,30): error TS1215: Type expected. 'package' is a reserved word in strict mode -tests/cases/compiler/strictModeCode2.ts(21,22): error TS1215: Type expected. 'private' is a reserved word in strict mode tests/cases/compiler/strictModeCode2.ts(21,22): error TS2304: Cannot find name 'private'. -tests/cases/compiler/strictModeCode2.ts(21,30): error TS1215: Type expected. 'package' is a reserved word in strict mode tests/cases/compiler/strictModeCode2.ts(21,38): error TS1215: Type expected. 'protected' is a reserved word in strict mode tests/cases/compiler/strictModeCode2.ts(22,9): error TS2300: Duplicate identifier 'b'. -tests/cases/compiler/strictModeCode2.ts(22,12): error TS1215: Type expected. 'interface' is a reserved word in strict mode tests/cases/compiler/strictModeCode2.ts(22,12): error TS2304: Cannot find name 'interface'. -tests/cases/compiler/strictModeCode2.ts(22,22): error TS1215: Type expected. 'package' is a reserved word in strict mode -tests/cases/compiler/strictModeCode2.ts(22,30): error TS1215: Type expected. 'implements' is a reserved word in strict mode -==== tests/cases/compiler/strictModeCode2.ts (36 errors) ==== +==== tests/cases/compiler/strictModeCode2.ts (27 errors) ==== let let = 10; function foo() { @@ -95,42 +86,24 @@ tests/cases/compiler/strictModeCode2.ts(22,30): error TS1215: Type expected. 'im ~ !!! error TS2300: Duplicate identifier 'b'. ~~~~~~ -!!! error TS1215: Type expected. 'public' is a reserved word in strict mode - ~~~~~~ !!! error TS2304: Cannot find name 'public'. function foo(x: private.x) { } ~~~~~~~ -!!! error TS1215: Type expected. 'private' is a reserved word in strict mode - ~~~~~~~ !!! error TS2304: Cannot find name 'private'. function foo1(x: private.package.x) { } ~~~~~~~ -!!! error TS1215: Type expected. 'private' is a reserved word in strict mode - ~~~~~~~ !!! error TS2304: Cannot find name 'private'. - ~~~~~~~ -!!! error TS1215: Type expected. 'package' is a reserved word in strict mode function foo2(x: private.package.protected) { } ~~~~~~~ -!!! error TS1215: Type expected. 'private' is a reserved word in strict mode - ~~~~~~~ !!! error TS2304: Cannot find name 'private'. - ~~~~~~~ -!!! error TS1215: Type expected. 'package' is a reserved word in strict mode ~~~~~~~~~ !!! error TS1215: Type expected. 'protected' is a reserved word in strict mode let b: interface.package.implements.B; ~ !!! error TS2300: Duplicate identifier 'b'. ~~~~~~~~~ -!!! error TS1215: Type expected. 'interface' is a reserved word in strict mode - ~~~~~~~~~ !!! error TS2304: Cannot find name 'interface'. - ~~~~~~~ -!!! error TS1215: Type expected. 'package' is a reserved word in strict mode - ~~~~~~~~~~ -!!! error TS1215: Type expected. 'implements' is a reserved word in strict mode } \ No newline at end of file diff --git a/tests/cases/compiler/strictModeCode1.ts b/tests/cases/compiler/strictModeCode1.ts index 0a7426d35c5..9035ca2f4ff 100644 --- a/tests/cases/compiler/strictModeCode1.ts +++ b/tests/cases/compiler/strictModeCode1.ts @@ -23,5 +23,6 @@ class D{ } class E implements public { } class F implements public.private.B { } +class F1 implements public.private.implements { } class G extends package { } class H extends package.A { } \ No newline at end of file