Property variance type annotations for Flow plugin (#161)

* Property variance type annotations for Flow plugin

Non-method properties and indexers of object types, declare class, and
interfaces can be "positive" or "negative." Class fields, but again not
methods, can also have variance.

This PR generalizes the variance annotations for type parameters into a
new node type, and reuses that node for those properties.

The code for object types is reused for interfaces and declare classes.
The changes there are straightfoward.

The code for class fields is reused for object literals, which do not
support variance annotations (currently). This code is a bit sketchy,
because we always parse variance annotations in the `parsePropertyName`
extension, then error in a the subsequent parse phase for object
literals (`parseObjPropValue`) or class methods (`parseClassMethod`).

* Remove bogus unreachable code, clarify variance parsing conditional

* Don't use a new node type for variance annotations

Adding a new node type, specifically changing the TypeParameter node's
variance property to be node-valued, is a breaking change. We might
choose to make this breaking change in a later version.

* s/start/variancePos
This commit is contained in:
Sam Goldman 2016-10-14 14:13:27 -07:00 committed by Daniel Tschinder
parent b5877f04b1
commit 26809e8ce7
63 changed files with 1228 additions and 65 deletions

View File

@ -205,15 +205,7 @@ pp.flowParseTypeAlias = function (node) {
pp.flowParseTypeParameter = function () {
let node = this.startNode();
let variance;
if (this.match(tt.plusMin)) {
if (this.state.value === "+") {
variance = "plus";
} else if (this.state.value === "-") {
variance = "minus";
}
this.eat(tt.plusMin);
}
let variance = this.flowParseVariance();
let ident = this.flowParseTypeAnnotatableIdentifier(false, false);
node.name = ident.name;
@ -278,7 +270,7 @@ pp.flowParseObjectPropertyKey = function () {
return (this.match(tt.num) || this.match(tt.string)) ? this.parseExprAtom() : this.parseIdentifier(true);
};
pp.flowParseObjectTypeIndexer = function (node, isStatic) {
pp.flowParseObjectTypeIndexer = function (node, isStatic, variance) {
node.static = isStatic;
this.expect(tt.bracketL);
@ -286,6 +278,7 @@ pp.flowParseObjectTypeIndexer = function (node, isStatic) {
node.key = this.flowParseTypeInitialiser();
this.expect(tt.bracketR);
node.value = this.flowParseTypeInitialiser();
node.variance = variance;
this.flowObjectTypeSemicolon();
return this.finishNode(node, "ObjectTypeIndexer");
@ -371,9 +364,15 @@ pp.flowParseObjectType = function (allowStatic, allowExact) {
isStatic = true;
}
let variancePos = this.state.start;
let variance = this.flowParseVariance();
if (this.match(tt.bracketL)) {
nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic));
nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic, variance));
} else if (this.match(tt.parenL) || this.isRelational("<")) {
if (variance) {
this.unexpected(variancePos);
}
nodeStart.callProperties.push(this.flowParseObjectTypeCallProperty(node, allowStatic));
} else {
if (isStatic && this.match(tt.colon)) {
@ -383,6 +382,9 @@ pp.flowParseObjectType = function (allowStatic, allowExact) {
}
if (this.isRelational("<") || this.match(tt.parenL)) {
// This is a method property
if (variance) {
this.unexpected(variancePos);
}
nodeStart.properties.push(this.flowParseObjectTypeMethod(startPos, startLoc, isStatic, propertyKey));
} else {
if (this.eat(tt.question)) {
@ -392,6 +394,7 @@ pp.flowParseObjectType = function (allowStatic, allowExact) {
node.value = this.flowParseTypeInitialiser();
node.optional = optional;
node.static = isStatic;
node.variance = variance;
this.flowObjectTypeSemicolon();
nodeStart.properties.push(this.finishNode(node, "ObjectTypeProperty"));
}
@ -736,6 +739,19 @@ pp.typeCastToParameter = function (node) {
);
};
pp.flowParseVariance = function() {
let variance = null;
if (this.match(tt.plusMin)) {
if (this.state.value === "+") {
variance = "plus";
} else if (this.state.value === "-") {
variance = "minus";
}
this.next();
}
return variance;
};
export default function (instance) {
// plain function return types: function name(): string {}
instance.extend("parseFunctionBody", function (inner) {
@ -990,6 +1006,7 @@ export default function (instance) {
// parse class property type annotations
instance.extend("parseClassProperty", function (inner) {
return function (node) {
delete node.variancePos;
if (this.match(tt.colon)) {
node.typeAnnotation = this.flowParseTypeAnnotation();
}
@ -1007,6 +1024,11 @@ export default function (instance) {
// parse type parameters for class methods
instance.extend("parseClassMethod", function () {
return function (classBody, method, isGenerator, isAsync) {
if (method.variance) {
this.unexpected(method.variancePos);
}
delete method.variance;
delete method.variancePos;
if (this.isRelational("<")) {
method.typeParameters = this.flowParseTypeParameterDeclaration();
}
@ -1039,9 +1061,26 @@ export default function (instance) {
};
});
instance.extend("parsePropertyName", function (inner) {
return function (node) {
let variancePos = this.state.start;
let variance = this.flowParseVariance();
let key = inner.call(this, node);
node.variance = variance;
node.variancePos = variancePos;
return key;
};
});
// parse type parameters for object method shorthand
instance.extend("parseObjPropValue", function (inner) {
return function (prop) {
if (prop.variance) {
this.unexpected(prop.variancePos);
}
delete prop.variance;
delete prop.variancePos;
let typeParameters;
// method shorthand

View File

@ -292,7 +292,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -188,7 +188,8 @@
}
},
"optional": false,
"static": true
"static": true,
"variance": null
}
],
"indexers": []

View File

@ -137,7 +137,8 @@
"column": 51
}
}
}
},
"variance": null
}
]
}

View File

@ -231,7 +231,8 @@
},
"name": "U"
}
}
},
"variance": null
}
]
}

View File

@ -122,7 +122,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []
@ -271,7 +272,8 @@
"name": "T"
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -125,7 +125,8 @@
}
},
"optional": false,
"static": false
"static": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -174,7 +175,8 @@
}
},
"optional": false,
"static": true
"static": true,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -223,7 +225,8 @@
}
},
"optional": false,
"static": false
"static": false,
"variance": null
}
],
"indexers": [],

View File

@ -235,7 +235,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -333,4 +333,4 @@
],
"directives": []
}
}
}

View File

@ -139,7 +139,8 @@
},
"typeParameters": null
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -121,7 +121,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": [
@ -184,7 +185,8 @@
"column": 46
}
}
}
},
"variance": null
}
]
}

View File

@ -140,7 +140,8 @@
"raw": "\"A\""
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []
@ -211,7 +212,8 @@
"raw": "\"B\""
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -149,7 +149,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -197,7 +198,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": [],
@ -457,7 +459,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -505,7 +508,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": [],
@ -912,7 +916,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -960,13 +965,15 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": [],
"exact": true
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -1014,7 +1021,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": [],
@ -1424,7 +1432,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -1472,13 +1481,15 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": [],
"exact": false
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -1526,7 +1537,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": [],

View File

@ -0,0 +1 @@
type X = {+p:T}

View File

@ -0,0 +1,155 @@
{
"type": "File",
"start": 0,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 15
}
},
"program": {
"type": "Program",
"start": 0,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 15
}
},
"sourceType": "module",
"body": [
{
"type": "TypeAlias",
"start": 0,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 15
}
},
"id": {
"type": "Identifier",
"start": 5,
"end": 6,
"loc": {
"start": {
"line": 1,
"column": 5
},
"end": {
"line": 1,
"column": 6
},
"identifierName": "X"
},
"name": "X"
},
"typeParameters": null,
"right": {
"type": "ObjectTypeAnnotation",
"start": 9,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 15
}
},
"callProperties": [],
"properties": [
{
"type": "ObjectTypeProperty",
"start": 10,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 14
}
},
"key": {
"type": "Identifier",
"start": 11,
"end": 12,
"loc": {
"start": {
"line": 1,
"column": 11
},
"end": {
"line": 1,
"column": 12
},
"identifierName": "p"
},
"name": "p"
},
"value": {
"type": "GenericTypeAnnotation",
"start": 13,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 13
},
"end": {
"line": 1,
"column": 14
}
},
"typeParameters": null,
"id": {
"type": "Identifier",
"start": 13,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 13
},
"end": {
"line": 1,
"column": 14
},
"identifierName": "T"
},
"name": "T"
}
},
"optional": false,
"static": false,
"variance": "plus"
}
],
"indexers": [],
"exact": false
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
type X = {-p:T}

View File

@ -0,0 +1,155 @@
{
"type": "File",
"start": 0,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 15
}
},
"program": {
"type": "Program",
"start": 0,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 15
}
},
"sourceType": "module",
"body": [
{
"type": "TypeAlias",
"start": 0,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 15
}
},
"id": {
"type": "Identifier",
"start": 5,
"end": 6,
"loc": {
"start": {
"line": 1,
"column": 5
},
"end": {
"line": 1,
"column": 6
},
"identifierName": "X"
},
"name": "X"
},
"typeParameters": null,
"right": {
"type": "ObjectTypeAnnotation",
"start": 9,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 15
}
},
"callProperties": [],
"properties": [
{
"type": "ObjectTypeProperty",
"start": 10,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 14
}
},
"key": {
"type": "Identifier",
"start": 11,
"end": 12,
"loc": {
"start": {
"line": 1,
"column": 11
},
"end": {
"line": 1,
"column": 12
},
"identifierName": "p"
},
"name": "p"
},
"value": {
"type": "GenericTypeAnnotation",
"start": 13,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 13
},
"end": {
"line": 1,
"column": 14
}
},
"typeParameters": null,
"id": {
"type": "Identifier",
"start": 13,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 13
},
"end": {
"line": 1,
"column": 14
},
"identifierName": "T"
},
"name": "T"
}
},
"optional": false,
"static": false,
"variance": "minus"
}
],
"indexers": [],
"exact": false
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
type X = {+m(): T}

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:10)"
}

View File

@ -0,0 +1,2 @@
type X = {-m(): T}

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:10)"
}

View File

@ -0,0 +1 @@
type X = {+[k:K]:V}

View File

@ -0,0 +1,187 @@
{
"type": "File",
"start": 0,
"end": 19,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 19
}
},
"program": {
"type": "Program",
"start": 0,
"end": 19,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 19
}
},
"sourceType": "module",
"body": [
{
"type": "TypeAlias",
"start": 0,
"end": 19,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 19
}
},
"id": {
"type": "Identifier",
"start": 5,
"end": 6,
"loc": {
"start": {
"line": 1,
"column": 5
},
"end": {
"line": 1,
"column": 6
},
"identifierName": "X"
},
"name": "X"
},
"typeParameters": null,
"right": {
"type": "ObjectTypeAnnotation",
"start": 9,
"end": 19,
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 19
}
},
"callProperties": [],
"properties": [],
"indexers": [
{
"type": "ObjectTypeIndexer",
"start": 10,
"end": 18,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 18
}
},
"static": false,
"id": {
"type": "Identifier",
"start": 12,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
},
"identifierName": "k"
},
"name": "k"
},
"key": {
"type": "GenericTypeAnnotation",
"start": 14,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
},
"typeParameters": null,
"id": {
"type": "Identifier",
"start": 14,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
},
"identifierName": "K"
},
"name": "K"
}
},
"value": {
"type": "GenericTypeAnnotation",
"start": 17,
"end": 18,
"loc": {
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 18
}
},
"typeParameters": null,
"id": {
"type": "Identifier",
"start": 17,
"end": 18,
"loc": {
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 18
},
"identifierName": "V"
},
"name": "V"
}
},
"variance": "plus"
}
],
"exact": false
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
type X = {-[k:K]:V}

View File

@ -0,0 +1,187 @@
{
"type": "File",
"start": 0,
"end": 19,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 19
}
},
"program": {
"type": "Program",
"start": 0,
"end": 19,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 19
}
},
"sourceType": "module",
"body": [
{
"type": "TypeAlias",
"start": 0,
"end": 19,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 19
}
},
"id": {
"type": "Identifier",
"start": 5,
"end": 6,
"loc": {
"start": {
"line": 1,
"column": 5
},
"end": {
"line": 1,
"column": 6
},
"identifierName": "X"
},
"name": "X"
},
"typeParameters": null,
"right": {
"type": "ObjectTypeAnnotation",
"start": 9,
"end": 19,
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 19
}
},
"callProperties": [],
"properties": [],
"indexers": [
{
"type": "ObjectTypeIndexer",
"start": 10,
"end": 18,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 18
}
},
"static": false,
"id": {
"type": "Identifier",
"start": 12,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
},
"identifierName": "k"
},
"name": "k"
},
"key": {
"type": "GenericTypeAnnotation",
"start": 14,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
},
"typeParameters": null,
"id": {
"type": "Identifier",
"start": 14,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
},
"identifierName": "K"
},
"name": "K"
}
},
"value": {
"type": "GenericTypeAnnotation",
"start": 17,
"end": 18,
"loc": {
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 18
}
},
"typeParameters": null,
"id": {
"type": "Identifier",
"start": 17,
"end": 18,
"loc": {
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 18
},
"identifierName": "V"
},
"name": "V"
}
},
"variance": "minus"
}
],
"exact": false
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
type X = {+():T}

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:10)"
}

View File

@ -0,0 +1 @@
type X = {-():T}

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:10)"
}

View File

@ -0,0 +1 @@
class A {+p:T}

View File

@ -0,0 +1,168 @@
{
"type": "File",
"start": 0,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 14
}
},
"program": {
"type": "Program",
"start": 0,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 14
}
},
"sourceType": "module",
"body": [
{
"type": "ClassDeclaration",
"start": 0,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 14
}
},
"id": {
"type": "Identifier",
"start": 6,
"end": 7,
"loc": {
"start": {
"line": 1,
"column": 6
},
"end": {
"line": 1,
"column": 7
},
"identifierName": "A"
},
"name": "A"
},
"superClass": null,
"body": {
"type": "ClassBody",
"start": 8,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 8
},
"end": {
"line": 1,
"column": 14
}
},
"body": [
{
"type": "ClassProperty",
"start": 9,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 13
}
},
"computed": false,
"key": {
"type": "Identifier",
"start": 10,
"end": 11,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 11
},
"identifierName": "p"
},
"name": "p"
},
"variance": "plus",
"static": false,
"typeAnnotation": {
"type": "TypeAnnotation",
"start": 11,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 11
},
"end": {
"line": 1,
"column": 13
}
},
"typeAnnotation": {
"type": "GenericTypeAnnotation",
"start": 12,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
}
},
"typeParameters": null,
"id": {
"type": "Identifier",
"start": 12,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
},
"identifierName": "T"
},
"name": "T"
}
}
},
"value": null
}
]
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
class A {-p:T}

View File

@ -0,0 +1,168 @@
{
"type": "File",
"start": 0,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 14
}
},
"program": {
"type": "Program",
"start": 0,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 14
}
},
"sourceType": "module",
"body": [
{
"type": "ClassDeclaration",
"start": 0,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 14
}
},
"id": {
"type": "Identifier",
"start": 6,
"end": 7,
"loc": {
"start": {
"line": 1,
"column": 6
},
"end": {
"line": 1,
"column": 7
},
"identifierName": "A"
},
"name": "A"
},
"superClass": null,
"body": {
"type": "ClassBody",
"start": 8,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 8
},
"end": {
"line": 1,
"column": 14
}
},
"body": [
{
"type": "ClassProperty",
"start": 9,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 13
}
},
"computed": false,
"key": {
"type": "Identifier",
"start": 10,
"end": 11,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 11
},
"identifierName": "p"
},
"name": "p"
},
"variance": "minus",
"static": false,
"typeAnnotation": {
"type": "TypeAnnotation",
"start": 11,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 11
},
"end": {
"line": 1,
"column": 13
}
},
"typeAnnotation": {
"type": "GenericTypeAnnotation",
"start": 12,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
}
},
"typeParameters": null,
"id": {
"type": "Identifier",
"start": 12,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
},
"identifierName": "T"
},
"name": "T"
}
}
},
"value": null
}
]
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
class A {+m():T}

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:9)"
}

View File

@ -0,0 +1 @@
class A {-m():T}

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:9)"
}

View File

@ -0,0 +1 @@
({+p:e})

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:2)"
}

View File

@ -0,0 +1 @@
({-p:e})

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:2)"
}

View File

@ -0,0 +1 @@
class C { static + m() {} }

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:18)"
}

View File

@ -0,0 +1 @@
declare class C { static + m() {} }

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:26)"
}

View File

@ -0,0 +1 @@
({ + m() {} });

View File

@ -0,0 +1,3 @@
{
"throws": "Unexpected token (1:3)"
}

View File

@ -147,7 +147,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -147,7 +147,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -147,7 +147,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": [
@ -210,7 +211,8 @@
"column": 49
}
}
}
},
"variance": null
}
]
}

View File

@ -161,7 +161,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -147,7 +147,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -194,7 +195,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -193,12 +193,14 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -207,13 +207,15 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -147,7 +147,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -194,7 +195,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -147,7 +147,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -194,7 +195,8 @@
}
}
},
"optional": true
"optional": true,
"variance": null
}
],
"indexers": []

View File

@ -223,7 +223,8 @@
"column": 49
}
}
}
},
"variance": null
}
]
}

View File

@ -198,7 +198,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -198,7 +198,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -203,7 +203,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -147,7 +147,8 @@
}
}
},
"optional": true
"optional": true,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -194,7 +195,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -241,7 +243,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -139,7 +139,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []
@ -321,7 +322,8 @@
"name": "T"
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []

View File

@ -256,7 +256,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
},
{
"type": "ObjectTypeProperty",
@ -303,7 +304,8 @@
}
}
},
"optional": false
"optional": false,
"variance": null
}
],
"indexers": []