diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index 76e4b3ca030..94893848801 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -27,12 +27,10 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.load.java.JvmAbi -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.PropertyImportedFromObject -import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny import org.jetbrains.kotlin.resolve.jvm.AsmTypes.* import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin @@ -224,7 +222,7 @@ class PropertyReferenceCodegen( @JvmStatic fun createFakeOpenDescriptor(getFunction: FunctionDescriptor, classDescriptor: ClassDescriptor): FunctionDescriptor { val copy = getFunction.original.copy(classDescriptor, Modality.OPEN, getFunction.visibility, getFunction.kind, false) - return copy.substitute(ANY_SUBSTITUTOR) + return copy.substitute(ANY_SUBSTITUTOR)!! } @JvmStatic diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt index 8343d1106c7..7fd5de6c62f 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt @@ -364,7 +364,7 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager, private val l } val classParametersSubstitutor = TypeSubstitutor.create(substitutionMap) - descriptor.getMethod = getMethod.substitute(classParametersSubstitutor) + descriptor.getMethod = getMethod.substitute(classParametersSubstitutor) ?: return null descriptor.setMethod = setMethod?.substitute(classParametersSubstitutor) return descriptor } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index 9f7bee01d06..825f745361d 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -181,7 +181,7 @@ class SamAdapterFunctionsScope( TypeConstructorSubstitution.createByConstructorsMap( substitutionMap, configuration.substitution.approximateCapturedTypes()).buildSubstitutor() - descriptor.baseDescriptorForSynthetic = original.baseDescriptorForSynthetic.substitute(sourceFunctionSubstitutor) + descriptor.baseDescriptorForSynthetic = original.baseDescriptorForSynthetic.substitute(sourceFunctionSubstitutor) ?: return null return descriptor } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/importedFromObject.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/importedFromObject.kt index 5124fb69bd0..53b87f86c82 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/importedFromObject.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/importedFromObject.kt @@ -31,7 +31,7 @@ class FunctionImportedFromObject(functionFromObject: FunctionDescriptor) : ImportedFromObjectCallableDescriptor(functionFromObject) { override fun getDispatchReceiverParameter(): ReceiverParameterDescriptor? = null - override fun substitute(substitutor: TypeSubstitutor) = callableFromObject.substitute(substitutor).wrap() + override fun substitute(substitutor: TypeSubstitutor) = callableFromObject.substitute(substitutor)?.wrap() private val _original by lazy { functionFromObject.original.wrap() diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt index 6c4e18340b6..dad9968c4a3 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt @@ -53,7 +53,7 @@ fun createSynthesizedInvokes(functions: Collection): Collect fakeOverride } - result.add(synthesized.substitute(TypeSubstitutor.create(invoke.getDispatchReceiverParameter()!!.type))) + result.add(synthesized.substitute(TypeSubstitutor.create(invoke.getDispatchReceiverParameter()!!.type)) ?: continue) } return result diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassConstructorDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassConstructorDescriptor.kt index f97e4b2ace2..f9318566929 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassConstructorDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassConstructorDescriptor.kt @@ -24,7 +24,7 @@ interface ClassConstructorDescriptor : ConstructorDescriptor { override fun getOriginal(): ClassConstructorDescriptor - override fun substitute(substitutor: TypeSubstitutor): ClassConstructorDescriptor + override fun substitute(substitutor: TypeSubstitutor): ClassConstructorDescriptor? override fun copy( newOwner: DeclarationDescriptor, diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java index 8202a9dc270..22b63a70f05 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.descriptors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.TypeSubstitutor; @@ -43,7 +44,7 @@ public interface ConstructorDescriptor extends FunctionDescriptor { @Override ConstructorDescriptor getOriginal(); - @NotNull + @Nullable @Override ConstructorDescriptor substitute(@NotNull TypeSubstitutor substitutor); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java index c09bc57a52f..8c98ca1f183 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.annotations.Annotations; -import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.TypeSubstitution; @@ -37,7 +36,7 @@ public interface FunctionDescriptor extends CallableMemberDescriptor { @Override FunctionDescriptor getOriginal(); - @NotNull + @Nullable @Override FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassConstructorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassConstructorDescriptorImpl.java index 60247c95834..f0c209ad3d1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassConstructorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ClassConstructorDescriptorImpl.java @@ -106,7 +106,7 @@ public class ClassConstructorDescriptorImpl extends FunctionDescriptorImpl imple return (ClassConstructorDescriptor) super.getOriginal(); } - @NotNull + @Nullable @Override public ClassConstructorDescriptor substitute(@NotNull TypeSubstitutor originalSubstitutor) { return (ClassConstructorDescriptor) super.substitute(originalSubstitutor); diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt index 6e835a009e5..d2bf07a70ab 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt @@ -153,7 +153,7 @@ class LookupElementFactory( //TODO: order for them val fuzzyParameterType = parameterType.toFuzzyType(descriptor.typeParameters) for ((variable, substitutor) in contextVariablesProvider.functionTypeVariables(fuzzyParameterType)) { - val substitutedDescriptor = descriptor.substitute(substitutor) + val substitutedDescriptor = descriptor.substitute(substitutor) ?: continue add(createFunctionCallElementWithArguments(substitutedDescriptor, variable.name.render(), useReceiverTypes)) } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt index dad6230167d..99bd216f91b 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/TypeInstantiationItems.kt @@ -210,7 +210,7 @@ class TypeInstantiationItems( 1 -> { val constructor = visibleConstructors.single() val substitutor = TypeSubstitutor.create(fuzzyType.presentationType()) - val substitutedConstructor = constructor.substitute(substitutor) + val substitutedConstructor = constructor.substitute(substitutor) ?: constructor // render original signature if failed to substitute BasicLookupElementFactory.SHORT_NAMES_RENDERER.renderFunctionParameters(substitutedConstructor) } diff --git a/idea/idea-completion/testData/basic/common/KT13780.kt b/idea/idea-completion/testData/basic/common/KT13780.kt new file mode 100644 index 00000000000..cf0c1107f3b --- /dev/null +++ b/idea/idea-completion/testData/basic/common/KT13780.kt @@ -0,0 +1,9 @@ +class ResolvedCall(val candidateDescriptor: D) + +fun test(myResolvedCall: ResolvedCall) { + bar(my) +} + +fun bar(foo: ResolvedCall<*>) {} + +// EXIST: myResolvedCall \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/common/KT13780_1.kt b/idea/idea-completion/testData/basic/common/KT13780_1.kt new file mode 100644 index 00000000000..621f21ed8df --- /dev/null +++ b/idea/idea-completion/testData/basic/common/KT13780_1.kt @@ -0,0 +1,9 @@ +class ResolvedCall(val candidateDescriptor: D) + +fun test(myResolvedCall: ResolvedCall) { + bar(my) +} + +fun bar(foo: ResolvedCall) {} + +// EXIST: myResolvedCall \ No newline at end of file diff --git a/idea/idea-completion/testData/smart/constructor/StarProjection1.kt b/idea/idea-completion/testData/smart/constructor/StarProjection1.kt new file mode 100644 index 00000000000..fc16737987a --- /dev/null +++ b/idea/idea-completion/testData/smart/constructor/StarProjection1.kt @@ -0,0 +1,9 @@ +class X() + +fun test() { + bar() +} + +fun bar(foo: X<*>) {} + +// EXIST: { lookupString:"X", itemText:"X", tailText:"() ()" } diff --git a/idea/idea-completion/testData/smart/constructor/StarProjection2.kt b/idea/idea-completion/testData/smart/constructor/StarProjection2.kt new file mode 100644 index 00000000000..a1ed91598c6 --- /dev/null +++ b/idea/idea-completion/testData/smart/constructor/StarProjection2.kt @@ -0,0 +1,9 @@ +class X(d: D) + +fun test() { + bar() +} + +fun bar(foo: X<*>) {} + +// EXIST: { lookupString:"X", itemText:"X", tailText:"(d: D) ()" } diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index a7f3cc6ee32..188dbd5ff18 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -493,6 +493,18 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("KT13780.kt") + public void testKT13780() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/KT13780.kt"); + doTest(fileName); + } + + @TestMetadata("KT13780_1.kt") + public void testKT13780_1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/KT13780_1.kt"); + doTest(fileName); + } + @TestMetadata("LocalMultideclarationValues.kt") public void testLocalMultideclarationValues() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/LocalMultideclarationValues.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index feb3091f96a..91e97e74467 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -493,6 +493,18 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("KT13780.kt") + public void testKT13780() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/KT13780.kt"); + doTest(fileName); + } + + @TestMetadata("KT13780_1.kt") + public void testKT13780_1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/KT13780_1.kt"); + doTest(fileName); + } + @TestMetadata("LocalMultideclarationValues.kt") public void testLocalMultideclarationValues() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/LocalMultideclarationValues.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java index e84869d6d2a..284d810b3da 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java @@ -874,6 +874,18 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest(fileName); } + @TestMetadata("StarProjection1.kt") + public void testStarProjection1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/smart/constructor/StarProjection1.kt"); + doTest(fileName); + } + + @TestMetadata("StarProjection2.kt") + public void testStarProjection2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/smart/constructor/StarProjection2.kt"); + doTest(fileName); + } + @TestMetadata("WithParameters.kt") public void testWithParameters() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/smart/constructor/WithParameters.kt"); diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/TypesWithOperatorDetector.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/TypesWithOperatorDetector.kt index 82b426ac22b..6b58dc32665 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/TypesWithOperatorDetector.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/TypesWithOperatorDetector.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.typeUtil.TypeNullability import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.isValidOperator +import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* abstract class TypesWithOperatorDetector( @@ -70,7 +71,7 @@ abstract class TypesWithOperatorDetector( } val substitutor = checkIsSuitableByType(function, freeParameters) ?: continue - add(function.substitute(substitutor)) + addIfNotNull(function.substitute(substitutor)) } return this } @@ -90,18 +91,17 @@ abstract class TypesWithOperatorDetector( if (type.nullability() != TypeNullability.NULLABLE) { for (memberFunction in type.type.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_IDE)) { if (memberFunction.isValidOperator()) { - checkIsSuitableByType(memberFunction, type.freeParameters)?.let { substitutor -> - return Pair(memberFunction.substitute(substitutor), substitutor) - } + val substitutor = checkIsSuitableByType(memberFunction, type.freeParameters) ?: continue + val substituted = memberFunction.substitute(substitutor) ?: continue + return substituted to substitutor } } } for (operator in extensionOperators) { - val substitutor = type.checkIsSubtypeOf(operator.fuzzyExtensionReceiverType()!!) - if (substitutor != null) { - return Pair(operator.substitute(substitutor), substitutor) - } + val substitutor = type.checkIsSubtypeOf(operator.fuzzyExtensionReceiverType()!!) ?: continue + val substituted = operator.substitute(substitutor) ?: continue + return substituted to substitutor } return null diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt index bb6606bee01..6ae45454148 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt @@ -29,11 +29,11 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers -import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.renderer.DescriptorRenderer @@ -72,7 +72,7 @@ object SuperClassNotInitialized : KotlinIntentionActionsFactory() { val substitutedConstructors = constructors .filter { it.valueParameters.isNotEmpty() } - .map { it.substitute(substitutor) } + .mapNotNull { it.substitute(substitutor) } if (substitutedConstructors.isNotEmpty()) { val parameterTypes: List> = substitutedConstructors.map {