Rename. INSTANCE -> DEFAULT in JetTypeChecker

This commit is contained in:
Andrey Breslav
2014-06-23 15:34:13 +04:00
parent f26cad71d8
commit cd28b216c1
55 changed files with 94 additions and 98 deletions
@@ -722,7 +722,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
invokeFunction(fakeCall, StackValue.local(iteratorVarIndex, asmTypeForIterator), hasNextCall); invokeFunction(fakeCall, StackValue.local(iteratorVarIndex, asmTypeForIterator), hasNextCall);
JetType type = hasNextCall.getResultingDescriptor().getReturnType(); JetType type = hasNextCall.getResultingDescriptor().getReturnType();
assert type != null && JetTypeChecker.INSTANCE.isSubtypeOf(type, KotlinBuiltIns.getInstance().getBooleanType()); assert type != null && JetTypeChecker.DEFAULT.isSubtypeOf(type, KotlinBuiltIns.getInstance().getBooleanType());
Type asmType = asmType(type); Type asmType = asmType(type);
StackValue.coerce(asmType, Type.BOOLEAN_TYPE, v); StackValue.coerce(asmType, Type.BOOLEAN_TYPE, v);
@@ -484,7 +484,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
JetType returnType = function.getReturnType(); JetType returnType = function.getReturnType();
assert returnType != null : function.toString(); assert returnType != null : function.toString();
JetType paramType = function.getValueParameters().get(0).getType(); JetType paramType = function.getValueParameters().get(0).getType();
if (JetTypeChecker.INSTANCE.equalTypes(arrayType, returnType) && JetTypeChecker.INSTANCE.equalTypes(arrayType, paramType)) { if (JetTypeChecker.DEFAULT.equalTypes(arrayType, returnType) && JetTypeChecker.DEFAULT.equalTypes(arrayType, paramType)) {
return true; return true;
} }
} }
@@ -139,7 +139,7 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD
JetType substitutedReturnType = substitutor.substitute(returnType, Variance.INVARIANT); JetType substitutedReturnType = substitutor.substitute(returnType, Variance.INVARIANT);
assert substitutedReturnType != null; assert substitutedReturnType != null;
if (!JetTypeChecker.INSTANCE.isSubtypeOf(altReturnType, substitutedReturnType)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(altReturnType, substitutedReturnType)) {
throw new AlternativeSignatureMismatchException( throw new AlternativeSignatureMismatchException(
"Return type is changed to not subtype for method which overrides another: " + altReturnType + ", was: " + returnType); "Return type is changed to not subtype for method which overrides another: " + altReturnType + ", was: " + returnType);
} }
@@ -59,8 +59,8 @@ class PropagationHeuristics {
JetType elementTypeInSuper = arrayTypeFromSuper.getArguments().get(0).getType(); JetType elementTypeInSuper = arrayTypeFromSuper.getArguments().get(0).getType();
JetType elementType = type.getArguments().get(0).getType(); JetType elementType = type.getArguments().get(0).getType();
if (JetTypeChecker.INSTANCE.isSubtypeOf(elementType, elementTypeInSuper) if (JetTypeChecker.DEFAULT.isSubtypeOf(elementType, elementTypeInSuper)
&& !JetTypeChecker.INSTANCE.equalTypes(elementType, elementTypeInSuper)) { && !JetTypeChecker.DEFAULT.equalTypes(elementType, elementTypeInSuper)) {
JetTypeImpl betterTypeInSuper = new JetTypeImpl( JetTypeImpl betterTypeInSuper = new JetTypeImpl(
arrayTypeFromSuper.getAnnotations(), arrayTypeFromSuper.getAnnotations(),
arrayTypeFromSuper.getConstructor(), arrayTypeFromSuper.getConstructor(),
@@ -28,12 +28,12 @@ public trait TypePredicate: (JetType) -> Boolean {
} }
public data class SingleType(val targetType: JetType): TypePredicate { public data class SingleType(val targetType: JetType): TypePredicate {
override fun invoke(typeToCheck: JetType): Boolean = JetTypeChecker.INSTANCE.equalTypes(typeToCheck, targetType) override fun invoke(typeToCheck: JetType): Boolean = JetTypeChecker.DEFAULT.equalTypes(typeToCheck, targetType)
override fun toString(): String = targetType.render() override fun toString(): String = targetType.render()
} }
public data class AllSubtypes(val upperBound: JetType): TypePredicate { public data class AllSubtypes(val upperBound: JetType): TypePredicate {
override fun invoke(typeToCheck: JetType): Boolean = JetTypeChecker.INSTANCE.isSubtypeOf(typeToCheck, upperBound) override fun invoke(typeToCheck: JetType): Boolean = JetTypeChecker.DEFAULT.isSubtypeOf(typeToCheck, upperBound)
override fun toString(): String = "{<: ${upperBound.render()}}" override fun toString(): String = "{<: ${upperBound.render()}}"
} }
@@ -72,7 +72,7 @@ fun or(predicates: Collection<TypePredicate>): TypePredicate? =
} }
fun JetType.getSubtypesPredicate(): TypePredicate? = fun JetType.getSubtypesPredicate(): TypePredicate? =
if (TypeUtils.canHaveSubtypes(JetTypeChecker.INSTANCE, this)) AllSubtypes(this) else SingleType(this) if (TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, this)) AllSubtypes(this) else SingleType(this)
private fun JetType.render(): String = DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(this) private fun JetType.render(): String = DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(this)
@@ -229,13 +229,13 @@ public class Renderers {
parameterTypes.add(valueParameterDescriptor.getType()); parameterTypes.add(valueParameterDescriptor.getType());
if (valueParameterDescriptor.getIndex() >= inferenceErrorData.valueArgumentsTypes.size()) continue; if (valueParameterDescriptor.getIndex() >= inferenceErrorData.valueArgumentsTypes.size()) continue;
JetType actualType = inferenceErrorData.valueArgumentsTypes.get(valueParameterDescriptor.getIndex()); JetType actualType = inferenceErrorData.valueArgumentsTypes.get(valueParameterDescriptor.getIndex());
if (!JetTypeChecker.INSTANCE.isSubtypeOf(actualType, valueParameterDescriptor.getType())) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(actualType, valueParameterDescriptor.getType())) {
errorPositions.add(ConstraintPosition.getValueParameterPosition(valueParameterDescriptor.getIndex())); errorPositions.add(ConstraintPosition.getValueParameterPosition(valueParameterDescriptor.getIndex()));
} }
} }
if (receiverType != null && inferenceErrorData.receiverArgumentType != null && if (receiverType != null && inferenceErrorData.receiverArgumentType != null &&
!JetTypeChecker.INSTANCE.isSubtypeOf(inferenceErrorData.receiverArgumentType, receiverType)) { !JetTypeChecker.DEFAULT.isSubtypeOf(inferenceErrorData.receiverArgumentType, receiverType)) {
errorPositions.add(ConstraintPosition.RECEIVER_POSITION); errorPositions.add(ConstraintPosition.RECEIVER_POSITION);
} }
@@ -333,7 +333,7 @@ public class Renderers {
JetType upperBoundWithSubstitutedInferredTypes = JetType upperBoundWithSubstitutedInferredTypes =
systemWithoutWeakConstraints.getResultingSubstitutor().substitute(upperBound, Variance.INVARIANT); systemWithoutWeakConstraints.getResultingSubstitutor().substitute(upperBound, Variance.INVARIANT);
if (upperBoundWithSubstitutedInferredTypes != null && if (upperBoundWithSubstitutedInferredTypes != null &&
!JetTypeChecker.INSTANCE.isSubtypeOf(inferredValueForTypeParameter, upperBoundWithSubstitutedInferredTypes)) { !JetTypeChecker.DEFAULT.isSubtypeOf(inferredValueForTypeParameter, upperBoundWithSubstitutedInferredTypes)) {
violatedUpperBound = upperBoundWithSubstitutedInferredTypes; violatedUpperBound = upperBoundWithSubstitutedInferredTypes;
break; break;
} }
@@ -220,13 +220,13 @@ public class DeclarationsChecker {
REMOVE_IF_SUBTYPE_IN_THE_SET { REMOVE_IF_SUBTYPE_IN_THE_SET {
@Override @Override
public boolean removeNeeded(JetType subject, JetType other) { public boolean removeNeeded(JetType subject, JetType other) {
return JetTypeChecker.INSTANCE.isSubtypeOf(other, subject); return JetTypeChecker.DEFAULT.isSubtypeOf(other, subject);
} }
}, },
REMOVE_IF_SUPERTYPE_IN_THE_SET { REMOVE_IF_SUPERTYPE_IN_THE_SET {
@Override @Override
public boolean removeNeeded(JetType subject, JetType other) { public boolean removeNeeded(JetType subject, JetType other) {
return JetTypeChecker.INSTANCE.isSubtypeOf(subject, other); return JetTypeChecker.DEFAULT.isSubtypeOf(subject, other);
} }
}; };
@@ -98,7 +98,7 @@ public class DelegatedPropertyResolver {
JetType propertyType = propertyDescriptor.getType(); JetType propertyType = propertyDescriptor.getType();
/* Do not check return type of get() method of delegate for properties with DeferredType because property type is taken from it */ /* Do not check return type of get() method of delegate for properties with DeferredType because property type is taken from it */
if (!(propertyType instanceof DeferredType) && returnType != null && !JetTypeChecker.INSTANCE.isSubtypeOf(returnType, propertyType)) { if (!(propertyType instanceof DeferredType) && returnType != null && !JetTypeChecker.DEFAULT.isSubtypeOf(returnType, propertyType)) {
Call call = trace.getBindingContext().get(DELEGATED_PROPERTY_CALL, propertyDescriptor.getGetter()); Call call = trace.getBindingContext().get(DELEGATED_PROPERTY_CALL, propertyDescriptor.getGetter());
assert call != null : "Call should exists for " + propertyDescriptor.getGetter(); assert call != null : "Call should exists for " + propertyDescriptor.getGetter();
trace.report(DELEGATE_SPECIAL_FUNCTION_RETURN_TYPE_MISMATCH trace.report(DELEGATE_SPECIAL_FUNCTION_RETURN_TYPE_MISMATCH
@@ -760,7 +760,7 @@ public class DescriptorResolver {
boolean isClassObjectConstraint, boolean isClassObjectConstraint,
BindingTrace trace BindingTrace trace
) { ) {
if (!TypeUtils.canHaveSubtypes(JetTypeChecker.INSTANCE, upperBoundType)) { if (!TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, upperBoundType)) {
if (isClassObjectConstraint) { if (isClassObjectConstraint) {
trace.report(FINAL_CLASS_OBJECT_UPPER_BOUND.on(upperBound, upperBoundType)); trace.report(FINAL_CLASS_OBJECT_UPPER_BOUND.on(upperBound, upperBoundType));
} }
@@ -1360,7 +1360,7 @@ public class DescriptorResolver {
) { ) {
for (JetType bound : typeParameterDescriptor.getUpperBounds()) { for (JetType bound : typeParameterDescriptor.getUpperBounds()) {
JetType substitutedBound = substitutor.safeSubstitute(bound, Variance.INVARIANT); JetType substitutedBound = substitutor.safeSubstitute(bound, Variance.INVARIANT);
if (!JetTypeChecker.INSTANCE.isSubtypeOf(typeArgument, substitutedBound)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(typeArgument, substitutedBound)) {
trace.report(UPPER_BOUND_VIOLATED.on(jetTypeArgument, substitutedBound, typeArgument)); trace.report(UPPER_BOUND_VIOLATED.on(jetTypeArgument, substitutedBound, typeArgument));
} }
} }
@@ -71,7 +71,7 @@ public class OverloadUtil {
JetType superValueParameterType = OverridingUtil.getUpperBound(superValueParameters.get(i)); JetType superValueParameterType = OverridingUtil.getUpperBound(superValueParameters.get(i));
JetType subValueParameterType = OverridingUtil.getUpperBound(subValueParameters.get(i)); JetType subValueParameterType = OverridingUtil.getUpperBound(subValueParameters.get(i));
// TODO: compare erasure // TODO: compare erasure
if (!JetTypeChecker.INSTANCE.equalTypes(superValueParameterType, subValueParameterType)) { if (!JetTypeChecker.DEFAULT.equalTypes(superValueParameterType, subValueParameterType)) {
return OverridingUtil.OverrideCompatibilityInfo return OverridingUtil.OverrideCompatibilityInfo
.valueParameterTypeMismatch(superValueParameterType, subValueParameterType, INCOMPATIBLE); .valueParameterTypeMismatch(superValueParameterType, subValueParameterType, INCOMPATIBLE);
} }
@@ -733,7 +733,7 @@ public class OverrideResolver {
JetType substitutedSuperReturnType = typeSubstitutor.substitute(superReturnType, Variance.OUT_VARIANCE); JetType substitutedSuperReturnType = typeSubstitutor.substitute(superReturnType, Variance.OUT_VARIANCE);
assert substitutedSuperReturnType != null; assert substitutedSuperReturnType != null;
return JetTypeChecker.INSTANCE.isSubtypeOf(subReturnType, substitutedSuperReturnType); return JetTypeChecker.DEFAULT.isSubtypeOf(subReturnType, substitutedSuperReturnType);
} }
@Nullable @Nullable
@@ -768,7 +768,7 @@ public class OverrideResolver {
JetType substitutedSuperReturnType = typeSubstitutor.substitute(superDescriptor.getType(), Variance.OUT_VARIANCE); JetType substitutedSuperReturnType = typeSubstitutor.substitute(superDescriptor.getType(), Variance.OUT_VARIANCE);
assert substitutedSuperReturnType != null; assert substitutedSuperReturnType != null;
return JetTypeChecker.INSTANCE.equalTypes(subDescriptor.getType(), substitutedSuperReturnType); return JetTypeChecker.DEFAULT.equalTypes(subDescriptor.getType(), substitutedSuperReturnType);
} }
private void checkOverrideForComponentFunction(@NotNull final CallableMemberDescriptor componentFunction) { private void checkOverrideForComponentFunction(@NotNull final CallableMemberDescriptor componentFunction) {
@@ -74,7 +74,7 @@ public class ArgumentTypeResolver {
if (actualType == PLACEHOLDER_FUNCTION_TYPE) { if (actualType == PLACEHOLDER_FUNCTION_TYPE) {
return isFunctionOrErrorType(expectedType) || KotlinBuiltIns.getInstance().isAnyOrNullableAny(expectedType); //todo function type extends return isFunctionOrErrorType(expectedType) || KotlinBuiltIns.getInstance().isAnyOrNullableAny(expectedType); //todo function type extends
} }
return JetTypeChecker.INSTANCE.isSubtypeOf(actualType, expectedType); return JetTypeChecker.DEFAULT.isSubtypeOf(actualType, expectedType);
} }
private static boolean isFunctionOrErrorType(@NotNull JetType supertype) { private static boolean isFunctionOrErrorType(@NotNull JetType supertype) {
@@ -735,7 +735,7 @@ public class CandidateResolver {
Set<JetType> possibleTypes = dataFlowInfoForArgument.getPossibleTypes(dataFlowValue); Set<JetType> possibleTypes = dataFlowInfoForArgument.getPossibleTypes(dataFlowValue);
if (possibleTypes.isEmpty()) return type; if (possibleTypes.isEmpty()) return type;
return TypeUtils.intersect(JetTypeChecker.INSTANCE, possibleTypes); return TypeUtils.intersect(JetTypeChecker.DEFAULT, possibleTypes);
} }
private <D extends CallableDescriptor> ValueArgumentsCheckingResult checkAllValueArguments( private <D extends CallableDescriptor> ValueArgumentsCheckingResult checkAllValueArguments(
@@ -859,7 +859,7 @@ public class CandidateResolver {
List<JetType> variants = List<JetType> variants =
AutoCastUtils.getAutoCastVariantsExcludingReceiver(context.trace.getBindingContext(), context.dataFlowInfo, receiverToCast); AutoCastUtils.getAutoCastVariantsExcludingReceiver(context.trace.getBindingContext(), context.dataFlowInfo, receiverToCast);
for (JetType possibleType : variants) { for (JetType possibleType : variants) {
if (JetTypeChecker.INSTANCE.isSubtypeOf(possibleType, expectedType)) { if (JetTypeChecker.DEFAULT.isSubtypeOf(possibleType, expectedType)) {
return possibleType; return possibleType;
} }
} }
@@ -116,7 +116,7 @@ public class AutoCastUtils {
} }
if (subTypes.isEmpty()) return null; if (subTypes.isEmpty()) return null;
JetType intersection = TypeUtils.intersect(JetTypeChecker.INSTANCE, subTypes); JetType intersection = TypeUtils.intersect(JetTypeChecker.DEFAULT, subTypes);
if (intersection == null || !intersection.getConstructor().isDenotable()) { if (intersection == null || !intersection.getConstructor().isDenotable()) {
return receiverParameterType; return receiverParameterType;
} }
@@ -94,7 +94,7 @@ public class ConstraintsUtil {
JetType substitutedUpperBound = constraintSystem.getResultingSubstitutor().substitute(upperBound, Variance.INVARIANT); JetType substitutedUpperBound = constraintSystem.getResultingSubstitutor().substitute(upperBound, Variance.INVARIANT);
assert substitutedUpperBound != null : "We wanted to substitute projections as a result for " + typeParameter; assert substitutedUpperBound != null : "We wanted to substitute projections as a result for " + typeParameter;
if (!JetTypeChecker.INSTANCE.isSubtypeOf(type, substitutedUpperBound)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(type, substitutedUpperBound)) {
return false; return false;
} }
} }
@@ -239,7 +239,7 @@ public class OverloadingConflictResolver {
} }
private boolean typeMoreSpecific(@NotNull JetType specific, @NotNull JetType general) { private boolean typeMoreSpecific(@NotNull JetType specific, @NotNull JetType general) {
return JetTypeChecker.INSTANCE.isSubtypeOf(specific, general) || return JetTypeChecker.DEFAULT.isSubtypeOf(specific, general) ||
numericTypeMoreSpecific(specific, general); numericTypeMoreSpecific(specific, general);
} }
@@ -25,7 +25,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.Call; import org.jetbrains.jet.lang.psi.Call;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.psi.JetSuperExpression; import org.jetbrains.jet.lang.psi.JetSuperExpression;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.calls.autocasts.AutoCastUtils; import org.jetbrains.jet.lang.resolve.calls.autocasts.AutoCastUtils;
@@ -326,7 +325,7 @@ public class TaskPrioritizer {
if (expectedThisObject == null) return true; if (expectedThisObject == null) return true;
List<ReceiverParameterDescriptor> receivers = scope.getImplicitReceiversHierarchy(); List<ReceiverParameterDescriptor> receivers = scope.getImplicitReceiversHierarchy();
for (ReceiverParameterDescriptor receiver : receivers) { for (ReceiverParameterDescriptor receiver : receivers) {
if (JetTypeChecker.INSTANCE.isSubtypeOf(receiver.getType(), expectedThisObject.getType())) { if (JetTypeChecker.DEFAULT.isSubtypeOf(receiver.getType(), expectedThisObject.getType())) {
// TODO : Autocasts & nullability // TODO : Autocasts & nullability
candidate.setThisObject(expectedThisObject.getValue()); candidate.setThisObject(expectedThisObject.getValue());
return true; return true;
@@ -90,7 +90,7 @@ public class CompileTimeConstantChecker {
if (!noExpectedTypeOrError(expectedType)) { if (!noExpectedTypeOrError(expectedType)) {
JetType valueType = value.getType(KotlinBuiltIns.getInstance()); JetType valueType = value.getType(KotlinBuiltIns.getInstance());
if (!JetTypeChecker.INSTANCE.isSubtypeOf(valueType, expectedType)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(valueType, expectedType)) {
return reportError(CONSTANT_EXPECTED_TYPE_MISMATCH.on(expression, "integer", expectedType)); return reportError(CONSTANT_EXPECTED_TYPE_MISMATCH.on(expression, "integer", expectedType));
} }
} }
@@ -107,7 +107,7 @@ public class CompileTimeConstantChecker {
} }
if (!noExpectedTypeOrError(expectedType)) { if (!noExpectedTypeOrError(expectedType)) {
JetType valueType = value.getType(KotlinBuiltIns.getInstance()); JetType valueType = value.getType(KotlinBuiltIns.getInstance());
if (!JetTypeChecker.INSTANCE.isSubtypeOf(valueType, expectedType)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(valueType, expectedType)) {
return reportError(CONSTANT_EXPECTED_TYPE_MISMATCH.on(expression, "floating-point", expectedType)); return reportError(CONSTANT_EXPECTED_TYPE_MISMATCH.on(expression, "floating-point", expectedType));
} }
} }
@@ -119,7 +119,7 @@ public class CompileTimeConstantChecker {
@NotNull JetConstantExpression expression @NotNull JetConstantExpression expression
) { ) {
if (!noExpectedTypeOrError(expectedType) if (!noExpectedTypeOrError(expectedType)
&& !JetTypeChecker.INSTANCE.isSubtypeOf(builtIns.getBooleanType(), expectedType)) { && !JetTypeChecker.DEFAULT.isSubtypeOf(builtIns.getBooleanType(), expectedType)) {
return reportError(CONSTANT_EXPECTED_TYPE_MISMATCH.on(expression, "boolean", expectedType)); return reportError(CONSTANT_EXPECTED_TYPE_MISMATCH.on(expression, "boolean", expectedType));
} }
return false; return false;
@@ -127,7 +127,7 @@ public class CompileTimeConstantChecker {
private boolean checkCharValue(CompileTimeConstant<?> constant, JetType expectedType, JetConstantExpression expression) { private boolean checkCharValue(CompileTimeConstant<?> constant, JetType expectedType, JetConstantExpression expression) {
if (!noExpectedTypeOrError(expectedType) if (!noExpectedTypeOrError(expectedType)
&& !JetTypeChecker.INSTANCE.isSubtypeOf(builtIns.getCharType(), expectedType)) { && !JetTypeChecker.DEFAULT.isSubtypeOf(builtIns.getCharType(), expectedType)) {
return reportError(CONSTANT_EXPECTED_TYPE_MISMATCH.on(expression, "character", expectedType)); return reportError(CONSTANT_EXPECTED_TYPE_MISMATCH.on(expression, "character", expectedType));
} }
@@ -66,8 +66,8 @@ public class CastDiagnosticsUtil {
for (JetType aType : aTypes) { for (JetType aType : aTypes) {
for (JetType bType : bTypes) { for (JetType bType : bTypes) {
if (JetTypeChecker.INSTANCE.isSubtypeOf(aType, bType)) return true; if (JetTypeChecker.DEFAULT.isSubtypeOf(aType, bType)) return true;
if (JetTypeChecker.INSTANCE.isSubtypeOf(bType, aType)) return true; if (JetTypeChecker.DEFAULT.isSubtypeOf(bType, aType)) return true;
} }
} }
@@ -100,7 +100,7 @@ public class CastDiagnosticsUtil {
} }
private static boolean isFinal(@NotNull JetType type) { private static boolean isFinal(@NotNull JetType type) {
return !TypeUtils.canHaveSubtypes(JetTypeChecker.INSTANCE, type); return !TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, type);
} }
private static boolean isTrait(@NotNull JetType type) { private static boolean isTrait(@NotNull JetType type) {
@@ -212,7 +212,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
context.trace.report(CAST_NEVER_SUCCEEDS.on(expression.getOperationReference())); context.trace.report(CAST_NEVER_SUCCEEDS.on(expression.getOperationReference()));
} }
else { else {
JetTypeChecker typeChecker = JetTypeChecker.INSTANCE; JetTypeChecker typeChecker = JetTypeChecker.DEFAULT;
// Upcast? // Upcast?
if (typeChecker.isSubtypeOf(actualType, targetType)) { if (typeChecker.isSubtypeOf(actualType, targetType)) {
if (!typeChecker.isSubtypeOf(targetType, actualType)) { if (!typeChecker.isSubtypeOf(targetType, actualType)) {
@@ -668,7 +668,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
} }
else { else {
JetType receiverType = receiver.getType(); JetType receiverType = receiver.getType();
if (!JetTypeChecker.INSTANCE.isSubtypeOf(returnType, receiverType)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(returnType, receiverType)) {
context.trace.report(RESULT_TYPE_MISMATCH.on(operationSign, name.asString(), receiverType, returnType)); context.trace.report(RESULT_TYPE_MISMATCH.on(operationSign, name.asString(), receiverType, returnType));
} }
else { else {
@@ -221,7 +221,7 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor {
if (typeReference != null) { if (typeReference != null) {
type = components.expressionTypingServices.getTypeResolver().resolveType(context.scope, typeReference, context.trace, true); type = components.expressionTypingServices.getTypeResolver().resolveType(context.scope, typeReference, context.trace, true);
if (expectedType != null) { if (expectedType != null) {
if (!JetTypeChecker.INSTANCE.isSubtypeOf(expectedType, type)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(expectedType, type)) {
context.trace.report(EXPECTED_PARAMETER_TYPE_MISMATCH.on(declaredParameter, expectedType)); context.trace.report(EXPECTED_PARAMETER_TYPE_MISMATCH.on(declaredParameter, expectedType));
} }
} }
@@ -278,7 +278,7 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor {
// This is needed for ControlStructureTypingVisitor#visitReturnExpression() to properly type-check returned expressions // This is needed for ControlStructureTypingVisitor#visitReturnExpression() to properly type-check returned expressions
functionDescriptor.setReturnType(declaredReturnType); functionDescriptor.setReturnType(declaredReturnType);
if (expectedReturnType != null) { if (expectedReturnType != null) {
if (!JetTypeChecker.INSTANCE.isSubtypeOf(declaredReturnType, expectedReturnType)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(declaredReturnType, expectedReturnType)) {
context.trace.report(EXPECTED_RETURN_TYPE_MISMATCH.on(returnTypeRef, expectedReturnType)); context.trace.report(EXPECTED_RETURN_TYPE_MISMATCH.on(returnTypeRef, expectedReturnType));
} }
} }
@@ -355,7 +355,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
variableDescriptor = components.expressionTypingServices.getDescriptorResolver().resolveLocalVariableDescriptor(context.scope, loopParameter, context.trace); variableDescriptor = components.expressionTypingServices.getDescriptorResolver().resolveLocalVariableDescriptor(context.scope, loopParameter, context.trace);
JetType actualParameterType = variableDescriptor.getType(); JetType actualParameterType = variableDescriptor.getType();
if (expectedParameterType != null && if (expectedParameterType != null &&
!JetTypeChecker.INSTANCE.isSubtypeOf(expectedParameterType, actualParameterType)) { !JetTypeChecker.DEFAULT.isSubtypeOf(expectedParameterType, actualParameterType)) {
context.trace.report(TYPE_MISMATCH_IN_FOR_LOOP.on(typeReference, expectedParameterType, actualParameterType)); context.trace.report(TYPE_MISMATCH_IN_FOR_LOOP.on(typeReference, expectedParameterType, actualParameterType));
} }
} }
@@ -164,7 +164,7 @@ public class DataFlowUtils {
recordExpectedType(trace, expression, expectedType); recordExpectedType(trace, expression, expectedType);
if (expressionType == null || noExpectedType(expectedType) || !expectedType.getConstructor().isDenotable() || if (expressionType == null || noExpectedType(expectedType) || !expectedType.getConstructor().isDenotable() ||
JetTypeChecker.INSTANCE.isSubtypeOf(expressionType, expectedType)) { JetTypeChecker.DEFAULT.isSubtypeOf(expressionType, expectedType)) {
return expressionType; return expressionType;
} }
@@ -179,7 +179,7 @@ public class DataFlowUtils {
DataFlowValue dataFlowValue = DataFlowValueFactory.createDataFlowValue(expression, expressionType, trace.getBindingContext()); DataFlowValue dataFlowValue = DataFlowValueFactory.createDataFlowValue(expression, expressionType, trace.getBindingContext());
for (JetType possibleType : dataFlowInfo.getPossibleTypes(dataFlowValue)) { for (JetType possibleType : dataFlowInfo.getPossibleTypes(dataFlowValue)) {
if (JetTypeChecker.INSTANCE.isSubtypeOf(possibleType, expectedType)) { if (JetTypeChecker.DEFAULT.isSubtypeOf(possibleType, expectedType)) {
AutoCastUtils.recordCastOrError(expression, possibleType, trace, dataFlowValue.isStableIdentifier(), false); AutoCastUtils.recordCastOrError(expression, possibleType, trace, dataFlowValue.isStableIdentifier(), false);
return possibleType; return possibleType;
} }
@@ -96,7 +96,7 @@ public class ExpressionTypingUtils {
} }
public static boolean isBoolean(@NotNull JetType type) { public static boolean isBoolean(@NotNull JetType type) {
return JetTypeChecker.INSTANCE.isSubtypeOf(type, KotlinBuiltIns.getInstance().getBooleanType()); return JetTypeChecker.DEFAULT.isSubtypeOf(type, KotlinBuiltIns.getInstance().getBooleanType());
} }
public static boolean ensureBooleanResult(JetExpression operationSign, Name name, JetType resultType, ExpressionTypingContext context) { public static boolean ensureBooleanResult(JetExpression operationSign, Name name, JetType resultType, ExpressionTypingContext context) {
@@ -401,7 +401,7 @@ public class ExpressionTypingUtils {
context.trace.record(COMPONENT_RESOLVED_CALL, entry, results.getResultingCall()); context.trace.record(COMPONENT_RESOLVED_CALL, entry, results.getResultingCall());
componentType = results.getResultingDescriptor().getReturnType(); componentType = results.getResultingDescriptor().getReturnType();
if (componentType != null && !noExpectedType(expectedType) if (componentType != null && !noExpectedType(expectedType)
&& !JetTypeChecker.INSTANCE.isSubtypeOf(componentType, expectedType)) { && !JetTypeChecker.DEFAULT.isSubtypeOf(componentType, expectedType)) {
context.trace.report( context.trace.report(
COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH.on(reportErrorsOn, componentName, componentType, expectedType)); COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH.on(reportErrorsOn, componentName, componentType, expectedType));
@@ -254,7 +254,7 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor {
context = context.replaceDataFlowInfo(typeInfo.getDataFlowInfo()); context = context.replaceDataFlowInfo(typeInfo.getDataFlowInfo());
if (conditionExpected) { if (conditionExpected) {
JetType booleanType = KotlinBuiltIns.getInstance().getBooleanType(); JetType booleanType = KotlinBuiltIns.getInstance().getBooleanType();
if (!JetTypeChecker.INSTANCE.equalTypes(booleanType, type)) { if (!JetTypeChecker.DEFAULT.equalTypes(booleanType, type)) {
context.trace.report(TYPE_MISMATCH_IN_CONDITION.on(expression, type)); context.trace.report(TYPE_MISMATCH_IN_CONDITION.on(expression, type));
} }
else { else {
@@ -294,7 +294,7 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor {
context.trace.report(Errors.USELESS_NULLABLE_CHECK.on(nullableType)); context.trace.report(Errors.USELESS_NULLABLE_CHECK.on(nullableType));
} }
checkTypeCompatibility(context, type, subjectType, typeReferenceAfterIs); checkTypeCompatibility(context, type, subjectType, typeReferenceAfterIs);
if (CastDiagnosticsUtil.isCastErased(subjectType, type, JetTypeChecker.INSTANCE)) { if (CastDiagnosticsUtil.isCastErased(subjectType, type, JetTypeChecker.DEFAULT)) {
context.trace.report(Errors.CANNOT_CHECK_FOR_ERASED.on(typeReferenceAfterIs, type)); context.trace.report(Errors.CANNOT_CHECK_FOR_ERASED.on(typeReferenceAfterIs, type));
} }
return new DataFlowInfos(context.dataFlowInfo.establishSubtyping(subjectDataFlowValue, type), context.dataFlowInfo); return new DataFlowInfos(context.dataFlowInfo.establishSubtyping(subjectDataFlowValue, type), context.dataFlowInfo);
@@ -80,7 +80,7 @@ public class MainFunctionDetector {
List<TypeProjection> typeArguments = parameterType.getArguments(); List<TypeProjection> typeArguments = parameterType.getArguments();
if (typeArguments.size() == 1) { if (typeArguments.size() == 1) {
JetType typeArgument = typeArguments.get(0).getType(); JetType typeArgument = typeArguments.get(0).getType();
if (JetTypeChecker.INSTANCE.equalTypes(typeArgument, kotlinBuiltIns.getStringType())) { if (JetTypeChecker.DEFAULT.equalTypes(typeArgument, kotlinBuiltIns.getStringType())) {
return true; return true;
} }
} }
@@ -503,7 +503,7 @@ public class JetTypeCheckerTest extends JetLiteFixture {
for (String type : types) { for (String type : types) {
typesToIntersect.add(makeType(type)); typesToIntersect.add(makeType(type));
} }
JetType result = TypeUtils.intersect(JetTypeChecker.INSTANCE, typesToIntersect); JetType result = TypeUtils.intersect(JetTypeChecker.DEFAULT, typesToIntersect);
// assertNotNull("Intersection is null for " + typesToIntersect, result); // assertNotNull("Intersection is null for " + typesToIntersect, result);
assertEquals(makeType(expected), result); assertEquals(makeType(expected), result);
} }
@@ -520,7 +520,7 @@ public class JetTypeCheckerTest extends JetLiteFixture {
private void assertSubtypingRelation(String subtype, String supertype, boolean expected) { private void assertSubtypingRelation(String subtype, String supertype, boolean expected) {
JetType typeNode1 = makeType(subtype); JetType typeNode1 = makeType(subtype);
JetType typeNode2 = makeType(supertype); JetType typeNode2 = makeType(supertype);
boolean result = JetTypeChecker.INSTANCE.isSubtypeOf( boolean result = JetTypeChecker.DEFAULT.isSubtypeOf(
typeNode1, typeNode1,
typeNode2); typeNode2);
String modifier = expected ? "not " : ""; String modifier = expected ? "not " : "";
@@ -181,7 +181,7 @@ class LazyJavaClassDescriptor(
val candidateReturnType = candidate.getReturnType() val candidateReturnType = candidate.getReturnType()
val currentMostSpecificReturnType = currentMostSpecificType.getReturnType() val currentMostSpecificReturnType = currentMostSpecificType.getReturnType()
assert(candidateReturnType != null && currentMostSpecificReturnType != null, "$candidate, $currentMostSpecificReturnType") assert(candidateReturnType != null && currentMostSpecificReturnType != null, "$candidate, $currentMostSpecificReturnType")
if (JetTypeChecker.INSTANCE.isSubtypeOf(candidateReturnType!!, currentMostSpecificReturnType!!)) { if (JetTypeChecker.DEFAULT.isSubtypeOf(candidateReturnType!!, currentMostSpecificReturnType!!)) {
currentMostSpecificType = candidate currentMostSpecificType = candidate
} }
} }
@@ -147,7 +147,7 @@ class LazyJavaTypeResolver(
for (supertype in (classifier() as JavaTypeParameter).getUpperBounds()) { for (supertype in (classifier() as JavaTypeParameter).getUpperBounds()) {
supertypesJet.add(transformJavaType(supertype, UPPER_BOUND.toAttributes())) supertypesJet.add(transformJavaType(supertype, UPPER_BOUND.toAttributes()))
} }
return TypeUtils.intersect(JetTypeChecker.INSTANCE, supertypesJet) return TypeUtils.intersect(JetTypeChecker.DEFAULT, supertypesJet)
?: ErrorUtils.createErrorType("Can't intersect upper bounds of " + javaType.getPresentableText()) ?: ErrorUtils.createErrorType("Can't intersect upper bounds of " + javaType.getPresentableText())
} }
@@ -132,7 +132,7 @@ public abstract class AbstractTypeParameterDescriptor extends DeclarationDescrip
private JetType computeUpperBoundsAsType() { private JetType computeUpperBoundsAsType() {
Set<JetType> upperBounds = getUpperBounds(); Set<JetType> upperBounds = getUpperBounds();
assert !upperBounds.isEmpty() : "Upper bound list is empty in " + getName(); assert !upperBounds.isEmpty() : "Upper bound list is empty in " + getName();
JetType upperBoundsAsType = TypeUtils.intersect(JetTypeChecker.INSTANCE, upperBounds); JetType upperBoundsAsType = TypeUtils.intersect(JetTypeChecker.DEFAULT, upperBounds);
return upperBoundsAsType != null ? upperBoundsAsType : KotlinBuiltIns.getInstance().getNothingType(); return upperBoundsAsType != null ? upperBoundsAsType : KotlinBuiltIns.getInstance().getNothingType();
} }
@@ -459,7 +459,7 @@ public class DescriptorUtils {
JetType nullableString = TypeUtils.makeNullable(KotlinBuiltIns.getInstance().getStringType()); JetType nullableString = TypeUtils.makeNullable(KotlinBuiltIns.getInstance().getStringType());
return "valueOf".equals(functionDescriptor.getName().asString()) return "valueOf".equals(functionDescriptor.getName().asString())
&& methodTypeParameters.size() == 1 && methodTypeParameters.size() == 1
&& JetTypeChecker.INSTANCE.isSubtypeOf(methodTypeParameters.get(0).getType(), nullableString); && JetTypeChecker.DEFAULT.isSubtypeOf(methodTypeParameters.get(0).getType(), nullableString);
} }
public static boolean isEnumValuesMethod(@NotNull FunctionDescriptor functionDescriptor) { public static boolean isEnumValuesMethod(@NotNull FunctionDescriptor functionDescriptor) {
@@ -113,7 +113,7 @@ public class OverridingUtil {
JetType superValueParameterType = getUpperBound(superValueParameters.get(i)); JetType superValueParameterType = getUpperBound(superValueParameters.get(i));
JetType subValueParameterType = getUpperBound(subValueParameters.get(i)); JetType subValueParameterType = getUpperBound(subValueParameters.get(i));
// TODO: compare erasure // TODO: compare erasure
if (!JetTypeChecker.INSTANCE.equalTypes(superValueParameterType, subValueParameterType)) { if (!JetTypeChecker.DEFAULT.equalTypes(superValueParameterType, subValueParameterType)) {
return OverrideCompatibilityInfo.typeParameterNumberMismatch(); return OverrideCompatibilityInfo.typeParameterNumberMismatch();
} }
} }
@@ -165,7 +165,7 @@ public class OverridingUtil {
if (superReturnType != null && subReturnType != null) { if (superReturnType != null && subReturnType != null) {
boolean bothErrors = subReturnType.isError() && superReturnType.isError(); boolean bothErrors = subReturnType.isError() && superReturnType.isError();
if (!bothErrors && !JetTypeChecker.INSTANCE.isSubtypeOf(subReturnType, superReturnType, localEqualityAxioms)) { if (!bothErrors && !JetTypeChecker.DEFAULT.isSubtypeOf(subReturnType, superReturnType, localEqualityAxioms)) {
return OverrideCompatibilityInfo.returnTypeMismatch(superReturnType, subReturnType); return OverrideCompatibilityInfo.returnTypeMismatch(superReturnType, subReturnType);
} }
} }
@@ -203,7 +203,7 @@ public class OverridingUtil {
@NotNull JetTypeChecker.TypeConstructorEquality axioms @NotNull JetTypeChecker.TypeConstructorEquality axioms
) { ) {
boolean bothErrors = typeInSuper.isError() && typeInSub.isError(); boolean bothErrors = typeInSuper.isError() && typeInSub.isError();
if (!bothErrors && !JetTypeChecker.INSTANCE.equalTypes(typeInSuper, typeInSub, axioms)) { if (!bothErrors && !JetTypeChecker.DEFAULT.equalTypes(typeInSuper, typeInSub, axioms)) {
return false; return false;
} }
return true; return true;
@@ -317,7 +317,7 @@ public class OverridingUtil {
JetType bReturnType = b.getReturnType(); JetType bReturnType = b.getReturnType();
assert bReturnType != null; assert bReturnType != null;
return JetTypeChecker.INSTANCE.isSubtypeOf(aReturnType, bReturnType); return JetTypeChecker.DEFAULT.isSubtypeOf(aReturnType, bReturnType);
} }
if (a instanceof PropertyDescriptor) { if (a instanceof PropertyDescriptor) {
assert b instanceof PropertyDescriptor : "b is " + b.getClass(); assert b instanceof PropertyDescriptor : "b is " + b.getClass();
@@ -327,7 +327,7 @@ public class OverridingUtil {
} }
// both vals // both vals
return JetTypeChecker.INSTANCE.isSubtypeOf(((PropertyDescriptor) a).getType(), ((PropertyDescriptor) b).getType()); return JetTypeChecker.DEFAULT.isSubtypeOf(((PropertyDescriptor) a).getType(), ((PropertyDescriptor) b).getType());
} }
throw new IllegalArgumentException("Unexpected callable: " + a.getClass()); throw new IllegalArgumentException("Unexpected callable: " + a.getClass());
} }
@@ -197,7 +197,7 @@ public class TypeBoundsImpl implements TypeBounds {
} }
Set<JetType> upperBounds = filterBounds(bounds, BoundKind.UPPER_BOUND, values); Set<JetType> upperBounds = filterBounds(bounds, BoundKind.UPPER_BOUND, values);
JetType intersectionOfUpperBounds = TypeUtils.intersect(JetTypeChecker.INSTANCE, upperBounds); JetType intersectionOfUpperBounds = TypeUtils.intersect(JetTypeChecker.DEFAULT, upperBounds);
if (!upperBounds.isEmpty() && intersectionOfUpperBounds != null) { if (!upperBounds.isEmpty() && intersectionOfUpperBounds != null) {
if (tryPossibleAnswer(intersectionOfUpperBounds)) { if (tryPossibleAnswer(intersectionOfUpperBounds)) {
return Collections.singleton(intersectionOfUpperBounds); return Collections.singleton(intersectionOfUpperBounds);
@@ -216,19 +216,19 @@ public class TypeBoundsImpl implements TypeBounds {
for (Bound bound : bounds) { for (Bound bound : bounds) {
switch (bound.kind) { switch (bound.kind) {
case LOWER_BOUND: case LOWER_BOUND:
if (!JetTypeChecker.INSTANCE.isSubtypeOf(bound.type, possibleAnswer)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(bound.type, possibleAnswer)) {
return false; return false;
} }
break; break;
case UPPER_BOUND: case UPPER_BOUND:
if (!JetTypeChecker.INSTANCE.isSubtypeOf(possibleAnswer, bound.type)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(possibleAnswer, bound.type)) {
return false; return false;
} }
break; break;
case EXACT_BOUND: case EXACT_BOUND:
if (!JetTypeChecker.INSTANCE.equalTypes(bound.type, possibleAnswer)) { if (!JetTypeChecker.DEFAULT.equalTypes(bound.type, possibleAnswer)) {
return false; return false;
} }
break; break;
@@ -352,7 +352,7 @@ public class WritableScopeImpl extends WritableScopeWithImports {
for (VariableDescriptor oldProperty : properties) { for (VariableDescriptor oldProperty : properties) {
ReceiverParameterDescriptor receiverParameterForOldVariable = oldProperty.getReceiverParameter(); ReceiverParameterDescriptor receiverParameterForOldVariable = oldProperty.getReceiverParameter();
if (((receiverParameter != null && receiverParameterForOldVariable != null) && if (((receiverParameter != null && receiverParameterForOldVariable != null) &&
(JetTypeChecker.INSTANCE.equalTypes(receiverParameter.getType(), receiverParameterForOldVariable.getType())))) { (JetTypeChecker.DEFAULT.equalTypes(receiverParameter.getType(), receiverParameterForOldVariable.getType())))) {
redeclarationHandler.handleRedeclaration(oldProperty, variableDescriptor); redeclarationHandler.handleRedeclaration(oldProperty, variableDescriptor);
} }
} }
@@ -37,7 +37,7 @@ public abstract class AbstractJetType implements JetType {
JetType type = (JetType) obj; JetType type = (JetType) obj;
return isNullable() == type.isNullable() && JetTypeChecker.INSTANCE.equalTypes(this, type); return isNullable() == type.isNullable() && JetTypeChecker.DEFAULT.equalTypes(this, type);
} }
@Override @Override
@@ -216,7 +216,7 @@ public class CommonSupertypes {
} }
if (ins != null) { if (ins != null) {
JetType intersection = TypeUtils.intersect(JetTypeChecker.INSTANCE, ins); JetType intersection = TypeUtils.intersect(JetTypeChecker.DEFAULT, ins);
if (intersection == null) { if (intersection == null) {
if (outs != null) { if (outs != null) {
return new TypeProjectionImpl(OUT_VARIANCE, commonSupertype(outs)); return new TypeProjectionImpl(OUT_VARIANCE, commonSupertype(outs));
@@ -142,7 +142,7 @@ public class TypeUtils {
} }
public static boolean isIntersectionEmpty(@NotNull JetType typeA, @NotNull JetType typeB) { public static boolean isIntersectionEmpty(@NotNull JetType typeA, @NotNull JetType typeB) {
return intersect(JetTypeChecker.INSTANCE, Sets.newLinkedHashSet(Lists.newArrayList(typeA, typeB))) == null; return intersect(JetTypeChecker.DEFAULT, Sets.newLinkedHashSet(Lists.newArrayList(typeA, typeB))) == null;
} }
@Nullable @Nullable
@@ -473,7 +473,7 @@ public class TypeUtils {
} }
public static boolean equalTypes(@NotNull JetType a, @NotNull JetType b) { public static boolean equalTypes(@NotNull JetType a, @NotNull JetType b) {
return JetTypeChecker.INSTANCE.isSubtypeOf(a, b) && JetTypeChecker.INSTANCE.isSubtypeOf(b, a); return JetTypeChecker.DEFAULT.isSubtypeOf(a, b) && JetTypeChecker.DEFAULT.isSubtypeOf(b, a);
} }
public static boolean dependsOnTypeParameters(@NotNull JetType type, @NotNull Collection<TypeParameterDescriptor> typeParameters) { public static boolean dependsOnTypeParameters(@NotNull JetType type, @NotNull Collection<TypeParameterDescriptor> typeParameters) {
@@ -586,7 +586,7 @@ public class TypeUtils {
return getDefaultPrimitiveNumberType(numberValueTypeConstructor); return getDefaultPrimitiveNumberType(numberValueTypeConstructor);
} }
for (JetType primitiveNumberType : numberValueTypeConstructor.getSupertypes()) { for (JetType primitiveNumberType : numberValueTypeConstructor.getSupertypes()) {
if (JetTypeChecker.INSTANCE.isSubtypeOf(primitiveNumberType, expectedType)) { if (JetTypeChecker.DEFAULT.isSubtypeOf(primitiveNumberType, expectedType)) {
return primitiveNumberType; return primitiveNumberType;
} }
} }
@@ -22,7 +22,7 @@ import org.jetbrains.jet.lang.types.TypeConstructor;
public class JetTypeChecker { public class JetTypeChecker {
public static final JetTypeChecker INSTANCE = new JetTypeChecker(); public static final JetTypeChecker DEFAULT = new JetTypeChecker();
public interface TypeConstructorEquality { public interface TypeConstructorEquality {
boolean equals(@NotNull TypeConstructor a, @NotNull TypeConstructor b); boolean equals(@NotNull TypeConstructor a, @NotNull TypeConstructor b);
} }
@@ -172,7 +172,7 @@ fun createLookupElement(descriptor: DeclarationDescriptor, resolveSession: Resol
return if (descriptor is FunctionDescriptor && descriptor.getValueParameters().isNotEmpty()) element.keepOldArgumentListOnTab() else element return if (descriptor is FunctionDescriptor && descriptor.getValueParameters().isNotEmpty()) element.keepOldArgumentListOnTab() else element
} }
fun JetType.isSubtypeOf(expectedType: JetType) = !isError() && JetTypeChecker.INSTANCE.isSubtypeOf(this, expectedType) fun JetType.isSubtypeOf(expectedType: JetType) = !isError() && JetTypeChecker.DEFAULT.isSubtypeOf(this, expectedType)
fun <T : Any> T?.toList(): List<T> = if (this != null) listOf(this) else listOf() fun <T : Any> T?.toList(): List<T> = if (this != null) listOf(this) else listOf()
fun <T : Any> T?.toSet(): Set<T> = if (this != null) setOf(this) else setOf() fun <T : Any> T?.toSet(): Set<T> = if (this != null) setOf(this) else setOf()
@@ -35,7 +35,7 @@ public open class ReplaceContainsIntention : AttributeCallReplacementIntention("
val ret = call.resolved.getResultingDescriptor().getReturnType() val ret = call.resolved.getResultingDescriptor().getReturnType()
?: return intentionFailed(editor, "undefined.returntype") ?: return intentionFailed(editor, "undefined.returntype")
if (!JetTypeChecker.INSTANCE.isSubtypeOf(ret, KotlinBuiltIns.getInstance().getBooleanType())) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(ret, KotlinBuiltIns.getInstance().getBooleanType())) {
return intentionFailed(editor, "contains.returns.boolean") return intentionFailed(editor, "contains.returns.boolean")
} }
@@ -327,7 +327,7 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith
if (argument.getArgumentExpression() != null) { if (argument.getArgumentExpression() != null) {
JetType paramType = getActualParameterType(param); JetType paramType = getActualParameterType(param);
JetType exprType = bindingContext.get(BindingContext.EXPRESSION_TYPE, argument.getArgumentExpression()); JetType exprType = bindingContext.get(BindingContext.EXPRESSION_TYPE, argument.getArgumentExpression());
return exprType == null || JetTypeChecker.INSTANCE.isSubtypeOf(exprType, paramType); return exprType == null || JetTypeChecker.DEFAULT.isSubtypeOf(exprType, paramType);
} }
return false; return false;
@@ -127,7 +127,7 @@ public class AddFunctionParametersFix extends ChangeFunctionSignatureFix {
JetType argumentType = expression != null ? bindingContext.get(BindingContext.EXPRESSION_TYPE, expression) : null; JetType argumentType = expression != null ? bindingContext.get(BindingContext.EXPRESSION_TYPE, expression) : null;
JetType parameterType = parameters.get(i).getType(); JetType parameterType = parameters.get(i).getType();
if (argumentType != null && !JetTypeChecker.INSTANCE.isSubtypeOf(argumentType, parameterType)) if (argumentType != null && !JetTypeChecker.DEFAULT.isSubtypeOf(argumentType, parameterType))
changeSignatureData.getParameters().get(i).setTypeText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(argumentType)); changeSignatureData.getParameters().get(i).setTypeText(DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(argumentType));
} }
else { else {
@@ -76,10 +76,10 @@ public class AddFunctionToSupertypeFix extends JetHintAction<JetNamedFunction> {
if (o1.equals(o2)) { if (o1.equals(o2)) {
return 0; return 0;
} }
if (JetTypeChecker.INSTANCE.isSubtypeOf(o1, o2)) { if (JetTypeChecker.DEFAULT.isSubtypeOf(o1, o2)) {
return -1; return -1;
} }
if (JetTypeChecker.INSTANCE.isSubtypeOf(o2, o1)) { if (JetTypeChecker.DEFAULT.isSubtypeOf(o2, o1)) {
return 1; return 1;
} }
return o1.toString().compareTo(o2.toString()); return o1.toString().compareTo(o2.toString());
@@ -76,7 +76,7 @@ public class AddNameToArgumentFix extends JetIntentionAction<JetValueArgument> {
for (ValueParameterDescriptor parameter: callableDescriptor.getValueParameters()) { for (ValueParameterDescriptor parameter: callableDescriptor.getValueParameters()) {
String name = parameter.getName().asString(); String name = parameter.getName().asString();
if (usedParameters.contains(name)) continue; if (usedParameters.contains(name)) continue;
if (type == null || JetTypeChecker.INSTANCE.isSubtypeOf(type, parameter.getType())) { if (type == null || JetTypeChecker.DEFAULT.isSubtypeOf(type, parameter.getType())) {
names.add(name); names.add(name);
} }
} }
@@ -61,7 +61,7 @@ public class CastExpressionFix extends JetIntentionAction<JetExpression> {
if (!super.isAvailable(project, editor, file)) return false; if (!super.isAvailable(project, editor, file)) return false;
BindingContext context = ResolvePackage.getBindingContext((JetFile) file); BindingContext context = ResolvePackage.getBindingContext((JetFile) file);
JetType expressionType = context.get(BindingContext.EXPRESSION_TYPE, element); JetType expressionType = context.get(BindingContext.EXPRESSION_TYPE, element);
return expressionType != null && JetTypeChecker.INSTANCE.isSubtypeOf(type, expressionType); return expressionType != null && JetTypeChecker.DEFAULT.isSubtypeOf(type, expressionType);
} }
@Override @Override
@@ -68,7 +68,7 @@ public class ChangeFunctionLiteralReturnTypeFix extends JetIntentionAction<JetFu
if (correspondingProperty != null && QuickFixUtil.canEvaluateTo(correspondingProperty.getInitializer(), element)) { if (correspondingProperty != null && QuickFixUtil.canEvaluateTo(correspondingProperty.getInitializer(), element)) {
JetTypeReference correspondingPropertyTypeRef = correspondingProperty.getTypeRef(); JetTypeReference correspondingPropertyTypeRef = correspondingProperty.getTypeRef();
JetType propertyType = context.get(BindingContext.TYPE, correspondingPropertyTypeRef); JetType propertyType = context.get(BindingContext.TYPE, correspondingPropertyTypeRef);
if (propertyType != null && !JetTypeChecker.INSTANCE.isSubtypeOf(eventualFunctionLiteralType, propertyType)) { if (propertyType != null && !JetTypeChecker.DEFAULT.isSubtypeOf(eventualFunctionLiteralType, propertyType)) {
appropriateQuickFix = new ChangeVariableTypeFix(correspondingProperty, eventualFunctionLiteralType); appropriateQuickFix = new ChangeVariableTypeFix(correspondingProperty, eventualFunctionLiteralType);
} }
return; return;
@@ -78,7 +78,7 @@ public class ChangeFunctionLiteralReturnTypeFix extends JetIntentionAction<JetFu
if (correspondingParameter != null) { if (correspondingParameter != null) {
JetTypeReference correspondingParameterTypeRef = correspondingParameter.getTypeReference(); JetTypeReference correspondingParameterTypeRef = correspondingParameter.getTypeReference();
JetType parameterType = context.get(BindingContext.TYPE, correspondingParameterTypeRef); JetType parameterType = context.get(BindingContext.TYPE, correspondingParameterTypeRef);
if (parameterType != null && !JetTypeChecker.INSTANCE.isSubtypeOf(eventualFunctionLiteralType, parameterType)) { if (parameterType != null && !JetTypeChecker.DEFAULT.isSubtypeOf(eventualFunctionLiteralType, parameterType)) {
appropriateQuickFix = new ChangeParameterTypeFix(correspondingParameter, eventualFunctionLiteralType); appropriateQuickFix = new ChangeParameterTypeFix(correspondingParameter, eventualFunctionLiteralType);
} }
return; return;
@@ -88,7 +88,7 @@ public class ChangeFunctionLiteralReturnTypeFix extends JetIntentionAction<JetFu
if (parentFunction != null && QuickFixUtil.canFunctionOrGetterReturnExpression(parentFunction, element)) { if (parentFunction != null && QuickFixUtil.canFunctionOrGetterReturnExpression(parentFunction, element)) {
JetTypeReference parentFunctionReturnTypeRef = parentFunction.getReturnTypeRef(); JetTypeReference parentFunctionReturnTypeRef = parentFunction.getReturnTypeRef();
JetType parentFunctionReturnType = context.get(BindingContext.TYPE, parentFunctionReturnTypeRef); JetType parentFunctionReturnType = context.get(BindingContext.TYPE, parentFunctionReturnTypeRef);
if (parentFunctionReturnType != null && !JetTypeChecker.INSTANCE.isSubtypeOf(eventualFunctionLiteralType, parentFunctionReturnType)) { if (parentFunctionReturnType != null && !JetTypeChecker.DEFAULT.isSubtypeOf(eventualFunctionLiteralType, parentFunctionReturnType)) {
appropriateQuickFix = new ChangeFunctionReturnTypeFix(parentFunction, eventualFunctionLiteralType); appropriateQuickFix = new ChangeFunctionReturnTypeFix(parentFunction, eventualFunctionLiteralType);
} }
} }
@@ -217,7 +217,7 @@ public class ChangeFunctionReturnTypeFix extends JetIntentionAction<JetFunction>
for (FunctionDescriptor overriddenFunction: descriptor.getOverriddenDescriptors()) { for (FunctionDescriptor overriddenFunction: descriptor.getOverriddenDescriptors()) {
JetType overriddenFunctionType = overriddenFunction.getReturnType(); JetType overriddenFunctionType = overriddenFunction.getReturnType();
if (overriddenFunctionType == null) continue; if (overriddenFunctionType == null) continue;
if (!JetTypeChecker.INSTANCE.isSubtypeOf(functionType, overriddenFunctionType)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(functionType, overriddenFunctionType)) {
overriddenMismatchingFunctions.add(overriddenFunction); overriddenMismatchingFunctions.add(overriddenFunction);
} }
} }
@@ -132,7 +132,7 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiE
argumentExpression != null ? bindingContext.get(BindingContext.EXPRESSION_TYPE, argumentExpression) : null; argumentExpression != null ? bindingContext.get(BindingContext.EXPRESSION_TYPE, argumentExpression) : null;
JetType parameterType = parameters.get(i).getType(); JetType parameterType = parameters.get(i).getType();
if (argumentType == null || !JetTypeChecker.INSTANCE.isSubtypeOf(argumentType, parameterType)) { if (argumentType == null || !JetTypeChecker.DEFAULT.isSubtypeOf(argumentType, parameterType)) {
return true; return true;
} }
} }
@@ -188,7 +188,7 @@ public class ChangeMemberFunctionSignatureFix extends JetHintAction<JetNamedFunc
@NotNull ValueParameterDescriptor superParameter @NotNull ValueParameterDescriptor superParameter
) { ) {
// TODO: support for generic functions // TODO: support for generic functions
if (JetTypeChecker.INSTANCE.equalTypes(parameter.getType(), superParameter.getType())) { if (JetTypeChecker.DEFAULT.equalTypes(parameter.getType(), superParameter.getType())) {
return superParameter.copy(parameter.getContainingDeclaration(), parameter.getName()); return superParameter.copy(parameter.getContainingDeclaration(), parameter.getName());
} }
else { else {
@@ -150,14 +150,14 @@ public class ChangeVariableTypeFix extends JetIntentionAction<JetVariableDeclara
for (PropertyDescriptor overriddenProperty: propertyDescriptor.getOverriddenDescriptors()) { for (PropertyDescriptor overriddenProperty: propertyDescriptor.getOverriddenDescriptors()) {
JetType overriddenPropertyType = overriddenProperty.getReturnType(); JetType overriddenPropertyType = overriddenProperty.getReturnType();
if (overriddenPropertyType != null) { if (overriddenPropertyType != null) {
if (!JetTypeChecker.INSTANCE.isSubtypeOf(propertyType, overriddenPropertyType)) { if (!JetTypeChecker.DEFAULT.isSubtypeOf(propertyType, overriddenPropertyType)) {
overriddenMismatchingProperties.add(overriddenProperty); overriddenMismatchingProperties.add(overriddenProperty);
} }
else if (overriddenProperty.isVar() && !JetTypeChecker.INSTANCE.equalTypes(overriddenPropertyType, propertyType)) { else if (overriddenProperty.isVar() && !JetTypeChecker.DEFAULT.equalTypes(overriddenPropertyType, propertyType)) {
canChangeOverriddenPropertyType = false; canChangeOverriddenPropertyType = false;
} }
if (overriddenProperty.isVar() && lowerBoundOfOverriddenPropertiesTypes != null && if (overriddenProperty.isVar() && lowerBoundOfOverriddenPropertiesTypes != null &&
!JetTypeChecker.INSTANCE.equalTypes(lowerBoundOfOverriddenPropertiesTypes, overriddenPropertyType)) { !JetTypeChecker.DEFAULT.equalTypes(lowerBoundOfOverriddenPropertiesTypes, overriddenPropertyType)) {
lowerBoundOfOverriddenPropertiesTypes = null; lowerBoundOfOverriddenPropertiesTypes = null;
} }
} }
@@ -476,7 +476,7 @@ private fun JetNamedDeclaration.guessType(context: BindingContext): Array<JetTyp
if (expectedTypes.isEmpty() || expectedTypes.any { expectedType -> ErrorUtils.containsErrorType(expectedType) }) { if (expectedTypes.isEmpty() || expectedTypes.any { expectedType -> ErrorUtils.containsErrorType(expectedType) }) {
return array<JetType>() return array<JetType>()
} }
val theType = TypeUtils.intersect(JetTypeChecker.INSTANCE, expectedTypes) val theType = TypeUtils.intersect(JetTypeChecker.DEFAULT, expectedTypes)
if (theType != null) { if (theType != null) {
return array<JetType>(theType) return array<JetType>(theType)
} }
@@ -494,8 +494,8 @@ private class JetTypeSubstitution(public val forType: JetType, public val byType
private fun JetType.substitute(substitution: JetTypeSubstitution, variance: Variance): JetType { private fun JetType.substitute(substitution: JetTypeSubstitution, variance: Variance): JetType {
if (when (variance) { if (when (variance) {
Variance.INVARIANT -> this == substitution.forType Variance.INVARIANT -> this == substitution.forType
Variance.IN_VARIANCE -> JetTypeChecker.INSTANCE.isSubtypeOf(this, substitution.forType) Variance.IN_VARIANCE -> JetTypeChecker.DEFAULT.isSubtypeOf(this, substitution.forType)
Variance.OUT_VARIANCE -> JetTypeChecker.INSTANCE.isSubtypeOf(substitution.forType, this) Variance.OUT_VARIANCE -> JetTypeChecker.DEFAULT.isSubtypeOf(substitution.forType, this)
}) { }) {
return substitution.byType return substitution.byType
} }
@@ -90,10 +90,10 @@ public class QuickFixUtil {
if (overriddenReturnType == null) { if (overriddenReturnType == null) {
return null; return null;
} }
if (matchingReturnType == null || JetTypeChecker.INSTANCE.isSubtypeOf(overriddenReturnType, matchingReturnType)) { if (matchingReturnType == null || JetTypeChecker.DEFAULT.isSubtypeOf(overriddenReturnType, matchingReturnType)) {
matchingReturnType = overriddenReturnType; matchingReturnType = overriddenReturnType;
} }
else if (!JetTypeChecker.INSTANCE.isSubtypeOf(matchingReturnType, overriddenReturnType)) { else if (!JetTypeChecker.DEFAULT.isSubtypeOf(matchingReturnType, overriddenReturnType)) {
return null; return null;
} }
} }
@@ -98,7 +98,7 @@ public class JetNameSuggester {
private static void addNamesForType(ArrayList<String> result, JetType jetType, JetNameValidator validator) { private static void addNamesForType(ArrayList<String> result, JetType jetType, JetNameValidator validator) {
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance(); KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
JetTypeChecker typeChecker = JetTypeChecker.INSTANCE; JetTypeChecker typeChecker = JetTypeChecker.DEFAULT;
jetType = TypeUtils.makeNotNullable(jetType); // wipe out '?' jetType = TypeUtils.makeNotNullable(jetType); // wipe out '?'
if (ErrorUtils.containsErrorType(jetType)) return; if (ErrorUtils.containsErrorType(jetType)) return;
if (typeChecker.equalTypes(builtIns.getBooleanType(), jetType)) { if (typeChecker.equalTypes(builtIns.getBooleanType(), jetType)) {
@@ -440,7 +440,7 @@ public class JetRefactoringUtil {
BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement(expression); BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement(expression);
JetType expressionType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expression); JetType expressionType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expression);
if (expressionType == null || !(expressionType instanceof PackageType) && if (expressionType == null || !(expressionType instanceof PackageType) &&
!JetTypeChecker.INSTANCE.equalTypes(KotlinBuiltIns. !JetTypeChecker.DEFAULT.equalTypes(KotlinBuiltIns.
getInstance().getUnitType(), expressionType)) { getInstance().getUnitType(), expressionType)) {
expressions.add(expression); expressions.add(expression);
} }
@@ -31,11 +31,8 @@ import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.HelpID; import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.introduce.inplace.OccurrencesChooser; import com.intellij.refactoring.introduce.inplace.OccurrencesChooser;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.analyzer.AnalyzerPackage; import org.jetbrains.jet.analyzer.AnalyzerPackage;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -139,7 +136,7 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase {
JetType typeNoExpectedType = AnalyzerPackage.computeTypeInfoInContext( JetType typeNoExpectedType = AnalyzerPackage.computeTypeInfoInContext(
expression, scope, bindingTrace, dataFlowInfo, TypeUtils.NO_EXPECTED_TYPE, resolveSession.getModuleDescriptor() expression, scope, bindingTrace, dataFlowInfo, TypeUtils.NO_EXPECTED_TYPE, resolveSession.getModuleDescriptor()
).getType(); ).getType();
if (expressionType != null && typeNoExpectedType != null && !JetTypeChecker.INSTANCE.equalTypes(expressionType, if (expressionType != null && typeNoExpectedType != null && !JetTypeChecker.DEFAULT.equalTypes(expressionType,
typeNoExpectedType)) { typeNoExpectedType)) {
noTypeInference = true; noTypeInference = true;
} }
@@ -149,7 +146,7 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase {
return; return;
} }
if (expressionType != null && if (expressionType != null &&
JetTypeChecker.INSTANCE.equalTypes(KotlinBuiltIns.getInstance().getUnitType(), expressionType)) { JetTypeChecker.DEFAULT.equalTypes(KotlinBuiltIns.getInstance().getUnitType(), expressionType)) {
showErrorHint(project, editor, JetRefactoringBundle.message("cannot.refactor.expression.has.unit.type")); showErrorHint(project, editor, JetRefactoringBundle.message("cannot.refactor.expression.has.unit.type"));
return; return;
} }