use of com.google.javascript.jscomp.newtypes.JSType in project closure-compiler by google.
the class NewTypeInference method analyzeAssignAddBwd.
private EnvTypePair analyzeAssignAddBwd(Node expr, TypeEnv outEnv, JSType requiredType) {
Node lhs = expr.getFirstChild();
Node rhs = expr.getLastChild();
JSType lhsReqType = specializeKeep2ndWhenBottom(requiredType, NUMBER_OR_STRING);
LValueResultBwd lvalue = analyzeLValueBwd(lhs, outEnv, lhsReqType, false);
// if lhs is a string, rhs can still be a number
JSType rhsReqType = lvalue.type.isNumber() ? NUMBER : NUMBER_OR_STRING;
EnvTypePair pair = analyzeExprBwd(rhs, outEnv, rhsReqType);
pair.env = analyzeLValueBwd(lhs, pair.env, lhsReqType, false).env;
return pair;
}
use of com.google.javascript.jscomp.newtypes.JSType in project closure-compiler by google.
the class NewTypeInference method analyzeThisFwd.
private EnvTypePair analyzeThisFwd(Node expr, TypeEnv inEnv, JSType requiredType, JSType specializedType) {
mayWarnAboutGlobalThis(expr);
if (!this.currentScope.hasThis()) {
return new EnvTypePair(inEnv, UNKNOWN);
}
// A trimmed-down version of analyzeNameFwd.
JSType inferredType = envGetType(inEnv, THIS_ID);
if (!inferredType.isSubtypeOf(requiredType)) {
return new EnvTypePair(inEnv, inferredType);
}
JSType preciseType = inferredType.specialize(specializedType);
if (preciseType.isBottom()) {
preciseType = pickFallbackTypeAfterBottom(THIS_ID, inferredType, specializedType);
}
return EnvTypePair.addBinding(inEnv, THIS_ID, preciseType);
}
use of com.google.javascript.jscomp.newtypes.JSType in project closure-compiler by google.
the class NewTypeInference method analyzeSpecializedTypeof.
private EnvTypePair analyzeSpecializedTypeof(Node typeof, Node typeString, Token comparisonOp, TypeEnv inEnv, JSType specializedType) {
EnvTypePair pair;
Node typeofRand = typeof.getFirstChild();
JSType comparedType = getTypeFromString(typeString);
checkInvalidTypename(typeString);
if (comparedType.isUnknown()) {
pair = analyzeExprFwd(typeofRand, inEnv);
pair = analyzeExprFwd(typeString, pair.env);
} else if ((specializedType.isTrueOrTruthy() && (comparisonOp == Token.SHEQ || comparisonOp == Token.EQ)) || (specializedType.isFalseOrFalsy() && (comparisonOp == Token.SHNE || comparisonOp == Token.NE))) {
pair = analyzeExprFwd(typeofRand, inEnv, UNKNOWN, comparedType);
} else {
pair = analyzeExprFwd(typeofRand, inEnv);
JSType rmType = pair.type.removeType(comparedType);
if (!rmType.isBottom()) {
pair = analyzeExprFwd(typeofRand, inEnv, UNKNOWN, rmType);
}
}
pair.type = specializedType.toBoolean();
return pair;
}
use of com.google.javascript.jscomp.newtypes.JSType in project closure-compiler by google.
the class NewTypeInference method analyzeGetElemFwd.
private EnvTypePair analyzeGetElemFwd(Node expr, TypeEnv inEnv, JSType requiredType, JSType specializedType) {
Node receiver = expr.getFirstChild();
Node index = expr.getLastChild();
JSType reqObjType = pickReqObjType(expr);
EnvTypePair pair = analyzeExprFwd(receiver, inEnv, reqObjType);
pair = mayWarnAboutNullableReferenceAndTighten(receiver, pair.type, null, pair.env);
JSType recvType = pair.type.autobox();
if (!mayWarnAboutNonObject(receiver, recvType, specializedType) && !mayWarnAboutStructPropAccess(receiver, recvType)) {
JSType indexType = recvType.getIndexType();
if (indexType != null) {
pair = analyzeExprFwd(index, pair.env, firstNonBottom(indexType, UNKNOWN));
mayWarnAboutBadIObjectIndex(index, recvType, pair.type, indexType);
pair.type = getIndexedTypeOrUnknown(recvType);
return pair;
} else if (index.isString()) {
return analyzePropAccessFwd(receiver, index.getString(), inEnv, requiredType, specializedType);
}
}
pair = analyzeExprFwd(index, pair.env);
pair.type = UNKNOWN;
return pair;
}
use of com.google.javascript.jscomp.newtypes.JSType in project closure-compiler by google.
the class NewTypeInference method analyzeLooseCallNodeBwd.
private EnvTypePair analyzeLooseCallNodeBwd(Node callNode, TypeEnv outEnv, JSType retType) {
checkArgument(callNode.isCall() || callNode.isNew());
checkNotNull(retType);
Node callee = callNode.getFirstChild();
TypeEnv tmpEnv = outEnv;
FunctionTypeBuilder builder = new FunctionTypeBuilder(this.commonTypes);
Node target = callNode.getFirstChild();
for (Node arg = callNode.getLastChild(); arg != target; arg = arg.getPrevious()) {
EnvTypePair pair = analyzeExprBwd(arg, tmpEnv);
JSType argType = pair.type;
tmpEnv = pair.env;
// May wait until FWD to get more precise argument types.
builder.addReqFormalToFront(isImpreciseType(argType) ? BOTTOM : argType);
}
JSType looseRetType = retType.isUnknown() ? BOTTOM : retType;
JSType looseFunctionType = commonTypes.fromFunctionType(builder.addRetType(looseRetType).addLoose().buildFunction());
println("loose function type is ", looseFunctionType);
EnvTypePair calleePair = analyzeExprBwd(callee, tmpEnv, looseFunctionType);
return new EnvTypePair(calleePair.env, retType);
}
Aggregations