diff --git a/src/plugins/flow.js b/src/plugins/flow.js index cad3c4b645..f3a1b739a7 100644 --- a/src/plugins/flow.js +++ b/src/plugins/flow.js @@ -1231,6 +1231,10 @@ export default (superClass: Class): Class => class extends super return this.match(tt.colon) || super.isClassProperty(); } + isNonstaticConstructor(method: N.ClassMethod): boolean { + return !this.match(tt.colon) && super.isNonstaticConstructor(method); + } + // parse type parameters for class methods parseClassMethod(classBody: N.ClassBody, method: N.ClassMethod, ...args): void { if (method.variance) { diff --git a/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/actual.js b/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/actual.js new file mode 100644 index 0000000000..1db4f60888 --- /dev/null +++ b/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/actual.js @@ -0,0 +1,3 @@ +class Foo { + constructor: () => this; +} diff --git a/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/expected.json b/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/expected.json new file mode 100644 index 0000000000..721399cff9 --- /dev/null +++ b/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/expected.json @@ -0,0 +1,169 @@ +{ + "type": "File", + "start": 0, + "end": 40, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 40, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 40, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 9, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 9 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 10, + "end": 40, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "body": [ + { + "type": "ClassProperty", + "start": 14, + "end": 38, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 26 + } + }, + "static": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 14, + "end": 25, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 13 + }, + "identifierName": "constructor" + }, + "name": "constructor" + }, + "variance": null, + "typeAnnotation": { + "type": "TypeAnnotation", + "start": 25, + "end": 37, + "loc": { + "start": { + "line": 2, + "column": 13 + }, + "end": { + "line": 2, + "column": 25 + } + }, + "typeAnnotation": { + "type": "FunctionTypeAnnotation", + "start": 27, + "end": 37, + "loc": { + "start": { + "line": 2, + "column": 15 + }, + "end": { + "line": 2, + "column": 25 + } + }, + "params": [], + "rest": null, + "returnType": { + "type": "ThisTypeAnnotation", + "start": 33, + "end": 37, + "loc": { + "start": { + "line": 2, + "column": 21 + }, + "end": { + "line": 2, + "column": 25 + } + }, + "value": true + }, + "typeParameters": null + } + }, + "value": null + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/options.json b/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/options.json new file mode 100644 index 0000000000..3c8f72c900 --- /dev/null +++ b/test/fixtures/flow/classes/constructor-override-with-class-prop-plugin/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["jsx", "flow", "classProperties"] +} diff --git a/test/fixtures/flow/classes/constructor-with-class-prop-plugin/actual.js b/test/fixtures/flow/classes/constructor-with-class-prop-plugin/actual.js new file mode 100644 index 0000000000..90c635b7b7 --- /dev/null +++ b/test/fixtures/flow/classes/constructor-with-class-prop-plugin/actual.js @@ -0,0 +1,5 @@ +class A { + constructor(): Object { + return {}; + } +} diff --git a/test/fixtures/flow/classes/constructor-with-class-prop-plugin/expected.json b/test/fixtures/flow/classes/constructor-with-class-prop-plugin/expected.json new file mode 100644 index 0000000000..661a2f5828 --- /dev/null +++ b/test/fixtures/flow/classes/constructor-with-class-prop-plugin/expected.json @@ -0,0 +1,222 @@ +{ + "type": "File", + "start": 0, + "end": 56, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 56, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 56, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "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": 56, + "loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "body": [ + { + "type": "ClassMethod", + "start": 12, + "end": 54, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 + } + }, + "static": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 12, + "end": 23, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 13 + }, + "identifierName": "constructor" + }, + "name": "constructor" + }, + "kind": "constructor", + "id": null, + "generator": false, + "expression": false, + "async": false, + "params": [], + "predicate": null, + "returnType": { + "type": "TypeAnnotation", + "start": 25, + "end": 33, + "loc": { + "start": { + "line": 2, + "column": 15 + }, + "end": { + "line": 2, + "column": 23 + } + }, + "typeAnnotation": { + "type": "GenericTypeAnnotation", + "start": 27, + "end": 33, + "loc": { + "start": { + "line": 2, + "column": 17 + }, + "end": { + "line": 2, + "column": 23 + } + }, + "typeParameters": null, + "id": { + "type": "Identifier", + "start": 27, + "end": 33, + "loc": { + "start": { + "line": 2, + "column": 17 + }, + "end": { + "line": 2, + "column": 23 + }, + "identifierName": "Object" + }, + "name": "Object" + } + } + }, + "body": { + "type": "BlockStatement", + "start": 34, + "end": 54, + "loc": { + "start": { + "line": 2, + "column": 24 + }, + "end": { + "line": 4, + "column": 3 + } + }, + "body": [ + { + "type": "ReturnStatement", + "start": 40, + "end": 50, + "loc": { + "start": { + "line": 3, + "column": 4 + }, + "end": { + "line": 3, + "column": 14 + } + }, + "argument": { + "type": "ObjectExpression", + "start": 47, + "end": 49, + "loc": { + "start": { + "line": 3, + "column": 11 + }, + "end": { + "line": 3, + "column": 13 + } + }, + "properties": [] + } + } + ], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/flow/classes/constructor-with-class-prop-plugin/options.json b/test/fixtures/flow/classes/constructor-with-class-prop-plugin/options.json new file mode 100644 index 0000000000..3c8f72c900 --- /dev/null +++ b/test/fixtures/flow/classes/constructor-with-class-prop-plugin/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["jsx", "flow", "classProperties"] +}