Make call to additional type checker if no error happened
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
+1
-1
@@ -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,
|
||||||
|
|||||||
+1
-1
@@ -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,
|
||||||
|
|||||||
+34
-16
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user