From 3b80bf5bdab3fc37630fc75f9092b4cd86d0e8c8 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 28 Aug 2015 19:08:55 +0300 Subject: [PATCH] Make call to additional type checker if no error happened --- .../jetbrains/kotlin/jvm/RuntimeAssertions.kt | 2 +- .../jvm/platform/JvmPlatformConfigurator.kt | 2 +- .../calls/checkers/AdditionalTypeChecker.kt | 2 +- .../types/expressions/DataFlowAnalyzer.java | 50 +++++++++++++------ 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/jvm/RuntimeAssertions.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/jvm/RuntimeAssertions.kt index c42d9a6bf48..9b4be230f03 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/jvm/RuntimeAssertions.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/jvm/RuntimeAssertions.kt @@ -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( diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt index 74b1ea05f75..f9b40563c61 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt @@ -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, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AdditionalTypeChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AdditionalTypeChecker.kt index e7887564604..7acb8b0e4ab 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AdditionalTypeChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/AdditionalTypeChecker.kt @@ -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, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DataFlowAnalyzer.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DataFlowAnalyzer.java index c77db2d44b2..a28004bb8cb 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DataFlowAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DataFlowAnalyzer.java @@ -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 hasError + @NotNull Ref 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 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,