diff --git a/Makefile b/Makefile index 9211f51fce34..58af275dd437 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ MAKEFLAGS = -j1 -FLOW_COMMIT = 4cc2b9f7fadf2e9e445ee9b7b980c65d69d3fbc0 +FLOW_COMMIT = 0dfdb8bf984205f03e95b71680e39bae6b8f7066 TEST262_COMMIT = 1282e842febf418ca27df13fa4b32f7e5021b470 export NODE_ENV = test diff --git a/packages/babylon/src/plugins/flow.js b/packages/babylon/src/plugins/flow.js index 91c7a521ddb1..2fe962320e77 100644 --- a/packages/babylon/src/plugins/flow.js +++ b/packages/babylon/src/plugins/flow.js @@ -123,7 +123,7 @@ export default (superClass: Class): Class => flowParseDeclareClass(node: N.FlowDeclareClass): N.FlowDeclareClass { this.next(); - this.flowParseInterfaceish(node); + this.flowParseInterfaceish(node, /*isClass*/ true); return this.finishNode(node, "DeclareClass"); } @@ -389,8 +389,8 @@ export default (superClass: Class): Class => // Interfaces - flowParseInterfaceish(node: N.FlowDeclare): void { - node.id = this.parseIdentifier(); + flowParseInterfaceish(node: N.FlowDeclare, isClass?: boolean): void { + node.id = this.flowParseRestrictedIdentifier(/*liberal*/ !isClass); if (this.isRelational("<")) { node.typeParameters = this.flowParseTypeParameterDeclaration(); @@ -404,7 +404,7 @@ export default (superClass: Class): Class => if (this.eat(tt._extends)) { do { node.extends.push(this.flowParseInterfaceExtends()); - } while (this.eat(tt.comma)); + } while (!isClass && this.eat(tt.comma)); } if (this.isContextual("mixins")) { @@ -468,7 +468,7 @@ export default (superClass: Class): Class => declare: boolean, ): N.FlowOpaqueType { this.expectContextual("type"); - node.id = this.flowParseRestrictedIdentifier(); + node.id = this.flowParseRestrictedIdentifier(/*liberal*/ true); if (this.isRelational("<")) { node.typeParameters = this.flowParseTypeParameterDeclaration(); @@ -1775,7 +1775,7 @@ export default (superClass: Class): Class => const implemented: N.FlowClassImplements[] = (node.implements = []); do { const node = this.startNode(); - node.id = this.parseIdentifier(); + node.id = this.flowParseRestrictedIdentifier(/*liberal*/ true); if (this.isRelational("<")) { node.typeParameters = this.flowParseTypeParameterInstantiation(); } else { diff --git a/packages/babylon/test/fixtures/flow/declare-statements/class-multiple-extends-invalid/actual.js b/packages/babylon/test/fixtures/flow/declare-statements/class-multiple-extends-invalid/actual.js new file mode 100644 index 000000000000..db1d8d2a8f9b --- /dev/null +++ b/packages/babylon/test/fixtures/flow/declare-statements/class-multiple-extends-invalid/actual.js @@ -0,0 +1 @@ +declare class A extends B, C {} diff --git a/packages/babylon/test/fixtures/flow/declare-statements/class-multiple-extends-invalid/options.json b/packages/babylon/test/fixtures/flow/declare-statements/class-multiple-extends-invalid/options.json new file mode 100644 index 000000000000..1814e460c8b3 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/declare-statements/class-multiple-extends-invalid/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected { (1:25)" +} diff --git a/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-type-invalid/actual.js b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-type-invalid/actual.js new file mode 100644 index 000000000000..11f7d296e15b --- /dev/null +++ b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-type-invalid/actual.js @@ -0,0 +1 @@ +interface string {} diff --git a/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-type-invalid/options.json b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-type-invalid/options.json new file mode 100644 index 000000000000..293efb5d9d07 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-type-invalid/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Cannot overwrite primitive type string (1:10)" +} diff --git a/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-value/actual.js b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-value/actual.js new file mode 100644 index 000000000000..e9d44f982e5f --- /dev/null +++ b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-value/actual.js @@ -0,0 +1 @@ +interface switch {} diff --git a/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-value/expected.json b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-value/expected.json new file mode 100644 index 000000000000..af2de6589641 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/id-reserved-value/expected.json @@ -0,0 +1,88 @@ +{ + "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": "InterfaceDeclaration", + "start": 0, + "end": 19, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 19 + } + }, + "id": { + "type": "Identifier", + "start": 10, + "end": 16, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 16 + }, + "identifierName": "switch" + }, + "name": "switch" + }, + "typeParameters": null, + "extends": [], + "mixins": [], + "body": { + "type": "ObjectTypeAnnotation", + "start": 17, + "end": 19, + "loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 19 + } + }, + "callProperties": [], + "properties": [], + "indexers": [], + "exact": false + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-type-invalid/actual.js b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-type-invalid/actual.js new file mode 100644 index 000000000000..1486ba98f84e --- /dev/null +++ b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-type-invalid/actual.js @@ -0,0 +1 @@ +class Foo implements string {} diff --git a/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-type-invalid/options.json b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-type-invalid/options.json new file mode 100644 index 000000000000..976b966edc23 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-type-invalid/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Cannot overwrite primitive type string (1:21)" +} diff --git a/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-value/actual.js b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-value/actual.js new file mode 100644 index 000000000000..662585190a92 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-value/actual.js @@ -0,0 +1 @@ +class Foo implements switch {} diff --git a/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-value/expected.json b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-value/expected.json new file mode 100644 index 000000000000..2ec1f88ca0b6 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/interfaces-module-and-script/implements-reserved-value/expected.json @@ -0,0 +1,118 @@ +{ + "type": "File", + "start": 0, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 9, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 9 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "implements": [ + { + "type": "ClassImplements", + "start": 21, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 21 + }, + "end": { + "line": 1, + "column": 27 + } + }, + "id": { + "type": "Identifier", + "start": 21, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 21 + }, + "end": { + "line": 1, + "column": 27 + }, + "identifierName": "switch" + }, + "name": "switch" + }, + "typeParameters": null + } + ], + "body": { + "type": "ClassBody", + "start": 28, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 28 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "body": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-type-invalid/actual.js b/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-type-invalid/actual.js new file mode 100644 index 000000000000..af9115c32190 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-type-invalid/actual.js @@ -0,0 +1 @@ +opaque type string = number; diff --git a/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-type-invalid/options.json b/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-type-invalid/options.json new file mode 100644 index 000000000000..55b6b62222b5 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-type-invalid/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Cannot overwrite primitive type string (1:12)" +} diff --git a/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-value/actual.js b/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-value/actual.js new file mode 100644 index 000000000000..ee2234d431b4 --- /dev/null +++ b/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-value/actual.js @@ -0,0 +1 @@ +opaque type switch = number; diff --git a/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-value/expected.json b/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-value/expected.json new file mode 100644 index 000000000000..2972c2901c6b --- /dev/null +++ b/packages/babylon/test/fixtures/flow/opaque-type-alias/reserved-value/expected.json @@ -0,0 +1,83 @@ +{ + "type": "File", + "start": 0, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 28 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 28 + } + }, + "sourceType": "module", + "body": [ + { + "type": "OpaqueType", + "start": 0, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 28 + } + }, + "id": { + "type": "Identifier", + "start": 12, + "end": 18, + "loc": { + "start": { + "line": 1, + "column": 12 + }, + "end": { + "line": 1, + "column": 18 + }, + "identifierName": "switch" + }, + "name": "switch" + }, + "typeParameters": null, + "supertype": null, + "impltype": { + "type": "NumberTypeAnnotation", + "start": 21, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 21 + }, + "end": { + "line": 1, + "column": 27 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/scripts/tests/flow/flow_tests_whitelist.txt b/scripts/tests/flow/flow_tests_whitelist.txt index b79939f3130b..3f0abc41bf39 100644 --- a/scripts/tests/flow/flow_tests_whitelist.txt +++ b/scripts/tests/flow/flow_tests_whitelist.txt @@ -57,4 +57,3 @@ types/parameter_defaults/migrated_0031.js types/parameter_defaults/migrated_0032.js types/string_literal_invalid/migrated_0000.js types/typecasts_invalid/migrated_0001.js -types/import_types/typeof_named_reserved_type.js