blob: a93a101f9654da0053bac4a32841dedd05bcb951 [file] [log] [blame]
module.exports = function (fork) {
// Since TypeScript is parsed by Babylon, include the core Babylon types
// but omit the Flow-related types.
fork.use(require("./babel-core"));
var types = fork.use(require("../lib/types"));
var n = types.namedTypes;
var def = types.Type.def;
var or = types.Type.or;
var defaults = fork.use(require("../lib/shared")).defaults;
var StringLiteral = new types.Type(function (value, deep) {
if (n.StringLiteral &&
n.StringLiteral.check(value, deep)) {
return true
}
if (n.Literal &&
n.Literal.check(value, deep) &&
typeof value.value === "string") {
return true;
}
return false;
}, "StringLiteral");
def("TSType")
.bases("Node");
var IdOrQualifiedName = or(
def("Identifier"),
def("TSQualifiedName")
);
def("TSTypeReference")
.bases("TSType")
.field("typeName", IdOrQualifiedName)
.field("typeParameters",
or(def("TSTypeParameterInstantiation"), null),
defaults["null"]);
// An abstract (non-buildable) base type that provide a commonly-needed
// optional .typeParameters field.
def("TSHasOptionalTypeParameters")
.field("typeParameters",
or(def("TSTypeParameterDeclaration"), null),
defaults["null"]);
// An abstract (non-buildable) base type that provide a commonly-needed
// optional .typeAnnotation field.
def("TSHasOptionalTypeAnnotation")
.field("typeAnnotation",
or(def("TSTypeAnnotation"), null),
defaults["null"]);
def("TSQualifiedName")
.bases("Node")
.build("left", "right")
.field("left", IdOrQualifiedName)
.field("right", IdOrQualifiedName);
def("TSAsExpression")
.bases("Expression")
.build("expression")
.field("expression", def("Expression"))
.field("typeAnnotation", def("TSType"))
.field("extra",
or({ parenthesized: Boolean }, null),
defaults["null"]);
def("TSNonNullExpression")
.bases("Expression")
.build("expression")
.field("expression", def("Expression"));
[ // Define all the simple keyword types.
"TSAnyKeyword",
"TSBooleanKeyword",
"TSNeverKeyword",
"TSNullKeyword",
"TSNumberKeyword",
"TSObjectKeyword",
"TSStringKeyword",
"TSSymbolKeyword",
"TSUndefinedKeyword",
"TSVoidKeyword",
"TSThisType",
].forEach(keywordType => {
def(keywordType)
.bases("TSType")
.build();
});
def("TSArrayType")
.bases("TSType")
.build("elementType")
.field("elementType", def("TSType"))
def("TSLiteralType")
.bases("TSType")
.build("literal")
.field("literal",
or(def("NumericLiteral"),
def("StringLiteral"),
def("BooleanLiteral")));
["TSUnionType",
"TSIntersectionType",
].forEach(typeName => {
def(typeName)
.bases("TSType")
.build("types")
.field("types", [def("TSType")]);
});
def("TSConditionalType")
.bases("TSType")
.build("checkType", "extendsType", "trueType", "falseType")
.field("checkType", def("TSType"))
.field("extendsType", def("TSType"))
.field("trueType", def("TSType"))
.field("falseType", def("TSType"));
def("TSInferType")
.bases("TSType")
.build("typeParameter")
.field("typeParameter", def("TSType"));
def("TSParenthesizedType")
.bases("TSType")
.build("typeAnnotation")
.field("typeAnnotation", def("TSType"));
var ParametersType = [or(
def("Identifier"),
def("RestElement")
)];
["TSFunctionType",
"TSConstructorType",
].forEach(typeName => {
def(typeName)
.bases("TSType",
"TSHasOptionalTypeParameters",
"TSHasOptionalTypeAnnotation")
.build("parameters")
.field("parameters", ParametersType);
});
def("TSDeclareFunction")
.bases("Declaration", "TSHasOptionalTypeParameters")
.build("id", "params", "returnType")
.field("declare", Boolean, defaults["false"])
.field("async", Boolean, defaults["false"])
.field("generator", Boolean, defaults["false"])
.field("id", or(def("Identifier"), null), defaults["null"])
.field("params", [def("Pattern")])
// tSFunctionTypeAnnotationCommon
.field("returnType",
or(def("TSTypeAnnotation"),
def("Noop"), // Still used?
null),
defaults["null"]);
def("TSDeclareMethod")
.bases("Declaration", "TSHasOptionalTypeParameters")
.build("key", "params", "returnType")
.field("async", Boolean, defaults["false"])
.field("generator", Boolean, defaults["false"])
.field("params", [def("Pattern")])
// classMethodOrPropertyCommon
.field("abstract", Boolean, defaults["false"])
.field("accessibility",
or("public", "private", "protected", void 0),
defaults["undefined"])
.field("static", Boolean, defaults["false"])
.field("computed", Boolean, defaults["false"])
.field("optional", Boolean, defaults["false"])
.field("key", or(
def("Identifier"),
def("StringLiteral"),
def("NumericLiteral"),
// Only allowed if .computed is true.
def("Expression")
))
// classMethodOrDeclareMethodCommon
.field("kind",
or("get", "set", "method", "constructor"),
function getDefault() { return "method"; })
.field("access", // Not "accessibility"?
or("public", "private", "protected", void 0),
defaults["undefined"])
.field("decorators",
or([def("Decorator")], null),
defaults["null"])
// tSFunctionTypeAnnotationCommon
.field("returnType",
or(def("TSTypeAnnotation"),
def("Noop"), // Still used?
null),
defaults["null"]);
def("TSMappedType")
.bases("TSType")
.build("typeParameter", "typeAnnotation")
.field("readonly", Boolean, defaults["false"])
.field("typeParameter", def("TSTypeParameter"))
.field("optional", Boolean, defaults["false"])
.field("typeAnnotation",
or(def("TSType"), null),
defaults["null"]);
def("TSTupleType")
.bases("TSType")
.build("elementTypes")
.field("elementTypes", [def("TSType")]);
def("TSIndexedAccessType")
.bases("TSType")
.build("objectType", "indexType")
.field("objectType", def("TSType"))
.field("indexType", def("TSType"))
def("TSTypeOperator")
.bases("TSType")
.build("operator")
.field("operator", String)
.field("typeAnnotation", def("TSType"));
def("TSTypeAnnotation")
.bases("Node")
.build("typeAnnotation")
.field("typeAnnotation",
or(def("TSType"),
def("TSTypeAnnotation")));
def("TSIndexSignature")
.bases("Declaration", "TSHasOptionalTypeAnnotation")
.build("parameters")
.field("parameters", [def("Identifier")]) // Length === 1
.field("readonly", Boolean, defaults["false"]);
def("TSPropertySignature")
.bases("Declaration", "TSHasOptionalTypeAnnotation")
.build("key")
.field("key", def("Expression"))
.field("computed", Boolean, defaults["false"])
.field("readonly", Boolean, defaults["false"])
.field("optional", Boolean, defaults["false"])
.field("initializer",
or(def("Expression"), null),
defaults["null"]);
def("TSMethodSignature")
.bases("Declaration",
"TSHasOptionalTypeParameters",
"TSHasOptionalTypeAnnotation")
.build("key")
.field("key", def("Expression"))
.field("computed", Boolean, defaults["false"])
.field("optional", Boolean, defaults["false"])
.field("parameters", ParametersType);
def("TSTypePredicate")
.bases("TSTypeAnnotation")
.build("parameterName", "typeAnnotation")
.field("parameterName",
or(def("Identifier"),
def("TSThisType")))
.field("typeAnnotation", def("TSTypeAnnotation"));
["TSCallSignatureDeclaration",
"TSConstructSignatureDeclaration",
].forEach(typeName => {
def(typeName)
.bases("Declaration",
"TSHasOptionalTypeParameters",
"TSHasOptionalTypeAnnotation")
.build("parameters")
.field("parameters", ParametersType);
});
def("TSEnumMember")
.bases("Node")
.build("id", "initializer")
.field("id", or(def("Identifier"), StringLiteral))
.field("initializer",
or(def("Expression"), null),
defaults["null"]);
def("TSTypeQuery")
.bases("TSType")
.build("exprName")
.field("exprName", def("Identifier"));
// Inferred from Babylon's tsParseTypeMember method.
var TSTypeMember = or(
def("TSCallSignatureDeclaration"),
def("TSConstructSignatureDeclaration"),
def("TSIndexSignature"),
def("TSMethodSignature"),
def("TSPropertySignature")
);
def("TSTypeLiteral")
.bases("TSType")
.build("members")
.field("members", [TSTypeMember]);
def("TSTypeParameter")
.bases("Identifier")
.field("name", String)
.field("constraint", or(def("TSType"), null), defaults["null"])
.field("default", or(def("TSType"), null), defaults["null"]);
def("TSTypeAssertion")
.bases("Expression")
.build("typeAnnotation", "expression")
.field("typeAnnotation", def("TSType"))
.field("expression", def("Expression"))
.field("extra",
or({ parenthesized: Boolean }, null),
defaults["null"]);
def("TSTypeParameterDeclaration")
.bases("Declaration")
.build("params")
.field("params", [def("TSTypeParameter")]);
def("TSTypeParameterInstantiation")
.bases("Node")
.build("params")
.field("params", [def("TSType")]);
def("TSEnumDeclaration")
.bases("Declaration")
.build("id", "members")
.field("id", def("Identifier"))
.field("const", Boolean, defaults["false"])
.field("declare", Boolean, defaults["false"])
.field("members", [def("TSEnumMember")])
.field("initializer",
or(def("Expression"), null),
defaults["null"]);
def("TSTypeAliasDeclaration")
.bases("Declaration", "TSHasOptionalTypeParameters")
.build("id")
.field("id", def("Identifier"))
.field("declare", Boolean, defaults["false"])
.field("typeAnnotation", def("TSType"));
def("TSModuleBlock")
.bases("Node")
.build("body")
.field("body", [def("Statement")]);
def("TSModuleDeclaration")
.bases("Declaration")
.build("id", "body")
.field("id", or(StringLiteral, IdOrQualifiedName))
.field("declare", Boolean, defaults["false"])
.field("global", Boolean, defaults["false"])
.field("body",
or(def("TSModuleBlock"),
def("TSModuleDeclaration"),
null),
defaults["null"]);
def("TSImportEqualsDeclaration")
.bases("Declaration")
.build("id", "moduleReference")
.field("id", def("Identifier"))
.field("isExport", Boolean, defaults["false"])
.field("moduleReference",
or(IdOrQualifiedName,
def("TSExternalModuleReference")));
def("TSExternalModuleReference")
.bases("Declaration")
.build("expression")
.field("expression", StringLiteral);
def("TSExportAssignment")
.bases("Statement")
.build("expression")
.field("expression", def("Expression"));
def("TSNamespaceExportDeclaration")
.bases("Declaration")
.build("id")
.field("id", def("Identifier"));
def("TSInterfaceBody")
.bases("Node")
.build("body")
.field("body", [TSTypeMember]);
def("TSExpressionWithTypeArguments")
.bases("TSType")
.build("expression", "typeParameters")
.field("expression", IdOrQualifiedName)
.field("typeParameters",
or(def("TSTypeParameterInstantiation"), null),
defaults["null"]);
def("TSInterfaceDeclaration")
.bases("Declaration", "TSHasOptionalTypeParameters")
.build("id", "body")
.field("id", IdOrQualifiedName)
.field("declare", Boolean, defaults["false"])
.field("extends",
or([def("TSExpressionWithTypeArguments")], null),
defaults["null"])
.field("body", def("TSInterfaceBody"));
["ClassDeclaration",
"ClassExpression",
].forEach(typeName => {
def(typeName)
.field("implements",
[def("TSExpressionWithTypeArguments")],
defaults.emptyArray);
});
def("TSParameterProperty")
.bases("Pattern")
.build("parameter")
.field("accessibility",
or("public", "private", "protected", void 0),
defaults["undefined"])
.field("readonly", Boolean, defaults["false"])
.field("parameter", or(def("Identifier"),
def("AssignmentPattern")));
// Defined already in es6 and babel-core.
def("ClassBody")
.field("body", [or(
def("MethodDefinition"),
def("VariableDeclarator"),
def("ClassPropertyDefinition"),
def("ClassProperty"),
def("ClassMethod"),
// Just need to add these types:
def("TSDeclareMethod"),
TSTypeMember
)]);
};