Change Signature: Support Change Signature quick-fix for Java -> Kotlin case
#KT-9401 Fixed
This commit is contained in:
@@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.psi.PsiComment
|
import com.intellij.psi.PsiComment
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiFileFactory
|
import com.intellij.psi.PsiFileFactory
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import com.intellij.util.LocalTimeCounter
|
import com.intellij.util.LocalTimeCounter
|
||||||
@@ -39,7 +40,7 @@ private val DO_NOT_ANALYZE_NOTIFICATION = "This file was created by KtPsiFactory
|
|||||||
|
|
||||||
var KtFile.doNotAnalyze: String? by UserDataProperty(Key.create("DO_NOT_ANALYZE"))
|
var KtFile.doNotAnalyze: String? by UserDataProperty(Key.create("DO_NOT_ANALYZE"))
|
||||||
var KtFile.analysisContext: PsiElement? by UserDataProperty(Key.create("ANALYSIS_CONTEXT"))
|
var KtFile.analysisContext: PsiElement? by UserDataProperty(Key.create("ANALYSIS_CONTEXT"))
|
||||||
var KtFile.moduleInfo: ModuleInfo? by UserDataProperty(Key.create("MODULE_INFO"))
|
var PsiFile.moduleInfo: ModuleInfo? by UserDataProperty(Key.create("MODULE_INFO"))
|
||||||
|
|
||||||
class KtPsiFactory(private val project: Project) {
|
class KtPsiFactory(private val project: Project) {
|
||||||
|
|
||||||
|
|||||||
+15
@@ -20,6 +20,7 @@ package org.jetbrains.kotlin.idea.caches.resolve
|
|||||||
|
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import org.jetbrains.kotlin.asJava.KtLightClass
|
import org.jetbrains.kotlin.asJava.KtLightClass
|
||||||
|
import org.jetbrains.kotlin.asJava.unwrapped
|
||||||
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
|
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
|
||||||
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.load.java.structure.*
|
|||||||
import org.jetbrains.kotlin.load.java.structure.impl.*
|
import org.jetbrains.kotlin.load.java.structure.impl.*
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
|
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
|
||||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
@@ -67,6 +69,19 @@ fun PsiMember.getJavaMemberDescriptor(resolutionFacade: ResolutionFacade? = null
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmOverloads
|
||||||
|
fun PsiMember.getJavaOrKotlinMemberDescriptor(resolutionFacade: ResolutionFacade? = null): DeclarationDescriptor? {
|
||||||
|
val callable = unwrapped
|
||||||
|
return when (callable) {
|
||||||
|
is PsiMember -> getJavaMemberDescriptor(resolutionFacade)
|
||||||
|
is KtDeclaration -> {
|
||||||
|
val descriptor = resolutionFacade?.resolveToDescriptor(callable) ?: callable.resolveToDescriptor()
|
||||||
|
if (descriptor is ClassDescriptor && this is PsiMethod) descriptor.unsubstitutedPrimaryConstructor else descriptor
|
||||||
|
}
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun PsiClass.resolveToDescriptor(
|
fun PsiClass.resolveToDescriptor(
|
||||||
resolutionFacade: ResolutionFacade,
|
resolutionFacade: ResolutionFacade,
|
||||||
declarationTranslator: (KtClassOrObject) -> KtClassOrObject? = { it }
|
declarationTranslator: (KtClassOrObject) -> KtClassOrObject? = { it }
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ fun PsiElement.getNullableModuleInfo(): IdeaModuleInfo? = this.getModuleInfo { r
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun PsiElement.getModuleInfo(onFailure: (String) -> IdeaModuleInfo?): IdeaModuleInfo? {
|
private fun PsiElement.getModuleInfo(onFailure: (String) -> IdeaModuleInfo?): IdeaModuleInfo? {
|
||||||
|
(containingFile.moduleInfo as? IdeaModuleInfo)?.let { return it }
|
||||||
|
|
||||||
if (this is KtLightElement<*, *>) return this.getModuleInfoForLightElement(onFailure)
|
if (this is KtLightElement<*, *>) return this.getModuleInfoForLightElement(onFailure)
|
||||||
|
|
||||||
val containingJetFile = (this as? KtElement)?.containingFile as? KtFile
|
val containingJetFile = (this as? KtElement)?.containingFile as? KtFile
|
||||||
|
|||||||
@@ -36,11 +36,13 @@ import org.jetbrains.kotlin.descriptors.Visibilities
|
|||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getJavaMethodDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.getJavaMethodDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.getJavaOrKotlinMemberDescriptor
|
||||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor.Kind
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor.Kind
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallableDefinitionUsage
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallableDefinitionUsage
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallerUsage
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallerUsage
|
||||||
import org.jetbrains.kotlin.idea.refactoring.j2k
|
import org.jetbrains.kotlin.idea.refactoring.j2k
|
||||||
|
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
@@ -518,10 +520,13 @@ val KotlinChangeInfo.oldName: String?
|
|||||||
|
|
||||||
fun KotlinChangeInfo.getAffectedCallables(): Collection<UsageInfo> = methodDescriptor.affectedCallables + propagationTargetUsageInfos
|
fun KotlinChangeInfo.getAffectedCallables(): Collection<UsageInfo> = methodDescriptor.affectedCallables + propagationTargetUsageInfos
|
||||||
|
|
||||||
fun ChangeInfo.toJetChangeInfo(originalChangeSignatureDescriptor: KotlinMethodDescriptor): KotlinChangeInfo {
|
fun ChangeInfo.toJetChangeInfo(
|
||||||
|
originalChangeSignatureDescriptor: KotlinMethodDescriptor,
|
||||||
|
resolutionFacade: ResolutionFacade? = null
|
||||||
|
): KotlinChangeInfo {
|
||||||
val method = method as PsiMethod
|
val method = method as PsiMethod
|
||||||
|
|
||||||
val functionDescriptor = method.getJavaMethodDescriptor()!!
|
val functionDescriptor = method.getJavaOrKotlinMemberDescriptor(resolutionFacade) as CallableDescriptor
|
||||||
val parameterDescriptors = functionDescriptor.valueParameters
|
val parameterDescriptors = functionDescriptor.valueParameters
|
||||||
|
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
|
|||||||
+40
-17
@@ -38,20 +38,15 @@ import com.intellij.util.containers.MultiMap
|
|||||||
import org.jetbrains.kotlin.asJava.KtLightMethod
|
import org.jetbrains.kotlin.asJava.KtLightMethod
|
||||||
import org.jetbrains.kotlin.asJava.namedUnwrappedElement
|
import org.jetbrains.kotlin.asJava.namedUnwrappedElement
|
||||||
import org.jetbrains.kotlin.asJava.toLightMethods
|
import org.jetbrains.kotlin.asJava.toLightMethods
|
||||||
|
import org.jetbrains.kotlin.asJava.unwrapped
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.idea.analysis.analyzeInContext
|
import org.jetbrains.kotlin.idea.analysis.analyzeInContext
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.*
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getJavaMethodDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.KotlinFileReferencesResolver
|
import org.jetbrains.kotlin.idea.codeInsight.KotlinFileReferencesResolver
|
||||||
import org.jetbrains.kotlin.idea.core.compareDescriptors
|
import org.jetbrains.kotlin.idea.core.compareDescriptors
|
||||||
import org.jetbrains.kotlin.idea.refactoring.createTempCopy
|
import org.jetbrains.kotlin.idea.refactoring.*
|
||||||
import org.jetbrains.kotlin.idea.refactoring.isTrueJavaMethod
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.*
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.*
|
||||||
import org.jetbrains.kotlin.idea.refactoring.getBodyScope
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.getContainingScope
|
|
||||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
import org.jetbrains.kotlin.idea.references.mainReference
|
||||||
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
|
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
|
||||||
@@ -435,10 +430,9 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun findKotlinOverrides(changeInfo: ChangeInfo, result: MutableSet<UsageInfo>) {
|
private fun findKotlinOverrides(changeInfo: ChangeInfo, result: MutableSet<UsageInfo>) {
|
||||||
val method = changeInfo.method
|
val method = changeInfo.method as? PsiMethod ?: return
|
||||||
if (!method.isTrueJavaMethod()) return
|
|
||||||
|
|
||||||
for (overridingMethod in OverridingMethodsSearch.search(method as PsiMethod)) {
|
for (overridingMethod in OverridingMethodsSearch.search(method)) {
|
||||||
val unwrappedElement = overridingMethod.namedUnwrappedElement as? KtNamedFunction ?: continue
|
val unwrappedElement = overridingMethod.namedUnwrappedElement as? KtNamedFunction ?: continue
|
||||||
val functionDescriptor = unwrappedElement.resolveToDescriptorIfAny() as? FunctionDescriptor ?: continue
|
val functionDescriptor = unwrappedElement.resolveToDescriptorIfAny() as? FunctionDescriptor ?: continue
|
||||||
result.add(DeferredJavaMethodOverrideOrSAMUsage(unwrappedElement, functionDescriptor, null))
|
result.add(DeferredJavaMethodOverrideOrSAMUsage(unwrappedElement, functionDescriptor, null))
|
||||||
@@ -856,8 +850,12 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor {
|
|||||||
val descriptorWrapper = usages.firstIsInstanceOrNull<OriginalJavaMethodDescriptorWrapper>()
|
val descriptorWrapper = usages.firstIsInstanceOrNull<OriginalJavaMethodDescriptorWrapper>()
|
||||||
if (descriptorWrapper == null || descriptorWrapper.originalJavaMethodDescriptor != null) return true
|
if (descriptorWrapper == null || descriptorWrapper.originalJavaMethodDescriptor != null) return true
|
||||||
|
|
||||||
val methodDescriptor = method.getJavaMethodDescriptor()?.createDeepCopy() ?: return false
|
val baseDeclaration = method.unwrapped ?: return false
|
||||||
descriptorWrapper.originalJavaMethodDescriptor = KotlinChangeSignatureData(methodDescriptor, method, listOf(methodDescriptor))
|
val baseDeclarationDescriptor = method.getJavaOrKotlinMemberDescriptor()?.createDeepCopy() as CallableDescriptor?
|
||||||
|
?: return false
|
||||||
|
descriptorWrapper.originalJavaMethodDescriptor = KotlinChangeSignatureData(baseDeclarationDescriptor,
|
||||||
|
baseDeclaration,
|
||||||
|
listOf(baseDeclarationDescriptor))
|
||||||
|
|
||||||
// This change info is used as a placeholder before primary method update
|
// This change info is used as a placeholder before primary method update
|
||||||
// It gets replaced with real change info afterwards
|
// It gets replaced with real change info afterwards
|
||||||
@@ -910,12 +908,37 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun processPrimaryMethod(changeInfo: ChangeInfo): Boolean {
|
override fun processPrimaryMethod(changeInfo: ChangeInfo): Boolean {
|
||||||
if (changeInfo !is KotlinChangeInfo) return false
|
val ktChangeInfo = when (changeInfo) {
|
||||||
|
is KotlinChangeInfo -> changeInfo
|
||||||
|
is JavaChangeInfo -> {
|
||||||
|
val method = changeInfo.method as? KtLightMethod ?: return false
|
||||||
|
var baseFunction = method.getOrigin() ?: return false
|
||||||
|
if (baseFunction is KtClass) {
|
||||||
|
baseFunction = baseFunction.createPrimaryConstructorIfAbsent()
|
||||||
|
}
|
||||||
|
val resolutionFacade = baseFunction.getResolutionFacade()
|
||||||
|
val baseFunctionDescriptor = resolutionFacade.resolveToDescriptor(baseFunction) as FunctionDescriptor
|
||||||
|
val methodDescriptor = KotlinChangeSignatureData(baseFunctionDescriptor, baseFunction, listOf(baseFunctionDescriptor))
|
||||||
|
|
||||||
for (primaryFunction in changeInfo.methodDescriptor.primaryCallables) {
|
val dummyClass = JavaPsiFacade.getElementFactory(method.project).createClass("Dummy")
|
||||||
primaryFunction.processUsage(changeInfo, primaryFunction.declaration, UsageInfo.EMPTY_ARRAY)
|
val dummyMethod = createJavaMethod(method, dummyClass)
|
||||||
|
dummyMethod.containingFile.moduleInfo = baseFunction.getModuleInfo()
|
||||||
|
try {
|
||||||
|
changeInfo.updateMethod(dummyMethod)
|
||||||
|
JavaChangeSignatureUsageProcessor().processPrimaryMethod(changeInfo)
|
||||||
|
changeInfo.toJetChangeInfo(methodDescriptor, resolutionFacade)
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
changeInfo.updateMethod(method)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> return false
|
||||||
}
|
}
|
||||||
changeInfo.primaryMethodUpdated()
|
|
||||||
|
for (primaryFunction in ktChangeInfo.methodDescriptor.primaryCallables) {
|
||||||
|
primaryFunction.processUsage(ktChangeInfo, primaryFunction.declaration, UsageInfo.EMPTY_ARRAY)
|
||||||
|
}
|
||||||
|
ktChangeInfo.primaryMethodUpdated()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -20,12 +20,13 @@ import com.intellij.psi.PsiElement
|
|||||||
import com.intellij.refactoring.changeSignature.CallerUsageInfo
|
import com.intellij.refactoring.changeSignature.CallerUsageInfo
|
||||||
import com.intellij.refactoring.changeSignature.OverriderUsageInfo
|
import com.intellij.refactoring.changeSignature.OverriderUsageInfo
|
||||||
import com.intellij.usageView.UsageInfo
|
import com.intellij.usageView.UsageInfo
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.DeferredJavaMethodKotlinCallerUsage
|
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.JavaMethodKotlinUsageWithDelegate
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallableDefinitionUsage
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallableDefinitionUsage
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallerUsage
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallerUsage
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
|
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
@@ -82,7 +83,7 @@ fun KotlinType.renderTypeWithSubstitution(substitutor: TypeSubstitutor?, default
|
|||||||
// This method is used to create full copies of functions (including copies of all types)
|
// This method is used to create full copies of functions (including copies of all types)
|
||||||
// It's needed to prevent accesses to PSI (e.g. using LazyJavaClassifierType properties) when Change signature invalidates it
|
// It's needed to prevent accesses to PSI (e.g. using LazyJavaClassifierType properties) when Change signature invalidates it
|
||||||
// See KotlinChangeSignatureTest.testSAMChangeMethodReturnType
|
// See KotlinChangeSignatureTest.testSAMChangeMethodReturnType
|
||||||
fun FunctionDescriptor.createDeepCopy() = substitute(TypeSubstitutor.create(ForceTypeCopySubstitution))
|
fun DeclarationDescriptor.createDeepCopy() = (this as? JavaMethodDescriptor)?.substitute(TypeSubstitutor.create(ForceTypeCopySubstitution)) ?: this
|
||||||
|
|
||||||
private object ForceTypeCopySubstitution : TypeSubstitution() {
|
private object ForceTypeCopySubstitution : TypeSubstitution() {
|
||||||
override fun get(key: KotlinType) =
|
override fun get(key: KotlinType) =
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K {
|
||||||
|
open fun foo(i: Int) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add 'int' as 1st parameter to method 'foo'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K().foo(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add 'int' as 1st parameter to method 'foo'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K().foo(<caret>1);
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K(i: Int) {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add 'int' as 1st parameter to method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add 'int' as 1st parameter to method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(<caret>1);
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K(i: Int) {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add 'int' as 1st parameter to method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K() {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add 'int' as 1st parameter to method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(<caret>1);
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
open class K {
|
||||||
|
constructor(i: Int)
|
||||||
|
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add 'int' as 1st parameter to method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
open class K {
|
||||||
|
constructor()
|
||||||
|
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Add 'int' as 1st parameter to method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(<caret>1);
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K {
|
||||||
|
open fun foo(n: Int, b: String) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Change 2nd parameter of method 'foo' from 'boolean' to 'String'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K().foo(1, <caret>"2");
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K {
|
||||||
|
open fun foo(n: Int, b: Boolean) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Change 2nd parameter of method 'foo' from 'boolean' to 'String'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K().foo(1, <caret>"2");
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K(n: Int, b: String) {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Change 2nd parameter of method 'K' from 'boolean' to 'String'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(1, <caret>"2");
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K(n: Int, b: Boolean) {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Change 2nd parameter of method 'K' from 'boolean' to 'String'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(1, <caret>"2");
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
open class K {
|
||||||
|
constructor(n: Int, b: String)
|
||||||
|
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Change 2nd parameter of method 'K' from 'boolean' to 'String'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(1, <caret>"2");
|
||||||
|
}
|
||||||
|
}
|
||||||
idea/testData/quickfix/changeSignature/jk/jkChangeSecondaryConstructorParameter.before.Dependency.kt
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
open class K {
|
||||||
|
constructor(n: Int, b: Boolean)
|
||||||
|
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Change 2nd parameter of method 'K' from 'boolean' to 'String'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(1, <caret>"2");
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Remove 1st parameter from method 'foo'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K().foo(<caret>);
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K {
|
||||||
|
open fun foo(n: Int) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Remove 1st parameter from method 'foo'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K().foo(<caret>);
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K() {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Remove 1st parameter from method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(<caret>);
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class K(n: Int) {
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Remove 1st parameter from method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(<caret>);
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
open class K {
|
||||||
|
constructor()
|
||||||
|
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Remove 1st parameter from method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(<caret>);
|
||||||
|
}
|
||||||
|
}
|
||||||
idea/testData/quickfix/changeSignature/jk/jkRemoveSecondaryConstructorParameter.before.Dependency.kt
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
open class K {
|
||||||
|
constructor(n: Int)
|
||||||
|
|
||||||
|
open fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// "Remove 1st parameter from method 'K'" "true"
|
||||||
|
|
||||||
|
public class J {
|
||||||
|
void foo() {
|
||||||
|
new K(<caret>);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -463,6 +463,75 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/removeJavaMethodParameter.before.Main.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/removeJavaMethodParameter.before.Main.kt");
|
||||||
doTestWithExtraFile(fileName);
|
doTestWithExtraFile(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("idea/testData/quickfix/changeSignature/jk")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class Jk extends AbstractQuickFixMultiFileTest {
|
||||||
|
public void testAllFilesPresentInJk() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/changeSignature/jk"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkAddFunctionParameter.before.Main.java")
|
||||||
|
public void testJkAddFunctionParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkAddFunctionParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkAddImplicitPrimaryConstructorParameter.before.Main.java")
|
||||||
|
public void testJkAddImplicitPrimaryConstructorParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkAddImplicitPrimaryConstructorParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkAddPrimaryConstructorParameter.before.Main.java")
|
||||||
|
public void testJkAddPrimaryConstructorParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkAddPrimaryConstructorParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkAddSecondaryConstructorParameter.before.Main.java")
|
||||||
|
public void testJkAddSecondaryConstructorParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkAddSecondaryConstructorParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkChangeFunctionParameter.before.Main.java")
|
||||||
|
public void testJkChangeFunctionParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkChangeFunctionParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkChangePrimaryConstructorParameter.before.Main.java")
|
||||||
|
public void testJkChangePrimaryConstructorParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkChangePrimaryConstructorParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkChangeSecondaryConstructorParameter.before.Main.java")
|
||||||
|
public void testJkChangeSecondaryConstructorParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkChangeSecondaryConstructorParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkRemoveFunctionParameter.before.Main.java")
|
||||||
|
public void testJkRemoveFunctionParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkRemoveFunctionParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkRemovePrimaryConstructorParameter.before.Main.java")
|
||||||
|
public void testJkRemovePrimaryConstructorParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkRemovePrimaryConstructorParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jkRemoveSecondaryConstructorParameter.before.Main.java")
|
||||||
|
public void testJkRemoveSecondaryConstructorParameter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/jk/jkRemoveSecondaryConstructorParameter.before.Main.java");
|
||||||
|
doTestWithExtraFile(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("idea/testData/quickfix/checkArguments")
|
@TestMetadata("idea/testData/quickfix/checkArguments")
|
||||||
|
|||||||
Reference in New Issue
Block a user