You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					211 lines
				
				6.5 KiB
			
		
		
			
		
	
	
					211 lines
				
				6.5 KiB
			| 
											3 years ago
										 | "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"); | ||
|  | var _util = require("./util"); | ||
|  | 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.indexOf(operator) >= 0) { | ||
|  |     return numberTypeAnnotation(); | ||
|  |   } else if (STRING_UNARY_OPERATORS.indexOf(operator) >= 0) { | ||
|  |     return stringTypeAnnotation(); | ||
|  |   } else if (BOOLEAN_UNARY_OPERATORS.indexOf(operator) >= 0) { | ||
|  |     return booleanTypeAnnotation(); | ||
|  |   } | ||
|  | } | ||
|  | function BinaryExpression(node) { | ||
|  |   const operator = node.operator; | ||
|  |   if (NUMBER_BINARY_OPERATORS.indexOf(operator) >= 0) { | ||
|  |     return numberTypeAnnotation(); | ||
|  |   } else if (BOOLEAN_BINARY_OPERATORS.indexOf(operator) >= 0) { | ||
|  |     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
 |