diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/typeUtils.kt b/idea/ide-common/src/org/jetbrains/kotlin/util/substitutionUtils.kt similarity index 60% rename from idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/typeUtils.kt rename to idea/ide-common/src/org/jetbrains/kotlin/util/substitutionUtils.kt index fca58008fe9..ce6491da092 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/typeUtils.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/util/substitutionUtils.kt @@ -14,17 +14,15 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.refactoring.changeSignature +package org.jetbrains.kotlin.types.substitutions import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.JetCallableDefinitionUsage -import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure import java.util.LinkedHashMap -private fun getTypeSubstitution(baseType: JetType, derivedType: JetType): LinkedHashMap? { +public fun getTypeSubstitution(baseType: JetType, derivedType: JetType): LinkedHashMap? { val substitutedType = TypeCheckingProcedure.findCorrespondingSupertype(derivedType, baseType) ?: return null val substitution = LinkedHashMap(substitutedType.getArguments().size()) @@ -35,7 +33,7 @@ private fun getTypeSubstitution(baseType: JetType, derivedType: JetType): Linked return substitution } -private fun getCallableSubstitution( +public fun getCallableSubstitution( baseCallable: CallableDescriptor, derivedCallable: CallableDescriptor ): MutableMap? { @@ -50,23 +48,13 @@ private fun getCallableSubstitution( return substitution } -fun getTypeSubstitutor(baseType: JetType, derivedType: JetType): TypeSubstitutor? { +public fun getCallableSubstitutor( + baseCallable: CallableDescriptor, + derivedCallable: CallableDescriptor +): TypeSubstitutor? { + return getCallableSubstitution(baseCallable, derivedCallable)?.let { TypeSubstitutor.create(it) } +} + +public fun getTypeSubstitutor(baseType: JetType, derivedType: JetType): TypeSubstitutor? { return getTypeSubstitution(baseType, derivedType)?.let { TypeSubstitutor.create(it) } } - -fun getCallableSubstitutor( - baseFunction: JetCallableDefinitionUsage<*>, - derivedCallable: JetCallableDefinitionUsage<*> -): TypeSubstitutor? { - val currentBaseFunction = baseFunction.getCurrentCallableDescriptor() - val currentDerivedFunction = derivedCallable.getCurrentCallableDescriptor() - if (currentBaseFunction == null || currentDerivedFunction == null) return null - - return getCallableSubstitution(currentBaseFunction, currentDerivedFunction)?.let { TypeSubstitutor.create(it) } -} - -fun JetType.renderTypeWithSubstitution(substitutor: TypeSubstitutor?, defaultText: String, inArgumentPosition: Boolean): String { - val newType = substitutor?.substitute(this, Variance.INVARIANT) ?: return defaultText - val renderer = if (inArgumentPosition) IdeDescriptorRenderers.SOURCE_CODE_FOR_TYPE_ARGUMENTS else IdeDescriptorRenderers.SOURCE_CODE - return renderer.renderType(newType) -} diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/changeSignatureUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/changeSignatureUtils.kt index 3effd19684b..983be4304b9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/changeSignatureUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/changeSignatureUtils.kt @@ -22,9 +22,15 @@ import com.intellij.refactoring.changeSignature.OverriderUsageInfo import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.DeferredJavaMethodKotlinCallerUsage import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.JavaMethodKotlinUsageWithDelegate +import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.JetCallableDefinitionUsage import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallerUsage +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf +import org.jetbrains.kotlin.types.JetType +import org.jetbrains.kotlin.types.TypeSubstitutor +import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.substitutions.getCallableSubstitutor private fun JetNamedDeclaration.getDeclarationBody(): JetElement? { return when { @@ -56,4 +62,19 @@ public fun JetElement.isInsideOfCallerBody(allUsages: Array): Boo } as? JetNamedDeclaration ?: return false val body = container.getDeclarationBody() ?: return false return body.getTextRange().contains(getTextRange()) && container.isCaller(allUsages) +} + +fun getCallableSubstitutor( + baseFunction: JetCallableDefinitionUsage<*>, + derivedCallable: JetCallableDefinitionUsage<*> +): TypeSubstitutor? { + val currentBaseFunction = baseFunction.getCurrentCallableDescriptor() ?: return null + val currentDerivedFunction = derivedCallable.getCurrentCallableDescriptor() ?: return null + return getCallableSubstitutor(currentBaseFunction, currentDerivedFunction) +} + +fun JetType.renderTypeWithSubstitution(substitutor: TypeSubstitutor?, defaultText: String, inArgumentPosition: Boolean): String { + val newType = substitutor?.substitute(this, Variance.INVARIANT) ?: return defaultText + val renderer = if (inArgumentPosition) IdeDescriptorRenderers.SOURCE_CODE_FOR_TYPE_ARGUMENTS else IdeDescriptorRenderers.SOURCE_CODE + return renderer.renderType(newType) } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetCallableDefinitionUsage.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetCallableDefinitionUsage.java index d25a1132d0b..1b9c7c24c93 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetCallableDefinitionUsage.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetCallableDefinitionUsage.java @@ -26,7 +26,6 @@ import kotlin.KotlinPackage; import kotlin.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; @@ -38,7 +37,6 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.ChangeSignaturePack import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetChangeInfo; import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetParameterInfo; import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetValVar; -import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers; import org.jetbrains.kotlin.idea.util.ShortenReferences; import org.jetbrains.kotlin.idea.util.ShortenReferences.Options; import org.jetbrains.kotlin.lexer.JetModifierKeywordToken; @@ -50,6 +48,8 @@ import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode; import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.TypeSubstitutor; +import org.jetbrains.kotlin.types.TypesPackage; +import org.jetbrains.kotlin.types.substitutions.SubstitutionsPackage; import java.util.List; @@ -126,7 +126,7 @@ public class JetCallableDefinitionUsage extends JetUsageIn if (!(classDescriptor instanceof ClassDescriptor)) return null; - typeSubstitutor = ChangeSignaturePackage.getTypeSubstitutor( + typeSubstitutor = SubstitutionsPackage.getTypeSubstitutor( ((ClassDescriptor) classDescriptor).getDefaultType(), samCallType );