Move indexer modifier checks to the grammar checker.

This commit is contained in:
Cyrus Najmabadi 2014-11-19 19:04:21 -08:00
parent 7716535511
commit 6b866e719e
3 changed files with 21 additions and 15 deletions

View file

@ -1541,8 +1541,12 @@ module ts {
return finishNode(node);
}
function parseIndexSignatureMember(): SignatureDeclaration {
var node = <SignatureDeclaration>createNode(SyntaxKind.IndexSignature);
function parseIndexSignatureMember(flags: NodeFlags, pos?: number): SignatureDeclaration {
var node = <SignatureDeclaration>createNode(SyntaxKind.IndexSignature, pos);
if (flags) {
node.flags = flags;
}
node.parameters = parseParameterList(SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken);
node.type = parseTypeAnnotation();
parseSemicolon();
@ -1588,7 +1592,7 @@ module ts {
case SyntaxKind.LessThanToken:
return parseSignatureMember(SyntaxKind.CallSignature, SyntaxKind.ColonToken);
case SyntaxKind.OpenBracketToken:
return parseIndexSignatureMember();
return parseIndexSignatureMember(/*flags:*/ 0);
case SyntaxKind.NewKeyword:
if (lookAhead(() => nextToken() === SyntaxKind.OpenParenToken || token === SyntaxKind.LessThanToken)) {
return parseSignatureMember(SyntaxKind.ConstructSignature, SyntaxKind.ColonToken);
@ -3238,12 +3242,7 @@ module ts {
return parsePropertyMemberDeclaration(pos, flags);
}
if (token === SyntaxKind.OpenBracketToken) {
if (flags) {
var start = getTokenPos(pos);
var length = getNodePos() - start;
errorAtPos(start, length, Diagnostics.Modifiers_not_permitted_on_index_signature_members);
}
return parseIndexSignatureMember();
return parseIndexSignatureMember(flags, pos);
}
// 'isClassMemberStart' should have hinted not to attempt parsing.
@ -4137,7 +4136,14 @@ module ts {
}
function visitIndexSignature(node: SignatureDeclaration): void {
checkIndexSignatureParameters(node);
checkIndexSignatureParameters(node) ||
checkForIndexSignatureModifiers(node);
}
function checkForIndexSignatureModifiers(node: SignatureDeclaration): boolean {
if (node.flags & NodeFlags.Modifier) {
return grammarErrorOnFirstToken(node, Diagnostics.Modifiers_not_permitted_on_index_signature_members);
}
}
function checkIndexSignatureParameters(node: SignatureDeclaration): boolean {

View file

@ -1,12 +1,9 @@
tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration10.ts(2,4): error TS1145: Modifiers not permitted on index signature members.
tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration10.ts(2,11): error TS1030: 'static' modifier already seen.
==== tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration10.ts (2 errors) ====
==== tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration10.ts (1 errors) ====
class C {
static static [x: string]: string;
~~~~~~~~~~~~~
!!! error TS1145: Modifiers not permitted on index signature members.
~~~~~~
!!! error TS1030: 'static' modifier already seen.
}

View file

@ -1,9 +1,10 @@
tests/cases/conformance/classes/indexMemberDeclarations/staticIndexers.ts(4,5): error TS1145: Modifiers not permitted on index signature members.
tests/cases/conformance/classes/indexMemberDeclarations/staticIndexers.ts(8,5): error TS1145: Modifiers not permitted on index signature members.
tests/cases/conformance/classes/indexMemberDeclarations/staticIndexers.ts(12,5): error TS1145: Modifiers not permitted on index signature members.
tests/cases/conformance/classes/indexMemberDeclarations/staticIndexers.ts(12,25): error TS2302: Static members cannot reference class type parameters.
==== tests/cases/conformance/classes/indexMemberDeclarations/staticIndexers.ts (3 errors) ====
==== tests/cases/conformance/classes/indexMemberDeclarations/staticIndexers.ts (4 errors) ====
// static indexers not allowed
class C {
@ -22,4 +23,6 @@ tests/cases/conformance/classes/indexMemberDeclarations/staticIndexers.ts(12,5):
static [x: string]: T;
~~~~~~
!!! error TS1145: Modifiers not permitted on index signature members.
~
!!! error TS2302: Static members cannot reference class type parameters.
}