Make call to additional type checker if no error happened

This commit is contained in:
Denis Zharkov
2015-08-28 19:08:55 +03:00
parent 4853e4f1cc
commit 3b80bf5bda
4 changed files with 37 additions and 19 deletions
@@ -84,7 +84,7 @@ public class RuntimeAssertionInfo(public val needNotNullAssertion: Boolean, publ
} }
public object RuntimeAssertionsTypeChecker : AdditionalTypeChecker { public object RuntimeAssertionsTypeChecker : AdditionalTypeChecker {
override fun checkType(expression: JetExpression, expressionType: JetType, c: ResolutionContext<*>) { override fun checkType(expression: JetExpression, expressionType: JetType, expressionTypeWithSmartCast: JetType, c: ResolutionContext<*>) {
if (TypeUtils.noExpectedType(c.expectedType)) return if (TypeUtils.noExpectedType(c.expectedType)) return
val assertionInfo = RuntimeAssertionInfo.create( val assertionInfo = RuntimeAssertionInfo.create(
@@ -346,7 +346,7 @@ public class JavaNullabilityWarningsChecker : AdditionalTypeChecker {
} }
} }
override fun checkType(expression: JetExpression, expressionType: JetType, c: ResolutionContext<*>) { override fun checkType(expression: JetExpression, expressionType: JetType, expressionTypeWithSmartCast: JetType, c: ResolutionContext<*>) {
doCheckType( doCheckType(
expressionType, expressionType,
c.expectedType, c.expectedType,
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.JetType
public interface AdditionalTypeChecker { public interface AdditionalTypeChecker {
fun checkType(expression: JetExpression, expressionType: JetType, c: ResolutionContext<*>) fun checkType(expression: JetExpression, expressionType: JetType, expressionTypeWithSmartCast: JetType, c: ResolutionContext<*>)
fun checkReceiver( fun checkReceiver(
receiverParameter: ReceiverParameterDescriptor, receiverParameter: ReceiverParameterDescriptor,
receiverArgument: ReceiverValue, receiverArgument: ReceiverValue,
@@ -164,24 +164,13 @@ public class DataFlowAnalyzer {
return typeInfo.replaceType(checkType(typeInfo.getType(), expression, context)); return typeInfo.replaceType(checkType(typeInfo.getType(), expression, context));
} }
@Nullable @NotNull
public JetType checkType( private JetType checkTypeInternal(
@Nullable JetType expressionType, @NotNull JetType expressionType,
@NotNull JetExpression expressionToCheck, @NotNull JetExpression expression,
@NotNull ResolutionContext c, @NotNull ResolutionContext c,
@Nullable Ref<Boolean> hasError @NotNull Ref<Boolean> hasError
) { ) {
if (hasError != null) hasError.set(false);
JetExpression expression = JetPsiUtil.safeDeparenthesize(expressionToCheck, false);
recordExpectedType(c.trace, expression, c.expectedType);
if (expressionType == null) return null;
for (AdditionalTypeChecker checker : additionalTypeCheckers) {
checker.checkType(expression, expressionType, c);
}
if (noExpectedType(c.expectedType) || !c.expectedType.getConstructor().isDenotable() || if (noExpectedType(c.expectedType) || !c.expectedType.getConstructor().isDenotable() ||
JetTypeChecker.DEFAULT.isSubtypeOf(expressionType, c.expectedType)) { JetTypeChecker.DEFAULT.isSubtypeOf(expressionType, c.expectedType)) {
return expressionType; return expressionType;
@@ -208,6 +197,35 @@ public class DataFlowAnalyzer {
return expressionType; return expressionType;
} }
@Nullable
public JetType checkType(
@Nullable JetType expressionType,
@NotNull JetExpression expressionToCheck,
@NotNull ResolutionContext c,
@Nullable Ref<Boolean> hasError
) {
if (hasError == null) {
hasError = Ref.create(false);
}
else {
hasError.set(false);
}
JetExpression expression = JetPsiUtil.safeDeparenthesize(expressionToCheck, false);
recordExpectedType(c.trace, expression, c.expectedType);
if (expressionType == null) return null;
JetType result = checkTypeInternal(expressionType, expression, c, hasError);
if (Boolean.FALSE.equals(hasError.get())) {
for (AdditionalTypeChecker checker : additionalTypeCheckers) {
checker.checkType(expression, expressionType, result, c);
}
}
return result;
}
@Nullable @Nullable
public JetType checkPossibleCast( public JetType checkPossibleCast(
@NotNull JetType expressionType, @NotNull JetType expressionType,