Skip to content

Commit ab53fbe

Browse files
committed
Allow >> in type generics syntax
We support this in a similar way to the way parsing regexps work. When we look for the `>` we let the scanner treat `>>` as `>` and decrease the position of the scanner so that next token it sees starts after the first `>`. Fixes google#1467
1 parent c284c7a commit ab53fbe

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

src/syntax/Parser.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3760,7 +3760,12 @@ export class Parser {
37603760
this.eat_(COMMA);
37613761
args.push(this.parseType_());
37623762
}
3763-
this.eat_(CLOSE_ANGLE);
3763+
3764+
var token = this.nextCloseAngle_();
3765+
if (token.type !== CLOSE_ANGLE) {
3766+
return this.parseUnexpectedToken_(token.type);
3767+
}
3768+
37643769
return new TypeArguments(this.getTreeLocation_(start), args);
37653770
}
37663771

@@ -4104,6 +4109,10 @@ export class Parser {
41044109
return this.scanner_.nextTemplateLiteralToken();
41054110
}
41064111

4112+
nextCloseAngle_() {
4113+
return this.scanner_.nextCloseAngle();
4114+
}
4115+
41074116
isAtEnd() {
41084117
return this.scanner_.isAtEnd();
41094118
}

src/syntax/Scanner.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,25 @@ export class Scanner {
256256
return t;
257257
}
258258

259+
/**
260+
* Called for the close angle for type generics. This allows type expressions
261+
* like `Array<Array<number>>` to be parsed as `Array<Array<number> >`.
262+
*/
263+
nextCloseAngle() {
264+
switch (token.type) {
265+
case GREATER_EQUAL:
266+
case RIGHT_SHIFT:
267+
case RIGHT_SHIFT_EQUAL:
268+
case UNSIGNED_RIGHT_SHIFT:
269+
case UNSIGNED_RIGHT_SHIFT_EQUAL:
270+
this.index -= token.type.length - 1;
271+
lastToken = createToken(CLOSE_ANGLE, index);
272+
token = scanToken();
273+
return lastToken;
274+
}
275+
return nextToken();
276+
}
277+
259278
/** @return {Token} */
260279
nextToken() {
261280
return nextToken();

test/feature/TypeAssertions/GenericArray.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ assert.throw(() => {
99
var a: Array<number> = ['s'];
1010
});
1111

12-
// TODO(arv): Issue #1467
13-
// var e: Array<Array<number> > = [[]];
14-
// var f: Array<Array<number> > = [[3, 4], [5]];
12+
var e: Array<Array<number> > = [[]];
13+
var e: Array<Array<number>> = [[]];
14+
var f: Array<Array<number>>= [[3, 4], [5]];
15+
var g: Array<Array<Array<number>>> = [[[]]];
16+
var h: Array<Array<Array<number>>>= [[[]]];

0 commit comments

Comments
 (0)