diff --git a/Makefile b/Makefile index ac6ff78e40..d9aeed0ee8 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 e92c7aefed..ac5dd5fe59 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"); } @@ -392,8 +392,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(); @@ -407,7 +407,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")) { @@ -471,7 +471,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(); @@ -1780,7 +1780,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 0000000000..db1d8d2a8f --- /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 0000000000..1814e460c8 --- /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 0000000000..11f7d296e1 --- /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 0000000000..293efb5d9d --- /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 0000000000..e9d44f982e --- /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 0000000000..af2de65896 --- /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 0000000000..1486ba98f8 --- /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 0000000000..976b966edc --- /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 0000000000..662585190a --- /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 0000000000..2ec1f88ca0 --- /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 0000000000..af9115c321 --- /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 0000000000..55b6b62222 --- /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 0000000000..ee2234d431 --- /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 0000000000..2972c2901c --- /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 b79939f313..3f0abc41bf 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