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 {
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
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(
expressionType,
c.expectedType,
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.types.JetType
public interface AdditionalTypeChecker {
fun checkType(expression: JetExpression, expressionType: JetType, c: ResolutionContext<*>)
fun checkType(expression: JetExpression, expressionType: JetType, expressionTypeWithSmartCast: JetType, c: ResolutionContext<*>)
fun checkReceiver(
receiverParameter: ReceiverParameterDescriptor,
receiverArgument: ReceiverValue,
@@ -164,24 +164,13 @@ public class DataFlowAnalyzer {
return typeInfo.replaceType(checkType(typeInfo.getType(), expression, context));
}
@Nullable
public JetType checkType(
@Nullable JetType expressionType,
@NotNull JetExpression expressionToCheck,
@NotNull
private JetType checkTypeInternal(
@NotNull JetType expressionType,
@NotNull JetExpression expression,
@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() ||
JetTypeChecker.DEFAULT.isSubtypeOf(expressionType, c.expectedType)) {
return expressionType;
@@ -208,6 +197,35 @@ public class DataFlowAnalyzer {
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
public JetType checkPossibleCast(
@NotNull JetType expressionType,