diff --git a/compiler/backend/src/org/jetbrains/jet/compiler/TipsManager.java b/compiler/backend/src/org/jetbrains/jet/compiler/TipsManager.java index 0857ebfa235..64ff3cd9c77 100644 --- a/compiler/backend/src/org/jetbrains/jet/compiler/TipsManager.java +++ b/compiler/backend/src/org/jetbrains/jet/compiler/TipsManager.java @@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.NamespaceType; +import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.Variance; import java.util.*; @@ -170,7 +171,8 @@ public final class TipsManager { @NotNull final ReceiverDescriptor receiverDescriptor ) { // It's impossible to add extension function for namespace - if (receiverDescriptor.getType() instanceof NamespaceType) { + JetType receiverType = receiverDescriptor.getType(); + if (receiverType instanceof NamespaceType) { return descriptors; } @@ -189,11 +191,25 @@ public final class TipsManager { } /* - * Checks if receiver declaration could be resolved to call expected receiver. - */ + * Checks if receiver declaration could be resolved to call expected receiver. + */ private static boolean checkReceiverResolution ( @NotNull ReceiverDescriptor expectedReceiver, @NotNull CallableDescriptor receiverArgument + ) { + JetType type = expectedReceiver.getType(); + if (checkReceiverResolution(expectedReceiver, type, receiverArgument)) return true; + if (type.isNullable()) { + JetType notNullableType = TypeUtils.makeNotNullable(type); + if (checkReceiverResolution(expectedReceiver, notNullableType, receiverArgument)) return true; + } + return false; + } + + private static boolean checkReceiverResolution ( + @NotNull ReceiverDescriptor expectedReceiver, + @NotNull JetType receiverType, + @NotNull CallableDescriptor receiverArgument ) { ConstraintSystem constraintSystem = new ConstraintSystemImpl(ConstraintResolutionListener.DO_NOTHING); for (TypeParameterDescriptor typeParameterDescriptor : receiverArgument.getTypeParameters()) { @@ -203,7 +219,7 @@ public final class TipsManager { ReceiverDescriptor receiverParameter = receiverArgument.getReceiverParameter(); if (expectedReceiver.exists() && receiverParameter.exists()) { constraintSystem.addSubtypingConstraint( - RECEIVER.assertSubtyping(expectedReceiver.getType(), receiverParameter.getType())); + RECEIVER.assertSubtyping(receiverType, receiverParameter.getType())); } else if (expectedReceiver.exists() || receiverParameter.exists()) { // Only one of receivers exist diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java index 4c7fdce6fa0..89ce7d74eba 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java @@ -106,10 +106,12 @@ public class TypeUtils { } }; + @NotNull public static JetType makeNullable(@NotNull JetType type) { return makeNullableAsSpecified(type, true); } + @NotNull public static JetType makeNotNullable(@NotNull JetType type) { return makeNullableAsSpecified(type, false); } diff --git a/idea/testData/parameterInfo/functionParameterInfo/NotGreen.kt b/idea/testData/parameterInfo/functionParameterInfo/NotGreen.kt index 850ce1bcc85..a9f3d171fb2 100644 --- a/idea/testData/parameterInfo/functionParameterInfo/NotGreen.kt +++ b/idea/testData/parameterInfo/functionParameterInfo/NotGreen.kt @@ -3,8 +3,10 @@ open class A(x: Int) { fun m(x: Int) = 1 fun d(x: Int) { - m(1, false, false) + m(1, false, false) } } /* +Text: (x: Int), Disabled: false, Strikeout: false, Green: false +Text: (x: Int, y: Boolean), Disabled: false, Strikeout: false, Green: false */ \ No newline at end of file diff --git a/idea/testData/parameterInfo/functionParameterInfo/NullableTypeCall.kt b/idea/testData/parameterInfo/functionParameterInfo/NullableTypeCall.kt new file mode 100644 index 00000000000..2ce1311500d --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/NullableTypeCall.kt @@ -0,0 +1,19 @@ +class A() + +fun A.index(x: Int) : Int { + return 1 +} +fun A.index(x: Int, y: Int) : Int { + return x + y +} + +fun f() { + val command : A? = null + if (command != null){ + command.index() + } +} +/* +Text: (x: Int), Disabled: false, Strikeout: false, Green: false +Text: (x: Int, y: Int), Disabled: false, Strikeout: false, Green: false +*/ \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoTest.java b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoTest.java index af85db9f592..e19655c5cd8 100644 --- a/idea/tests/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/parameterInfo/JetFunctionParameterInfoTest.java @@ -52,6 +52,10 @@ public class JetFunctionParameterInfoTest extends LightCodeInsightFixtureTestCas doTest(); } + public void testNullableTypeCall() { + doTest(); + } + public void testPrintln() { doTest(); }