diff --git a/src/collector/declarations.js b/src/collector/declarations.js index 6475201..77460a1 100644 --- a/src/collector/declarations.js +++ b/src/collector/declarations.js @@ -5,13 +5,14 @@ import type { Block, ClassDeclaration, ExportDefaultDeclaration, ExportNamedDeclaration, Identifier, ImportDeclaration, ImportDefaultSpecifier, ImportSpecifier, InterfaceDeclaration, Node, TypeAlias, TypeParameterDeclaration, VariableDeclaration, VariableDeclarator, + DeclareTypeAlias, DeclareInterface, DeclareClass, } from '@babel/types'; import { - isCallExpression, isClassDeclaration, isClassMethod, isExportDefaultDeclaration, + isCallExpression, isClassDeclaration, isClassMethod, isExportDefaultDeclaration, isProgram, isExportNamedDeclaration, isIdentifier, isImportDeclaration, isImportNamespaceSpecifier, - isImportSpecifier, isInterfaceDeclaration, isObjectPattern, isObjectProperty, isProgram, - isStringLiteral, isTypeAlias, isVariableDeclaration, + isImportSpecifier, isInterfaceDeclaration, isObjectPattern, isObjectProperty, isDeclareClass, + isStringLiteral, isTypeAlias, isVariableDeclaration, isDeclareTypeAlias, isDeclareInterface, } from '@babel/types'; import {invariant} from '../utils'; @@ -194,10 +195,12 @@ function processExportDefaultDeclaration(ctx: Context, node: ExportDefaultDeclar * TODO: support "declare ..." form. */ -type Declaration = TypeAlias | InterfaceDeclaration | ClassDeclaration; +type Declaration = TypeAlias | InterfaceDeclaration | ClassDeclaration + | DeclareTypeAlias | DeclareInterface | DeclareClass; function isDeclaration(node: mixed): boolean %checks { - return isTypeAlias(node) || isInterfaceDeclaration(node) || isClassDeclaration(node); + return isTypeAlias(node) || isInterfaceDeclaration(node) || isClassDeclaration(node) + || isDeclareTypeAlias(node) || isDeclareInterface(node) || isDeclareClass(node); } function processDeclaration(ctx: Context, node: Declaration) { diff --git a/src/collector/definitions.js b/src/collector/definitions.js index 0a2f1a5..2bd7be1 100644 --- a/src/collector/definitions.js +++ b/src/collector/definitions.js @@ -6,7 +6,7 @@ import type { GenericTypeAnnotation, InterfaceDeclaration, IntersectionTypeAnnotation, TypeAlias, UnionTypeAnnotation, NullableTypeAnnotation, ObjectTypeIndexer, ObjectTypeProperty, StringLiteralTypeAnnotation, ObjectTypeAnnotation, AnyTypeAnnotation, MixedTypeAnnotation, - TupleTypeAnnotation, + TupleTypeAnnotation, DeclareTypeAlias, DeclareInterface, DeclareClass, } from '@babel/types'; import { @@ -26,7 +26,7 @@ import {extractPragmas} from './pragmas'; import {invariant} from '../utils'; -function processTypeAlias(ctx: Context, node: TypeAlias) { +function processTypeAlias(ctx: Context, node: TypeAlias | DeclareTypeAlias) { const {name} = node.id; const type = makeType(ctx, node.right); @@ -37,7 +37,10 @@ function processTypeAlias(ctx: Context, node: TypeAlias) { } // TODO: type params. -function processInterfaceDeclaration(ctx: Context, node: InterfaceDeclaration) { +function processInterfaceDeclaration( + ctx: Context, + node: InterfaceDeclaration | DeclareInterface | DeclareClass +) { const {name} = node.id; const type = makeType(ctx, node.body); @@ -282,6 +285,9 @@ function makeReference(ctx: Context, node: GenericTypeAnnotation): ?Type { export default { TypeAlias: processTypeAlias, + DeclareTypeAlias: processTypeAlias, InterfaceDeclaration: processInterfaceDeclaration, + DeclareInterface: processInterfaceDeclaration, ClassDeclaration: processClassDeclaration, + DeclareClass: processInterfaceDeclaration, } diff --git a/tests/samples/declare/source.js b/tests/samples/declare/source.js new file mode 100644 index 0000000..6ccab48 --- /dev/null +++ b/tests/samples/declare/source.js @@ -0,0 +1,13 @@ +declare type Type = { + a: string, +}; + +declare interface Interface { + a: Type; +}; + +declare class Class { + a: Interface; +} + +export {Type, Interface, Class}; diff --git a/tests/samples/declare/types.yaml b/tests/samples/declare/types.yaml new file mode 100644 index 0000000..fd1e524 --- /dev/null +++ b/tests/samples/declare/types.yaml @@ -0,0 +1,22 @@ +- kind: record + fields: + - name: a + value: {kind: string} + required: true + id: [declare, Type] +- kind: record + fields: + - name: a + value: + kind: reference + to: [declare, Type] + required: true + id: [declare, Interface] +- kind: record + fields: + - name: a + value: + kind: reference + to: [declare, Interface] + required: true + id: [declare, Class]