From 12f8bfb687f766a1e2fc4524cb63b738df48a749 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 10 Dec 2014 23:33:30 -0800 Subject: [PATCH] Unify accessor declaration parsing. --- src/compiler/parser.ts | 32 +++++++++++++------ ...jectLiteralMemberWithModifiers2.errors.txt | 7 ++-- .../reference/parserAccessors10.errors.txt | 5 ++- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 5729e29c0e5..f9ffba74d0c 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -3438,14 +3438,24 @@ module ts { return finishNode(node); } + function tryParseAccessorDeclaration(fullStart: number, modifiers: ModifiersArray): AccessorDeclaration { + if (parseContextualModifier(SyntaxKind.GetKeyword)) { + return parseAccessorDeclaration(SyntaxKind.GetAccessor, fullStart, modifiers); + } + else if (parseContextualModifier(SyntaxKind.SetKeyword)) { + return parseAccessorDeclaration(SyntaxKind.SetAccessor, fullStart, modifiers); + } + + return undefined; + } + function parseObjectLiteralElement(): ObjectLiteralElement { var fullStart = scanner.getStartPos(); - var initialToken = token; - var modifiers = parseModifiers(); - if (parseContextualModifier(SyntaxKind.GetKeyword) || parseContextualModifier(SyntaxKind.SetKeyword)) { - var kind = initialToken === SyntaxKind.GetKeyword ? SyntaxKind.GetAccessor : SyntaxKind.SetAccessor; - return parseAccessorDeclaration(kind, fullStart, modifiers); + + var accessor = tryParseAccessorDeclaration(fullStart, modifiers); + if (accessor) { + return accessor; } var asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken); @@ -4216,18 +4226,20 @@ module ts { function parseClassElement(): ClassElement { var fullStart = getNodePos(); var modifiers = parseModifiers(); - if (parseContextualModifier(SyntaxKind.GetKeyword)) { - return parseAccessorDeclaration(SyntaxKind.GetAccessor, fullStart, modifiers); - } - if (parseContextualModifier(SyntaxKind.SetKeyword)) { - return parseAccessorDeclaration(SyntaxKind.SetAccessor, fullStart, modifiers); + + var accessor = tryParseAccessorDeclaration(fullStart, modifiers); + if (accessor) { + return accessor; } + if (token === SyntaxKind.ConstructorKeyword) { return parseConstructorDeclaration(fullStart, modifiers); } + if (isIndexSignature()) { return parseIndexSignatureDeclaration(modifiers); } + // It is very important that we check this *after* checking indexers because // the [ token can start an index signature or a computed property name if (isIdentifierOrKeyword() || diff --git a/tests/baselines/reference/objectLiteralMemberWithModifiers2.errors.txt b/tests/baselines/reference/objectLiteralMemberWithModifiers2.errors.txt index 9b34ea61733..9fe5365f7da 100644 --- a/tests/baselines/reference/objectLiteralMemberWithModifiers2.errors.txt +++ b/tests/baselines/reference/objectLiteralMemberWithModifiers2.errors.txt @@ -1,7 +1,10 @@ tests/cases/compiler/objectLiteralMemberWithModifiers2.ts(1,11): error TS1184: Modifiers cannot appear here. +tests/cases/compiler/objectLiteralMemberWithModifiers2.ts(1,22): error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. -==== tests/cases/compiler/objectLiteralMemberWithModifiers2.ts (1 errors) ==== +==== tests/cases/compiler/objectLiteralMemberWithModifiers2.ts (2 errors) ==== var v = { public get foo() { } } ~~~~~~ -!!! error TS1184: Modifiers cannot appear here. \ No newline at end of file +!!! error TS1184: Modifiers cannot appear here. + ~~~ +!!! error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. \ No newline at end of file diff --git a/tests/baselines/reference/parserAccessors10.errors.txt b/tests/baselines/reference/parserAccessors10.errors.txt index 3c4981ddc45..ac552b55c6a 100644 --- a/tests/baselines/reference/parserAccessors10.errors.txt +++ b/tests/baselines/reference/parserAccessors10.errors.txt @@ -1,9 +1,12 @@ tests/cases/conformance/parser/ecmascript5/Accessors/parserAccessors10.ts(2,3): error TS1184: Modifiers cannot appear here. +tests/cases/conformance/parser/ecmascript5/Accessors/parserAccessors10.ts(2,14): error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. -==== tests/cases/conformance/parser/ecmascript5/Accessors/parserAccessors10.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Accessors/parserAccessors10.ts (2 errors) ==== var v = { public get foo() { } ~~~~~~ !!! error TS1184: Modifiers cannot appear here. + ~~~ +!!! error TS2378: A 'get' accessor must return a value or consist of a single 'throw' statement. }; \ No newline at end of file