|
|
"use strict";
Object.defineProperty(exports, "__esModule", { value: true});exports.ArrayExpression = ArrayExpression;exports.AssignmentExpression = AssignmentExpression;exports.BinaryExpression = BinaryExpression;exports.BooleanLiteral = BooleanLiteral;exports.CallExpression = CallExpression;exports.ConditionalExpression = ConditionalExpression;exports.ClassDeclaration = exports.ClassExpression = exports.FunctionDeclaration = exports.ArrowFunctionExpression = exports.FunctionExpression = Func;Object.defineProperty(exports, "Identifier", { enumerable: true, get: function () { return _infererReference.default; }});exports.LogicalExpression = LogicalExpression;exports.NewExpression = NewExpression;exports.NullLiteral = NullLiteral;exports.NumericLiteral = NumericLiteral;exports.ObjectExpression = ObjectExpression;exports.ParenthesizedExpression = ParenthesizedExpression;exports.RegExpLiteral = RegExpLiteral;exports.RestElement = RestElement;exports.SequenceExpression = SequenceExpression;exports.StringLiteral = StringLiteral;exports.TSAsExpression = TSAsExpression;exports.TSNonNullExpression = TSNonNullExpression;exports.TaggedTemplateExpression = TaggedTemplateExpression;exports.TemplateLiteral = TemplateLiteral;exports.TypeCastExpression = TypeCastExpression;exports.UnaryExpression = UnaryExpression;exports.UpdateExpression = UpdateExpression;exports.VariableDeclarator = VariableDeclarator;var _t = require("@babel/types");var _infererReference = require("./inferer-reference.js");var _util = require("./util.js");const { BOOLEAN_BINARY_OPERATORS, BOOLEAN_UNARY_OPERATORS, NUMBER_BINARY_OPERATORS, NUMBER_UNARY_OPERATORS, STRING_UNARY_OPERATORS, anyTypeAnnotation, arrayTypeAnnotation, booleanTypeAnnotation, buildMatchMemberExpression, genericTypeAnnotation, identifier, nullLiteralTypeAnnotation, numberTypeAnnotation, stringTypeAnnotation, tupleTypeAnnotation, unionTypeAnnotation, voidTypeAnnotation, isIdentifier} = _t;function VariableDeclarator() { if (!this.get("id").isIdentifier()) return; return this.get("init").getTypeAnnotation();}function TypeCastExpression(node) { return node.typeAnnotation;}TypeCastExpression.validParent = true;function TSAsExpression(node) { return node.typeAnnotation;}TSAsExpression.validParent = true;function TSNonNullExpression() { return this.get("expression").getTypeAnnotation();}function NewExpression(node) { if (node.callee.type === "Identifier") { return genericTypeAnnotation(node.callee); }}function TemplateLiteral() { return stringTypeAnnotation();}function UnaryExpression(node) { const operator = node.operator; if (operator === "void") { return voidTypeAnnotation(); } else if (NUMBER_UNARY_OPERATORS.includes(operator)) { return numberTypeAnnotation(); } else if (STRING_UNARY_OPERATORS.includes(operator)) { return stringTypeAnnotation(); } else if (BOOLEAN_UNARY_OPERATORS.includes(operator)) { return booleanTypeAnnotation(); }}function BinaryExpression(node) { const operator = node.operator; if (NUMBER_BINARY_OPERATORS.includes(operator)) { return numberTypeAnnotation(); } else if (BOOLEAN_BINARY_OPERATORS.includes(operator)) { return booleanTypeAnnotation(); } else if (operator === "+") { const right = this.get("right"); const left = this.get("left"); if (left.isBaseType("number") && right.isBaseType("number")) { return numberTypeAnnotation(); } else if (left.isBaseType("string") || right.isBaseType("string")) { return stringTypeAnnotation(); } return unionTypeAnnotation([stringTypeAnnotation(), numberTypeAnnotation()]); }}function LogicalExpression() { const argumentTypes = [this.get("left").getTypeAnnotation(), this.get("right").getTypeAnnotation()]; return (0, _util.createUnionType)(argumentTypes);}function ConditionalExpression() { const argumentTypes = [this.get("consequent").getTypeAnnotation(), this.get("alternate").getTypeAnnotation()]; return (0, _util.createUnionType)(argumentTypes);}function SequenceExpression() { return this.get("expressions").pop().getTypeAnnotation();}function ParenthesizedExpression() { return this.get("expression").getTypeAnnotation();}function AssignmentExpression() { return this.get("right").getTypeAnnotation();}function UpdateExpression(node) { const operator = node.operator; if (operator === "++" || operator === "--") { return numberTypeAnnotation(); }}function StringLiteral() { return stringTypeAnnotation();}function NumericLiteral() { return numberTypeAnnotation();}function BooleanLiteral() { return booleanTypeAnnotation();}function NullLiteral() { return nullLiteralTypeAnnotation();}function RegExpLiteral() { return genericTypeAnnotation(identifier("RegExp"));}function ObjectExpression() { return genericTypeAnnotation(identifier("Object"));}function ArrayExpression() { return genericTypeAnnotation(identifier("Array"));}function RestElement() { return ArrayExpression();}RestElement.validParent = true;function Func() { return genericTypeAnnotation(identifier("Function"));}const isArrayFrom = buildMatchMemberExpression("Array.from");const isObjectKeys = buildMatchMemberExpression("Object.keys");const isObjectValues = buildMatchMemberExpression("Object.values");const isObjectEntries = buildMatchMemberExpression("Object.entries");function CallExpression() { const { callee } = this.node; if (isObjectKeys(callee)) { return arrayTypeAnnotation(stringTypeAnnotation()); } else if (isArrayFrom(callee) || isObjectValues(callee) || isIdentifier(callee, { name: "Array" })) { return arrayTypeAnnotation(anyTypeAnnotation()); } else if (isObjectEntries(callee)) { return arrayTypeAnnotation(tupleTypeAnnotation([stringTypeAnnotation(), anyTypeAnnotation()])); } return resolveCall(this.get("callee"));}function TaggedTemplateExpression() { return resolveCall(this.get("tag"));}function resolveCall(callee) { callee = callee.resolve(); if (callee.isFunction()) { const { node } = callee; if (node.async) { if (node.generator) { return genericTypeAnnotation(identifier("AsyncIterator")); } else { return genericTypeAnnotation(identifier("Promise")); } } else { if (node.generator) { return genericTypeAnnotation(identifier("Iterator")); } else if (callee.node.returnType) { return callee.node.returnType; } else {} } }}
//# sourceMappingURL=inferers.js.map
|