Move octal checks to the grammar checker.

This commit is contained in:
Cyrus Najmabadi 2014-11-19 16:32:27 -08:00
parent 385fdd5eb2
commit 75977add21
5 changed files with 71 additions and 18 deletions

View file

@ -1403,16 +1403,11 @@ module ts {
// never get a token like this. Instead, we would get 00 and 9 as two separate tokens.
// We also do not need to check for negatives because any prefix operator would be part of a
// parent unary expression.
if (node.kind === SyntaxKind.NumericLiteral
&& sourceText.charCodeAt(tokenPos) === CharacterCodes._0
&& isOctalDigit(sourceText.charCodeAt(tokenPos + 1))) {
if (node.kind === SyntaxKind.NumericLiteral &&
sourceText.charCodeAt(tokenPos) === CharacterCodes._0 &&
isOctalDigit(sourceText.charCodeAt(tokenPos + 1))) {
if (isInStrictMode) {
grammarErrorOnNode(node, Diagnostics.Octal_literals_are_not_allowed_in_strict_mode);
}
else if (languageVersion >= ScriptTarget.ES5) {
grammarErrorOnNode(node, Diagnostics.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher);
}
node.flags |= NodeFlags.OctalLiteral;
}
return node;
@ -3764,6 +3759,7 @@ module ts {
case SyntaxKind.ModuleDeclaration: return visitModuleDeclaration(<ModuleDeclaration>node);
case SyntaxKind.NewExpression: return visitNewExpression(<NewExpression>node);
case SyntaxKind.ObjectLiteral: return visitObjectLiteral(<ObjectLiteral>node);
case SyntaxKind.NumericLiteral: return visitNumericLiteral(<LiteralExpression>node);
case SyntaxKind.Parameter: return visitParameter(<ParameterDeclaration>node);
case SyntaxKind.PostfixOperator: return visitPostfixOperator(<UnaryExpression>node);
case SyntaxKind.PrefixOperator: return visitPrefixOperator(<UnaryExpression>node);
@ -4262,6 +4258,17 @@ module ts {
});
}
function visitNumericLiteral(node: LiteralExpression): void {
if (node.flags & NodeFlags.OctalLiteral) {
if (node.flags & NodeFlags.ParsedInStrictMode) {
grammarErrorOnNode(node, Diagnostics.Octal_literals_are_not_allowed_in_strict_mode);
}
else if (languageVersion >= ScriptTarget.ES5) {
grammarErrorOnNode(node, Diagnostics.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher);
}
}
}
function visitParameter(node: ParameterDeclaration): void {
checkParameterName(node);
}

View file

@ -273,6 +273,7 @@ module ts {
// Set if this node was parsed in strict mode. Used for grammar error checks, as well as
// checking if the node can be reused in incremental settings.
ParsedInStrictMode = 0x00002000,
OctalLiteral = 0x00004000,
Modifier = Export | Ambient | Public | Private | Protected | Static,
AccessibilityModifier = Public | Private | Protected,

View file

@ -1,5 +1,22 @@
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(17,19): error TS1085: Octal literals are not available when targeting ECMAScript 5 and higher.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(23,22): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(24,23): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(25,22): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(26,25): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(27,23): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(28,22): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(29,24): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(30,24): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(31,24): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(32,25): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(33,25): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(34,23): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(35,23): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(36,23): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(37,23): error TS1085: Octal literals are not available when targeting ECMAScript 5 and higher.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(38,27): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(39,26): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(40,46): error TS1119: An object literal cannot have property and accessor with the same name.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(3,12): error TS2300: Duplicate identifier 'a'.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(3,18): error TS2300: Duplicate identifier 'a'.
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(4,12): error TS2300: Duplicate identifier 'a'.
@ -79,7 +96,7 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(45,12)
tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(45,51): error TS2380: 'get' and 'set' accessor must have the same type.
==== tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts (79 errors) ====
==== tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts (96 errors) ====
// Multiple properties with the same name
var e1 = { a: 0, a: 0 };
@ -177,71 +194,99 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(45,51)
// Accessor and property with the same name
var f1 = { a: 0, get a() { return 0; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier 'a'.
~
!!! error TS2300: Duplicate identifier 'a'.
var f2 = { a: '', get a() { return ''; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier 'a'.
~
!!! error TS2300: Duplicate identifier 'a'.
var f3 = { a: 0, get a() { return ''; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier 'a'.
~
!!! error TS2300: Duplicate identifier 'a'.
var f4 = { a: true, get a() { return false; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier 'a'.
~
!!! error TS2300: Duplicate identifier 'a'.
var f5 = { a: {}, get a() { return {}; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier 'a'.
~
!!! error TS2300: Duplicate identifier 'a'.
var f6 = { a: 0, get 'a'() { return 0; } };
~~~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier 'a'.
~~~
!!! error TS2300: Duplicate identifier ''a''.
var f7 = { 'a': 0, get a() { return 0; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~~~
!!! error TS2300: Duplicate identifier ''a''.
~
!!! error TS2300: Duplicate identifier 'a'.
var f8 = { 'a': 0, get "a"() { return 0; } };
~~~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~~~
!!! error TS2300: Duplicate identifier ''a''.
~~~
!!! error TS2300: Duplicate identifier '"a"'.
var f9 = { 'a': 0, get 'a'() { return 0; } };
~~~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~~~
!!! error TS2300: Duplicate identifier ''a''.
~~~
!!! error TS2300: Duplicate identifier ''a''.
var f10 = { "a": 0, get 'a'() { return 0; } };
~~~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~~~
!!! error TS2300: Duplicate identifier '"a"'.
~~~
!!! error TS2300: Duplicate identifier ''a''.
var f11 = { 1.0: 0, get '1'() { return 0; } };
~~~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~~~
!!! error TS2300: Duplicate identifier '1.0'.
~~~
!!! error TS2300: Duplicate identifier ''1''.
var f12 = { 0: 0, get 0() { return 0; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier '0'.
~
!!! error TS2300: Duplicate identifier '0'.
var f13 = { 0: 0, get 0() { return 0; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier '0'.
~
!!! error TS2300: Duplicate identifier '0'.
var f14 = { 0: 0, get 0x0() { return 0; } };
~~~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier '0'.
~~~
@ -254,16 +299,22 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(45,51)
~~~
!!! error TS2300: Duplicate identifier '000'.
var f15 = { "100": 0, get 1e2() { return 0; } };
~~~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~~~~~
!!! error TS2300: Duplicate identifier '"100"'.
~~~
!!! error TS2300: Duplicate identifier '1e2'.
var f16 = { 0x20: 0, get 3.2e1() { return 0; } };
~~~~~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~~~~
!!! error TS2300: Duplicate identifier '0x20'.
~~~~~
!!! error TS2300: Duplicate identifier '3.2e1'.
var f17 = { a: 0, get b() { return 1; }, get a() { return 0; } };
~
!!! error TS1119: An object literal cannot have property and accessor with the same name.
~
!!! error TS2300: Duplicate identifier 'a'.
~

View file

@ -1,10 +1,7 @@
tests/cases/conformance/scanner/ecmascript5/scannerNumericLiteral3.ts(1,1): error TS1085: Octal literals are not available when targeting ECMAScript 5 and higher.
tests/cases/conformance/scanner/ecmascript5/scannerNumericLiteral3.ts(1,3): error TS1005: ';' expected.
==== tests/cases/conformance/scanner/ecmascript5/scannerNumericLiteral3.ts (2 errors) ====
==== tests/cases/conformance/scanner/ecmascript5/scannerNumericLiteral3.ts (1 errors) ====
01.0
~~
!!! error TS1085: Octal literals are not available when targeting ECMAScript 5 and higher.
~~
!!! error TS1005: ';' expected.

View file

@ -1,10 +1,7 @@
tests/cases/conformance/scanner/ecmascript5/scannerNumericLiteral9.ts(1,1): error TS1085: Octal literals are not available when targeting ECMAScript 5 and higher.
tests/cases/conformance/scanner/ecmascript5/scannerNumericLiteral9.ts(1,3): error TS1005: ';' expected.
==== tests/cases/conformance/scanner/ecmascript5/scannerNumericLiteral9.ts (2 errors) ====
==== tests/cases/conformance/scanner/ecmascript5/scannerNumericLiteral9.ts (1 errors) ====
009
~~
!!! error TS1085: Octal literals are not available when targeting ECMAScript 5 and higher.
~
!!! error TS1005: ';' expected.