Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Flow opaque type aliases #5990

Merged
merged 21 commits into from Aug 2, 2017
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f827159
Add support for Flow opaque type aliases to babel-types
jbrown215 Jul 21, 2017
1b37234
Add support for Flow opaque type aliases to babel-generator
jbrown215 Jul 21, 2017
d620bc7
Add tests for Flow opaque type aliases to babel-generator
jbrown215 Jul 21, 2017
9184a7d
Add tests for Flow opaque type aliases to babel-plugin-transform-flow…
jbrown215 Jul 21, 2017
344276b
Add tests for Flow opaque type aliases to babel-plugin-transform-flow…
jbrown215 Jul 21, 2017
e1c0e3d
Remove swap files
jbrown215 Jul 25, 2017
3c9ff4d
Merge branch '7.0' into 7.0
Jul 25, 2017
d1a27cb
Run generate-interfaces and generate-babel-types-docs
jbrown215 Jul 25, 2017
cd663af
Fix failing test
jbrown215 Jul 25, 2017
71320e7
Merge branch '7.0' into 7.0
Aug 1, 2017
6f97d69
Add support for Flow opaque type aliases to babel-types
jbrown215 Jul 21, 2017
55d1b99
Add support for Flow opaque type aliases to babel-generator
jbrown215 Jul 21, 2017
8e44c1a
Add tests for Flow opaque type aliases to babel-generator
jbrown215 Jul 21, 2017
26a2446
Add tests for Flow opaque type aliases to babel-plugin-transform-flow…
jbrown215 Jul 21, 2017
172ea56
Add tests for Flow opaque type aliases to babel-plugin-transform-flow…
jbrown215 Jul 21, 2017
b14c4b3
Remove swap files
jbrown215 Jul 25, 2017
cdab13d
Run generate-interfaces and generate-babel-types-docs
jbrown215 Jul 25, 2017
2a27ccc
Merge branch '7.0' of https://github.com/jbrown215/babel into 7.0
jbrown215 Aug 1, 2017
3183864
Re-run generate-babel-types-docs
jbrown215 Aug 1, 2017
98ce855
Run generate-interfaces once more
jbrown215 Aug 1, 2017
97c62a5
Merge branch '7.0' into 7.0
existentialism Aug 2, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 29 additions & 0 deletions packages/babel-generator/src/generators/flow.js
Expand Up @@ -75,6 +75,14 @@ export function DeclareTypeAlias(node: Object) {
this.TypeAlias(node);
}

export function DeclareOpaqueType(node: Object, parent: Object) {
if (!t.isDeclareExportDeclaration(parent)) {
this.word("declare");
this.space();
}
this.OpaqueType(node);
}

export function DeclareVariable(node: Object, parent: Object) {
if (!t.isDeclareExportDeclaration(parent)) {
this.word("declare");
Expand Down Expand Up @@ -290,6 +298,27 @@ export function TypeAlias(node: Object) {
this.semicolon();
}

export function OpaqueType(node: Object) {
this.word("opaque");
this.space();
this.word("type");
this.space();
this.print(node.id, node);
this.print(node.typeParameters, node);
if (node.supertype) {
this.token(":");
this.space();
this.print(node.supertype, node);
}
if (node.impltype) {
this.space();
this.token("=");
this.space();
this.print(node.impltype, node);
}
this.semicolon();
}

export function TypeAnnotation(node: Object) {
this.token(":");
this.space();
Expand Down
Expand Up @@ -22,3 +22,10 @@ declare module B {
declare export type B = {};
declare export interface Moon {}
}

declare export opaque type Foo;
declare export opaque type Bar<T>;
declare export opaque type Baz: Foo;
declare export opaque type Foo<T>: Bar<T>;
declare export opaque type Foo<T>: Bar;
declare export opaque type Foo: Bar<T>;
Expand Up @@ -29,4 +29,10 @@ declare export { c, d } from 'bar';
declare module B {
declare export type B = {};
declare export interface Moon {}
}
}
declare export opaque type Foo;
declare export opaque type Bar<T>;
declare export opaque type Baz: Foo;
declare export opaque type Foo<T>: Bar<T>;
declare export opaque type Foo<T>: Bar;
declare export opaque type Foo: Bar<T>;
Expand Up @@ -19,3 +19,7 @@ declare type B = {
declare interface I { foo: string }
declare interface I<T> { foo: T }
declare module.exports: { foo: string }
declare opaque type Foo<T>: Bar<T>;
declare opaque type ID;
declare opaque type num: number;
declare opaque type NumArray;
Expand Up @@ -38,3 +38,7 @@ declare interface I<T> {
declare module.exports: {
foo: string
}
declare opaque type Foo<T>: Bar<T>;
declare opaque type ID;
declare opaque type num: number;
declare opaque type NumArray;
@@ -0,0 +1,14 @@
opaque type ID = string;
opaque type Foo<T> = Bar<T>;
opaque type Maybe<T> = _Maybe<T, *>;
export opaque type Foo = number;

opaque type union =
| {type: "A"}
| {type: "B"}
;

opaque type overloads =
& ((x: string) => number)
& ((x: number) => string)
;
@@ -0,0 +1,10 @@
opaque type ID = string;
opaque type Foo<T> = Bar<T>;
opaque type Maybe<T> = _Maybe<T, *>;
export opaque type Foo = number;
opaque type union = {
type: "A"
} | {
type: "B"
};
opaque type overloads = (x: string) => number & (x: number) => string;
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,15 @@
function a() {}
opaque type A = number;
opaque type B = {
name: string;
};

opaque type union =
| {type: "A"}
| {type: "B"}
;

opaque type overloads =
& ((x: string) => number)
& ((x: number) => string)
;
@@ -0,0 +1,16 @@
function a() {}
/*:: opaque type A = number;*/

/*:: opaque type B = {
name: string;
};*/

/*:: opaque type union =
| {type: "A"}
| {type: "B"}
;*/

/*:: opaque type overloads =
& ((x: string) => number)
& ((x: number) => string)
;*/
@@ -0,0 +1,16 @@
opaque type ID = string;
opaque type Foo<T> = Bar<T>
export opaque type Foo = number;

opaque type union =
| {type: "A"}
| {type: "B"}
;

opaque type overloads =
& ((x: string) => number)
& ((x: number) => string)
;

declare opaque type Foo: Bar;
declare export opaque type Foo: Bar;
16 changes: 16 additions & 0 deletions packages/babel-types/src/definitions/flow.js
Expand Up @@ -101,6 +101,14 @@ defineType("DeclareTypeAlias", {
},
});

defineType("DeclareOpaqueType", {
visitor: ["id", "typeParameters", "supertype"],
aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
fields: {
// todo
},
});

defineType("DeclareVariable", {
visitor: ["id"],
aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
Expand Down Expand Up @@ -250,6 +258,14 @@ defineType("TypeAlias", {
},
});

defineType("OpaqueType", {
visitor: ["id", "typeParameters", "supertype", "impltype"],
aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"],
fields: {
// todo
},
});

defineType("TypeAnnotation", {
visitor: ["typeAnnotation"],
aliases: ["Flow"],
Expand Down
1 change: 1 addition & 0 deletions packages/babel-types/src/retrievers.js
Expand Up @@ -70,6 +70,7 @@ getBindingIdentifiers.keys = {
DeclareVariable: ["id"],
InterfaceDeclaration: ["id"],
TypeAlias: ["id"],
OpaqueType: ["id"],

CatchClause: ["param"],
LabeledStatement: ["label"],
Expand Down