Quick Fixes: Implement "Rename unresolved reference" fix

#KT-8795 Fixed
This commit is contained in:
Alexey Sedunov
2015-12-03 12:45:59 +03:00
parent d850d7bbad
commit e517cbcf78
96 changed files with 580 additions and 0 deletions
@@ -0,0 +1,29 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.utils
import java.util.*
class HammingComparator<T>(private val referenceString: String, private val asString: T.() -> String) : Comparator<T> {
private fun countDifference(s1: String): Int {
return (0..Math.min(s1.lastIndex, referenceString.lastIndex)).count { s1[it] != referenceString[it] }
}
override fun compare(lookupItem1: T, lookupItem2: T): Int {
return countDifference(lookupItem1.asString()) - countDifference(lookupItem2.asString())
}
}
@@ -85,6 +85,8 @@ public fun <K> Iterable<K>.mapToIndex(): Map<K, Int> {
public inline fun <T, C: Collection<T>> C.ifEmpty(body: () -> C): C = if (isEmpty()) body() else this
public inline fun <T> Array<out T>.ifEmpty(body: () -> Array<out T>): Array<out T> = if (isEmpty()) body() else this
public fun <T: Any> emptyOrSingletonList(item: T?): List<T> = if (item == null) listOf() else listOf(item)
public fun <T: Any> MutableCollection<T>.addIfNotNull(t: T?) {
@@ -345,6 +345,9 @@ public class QuickFixRegistrar : QuickFixContributor {
UNRESOLVED_REFERENCE.registerFactory(KotlinAddOrderEntryActionFactory)
UNRESOLVED_REFERENCE.registerFactory(RenameUnresolvedReferenceActionFactory)
EXPRESSION_EXPECTED_PACKAGE_FOUND.registerFactory(RenameUnresolvedReferenceActionFactory)
MISPLACED_TYPE_PARAMETER_CONSTRAINTS.registerFactory(MoveTypeParameterConstraintFix)
DELEGATE_RESOLVED_TO_DEPRECATED_CONVENTION.registerFactory(DeprecatedFunctionConventionFix)
@@ -0,0 +1,135 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.quickfix
import com.intellij.codeInsight.daemon.QuickFixBundle
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.codeInsight.template.*
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper
import org.jetbrains.kotlin.idea.core.isVisible
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.guessTypes
import org.jetbrains.kotlin.idea.util.psi.patternMatching.KotlinPsiUnifier
import org.jetbrains.kotlin.idea.util.psi.patternMatching.toRange
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
import org.jetbrains.kotlin.utils.HammingComparator
import org.jetbrains.kotlin.utils.ifEmpty
import java.util.*
object RenameUnresolvedReferenceActionFactory : KotlinSingleIntentionActionFactory() {
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
val ref = diagnostic.psiElement as? KtNameReferenceExpression ?: return null
return RenameUnresolvedReferenceFix(ref)
}
}
class RenameUnresolvedReferenceFix(element: KtNameReferenceExpression): KotlinQuickFixAction<KtNameReferenceExpression>(element) {
companion object {
private val INPUT_VARIABLE_NAME = "INPUT_VAR"
private val OTHER_VARIABLE_NAME = "OTHER_VAR"
}
private class ReferenceNameExpression(
private val items: Array<out LookupElement>,
private val originalReferenceName: String
) : Expression() {
init {
Arrays.sort(items, HammingComparator(originalReferenceName, { lookupString }))
}
override fun calculateResult(context: ExpressionContext) = TextResult(items.firstOrNull()?.lookupString ?: originalReferenceName)
override fun calculateQuickResult(context: ExpressionContext) = null
override fun calculateLookupItems(context: ExpressionContext) = if (items.size <= 1) null else items
}
override fun getText() = QuickFixBundle.message("rename.wrong.reference.text")
override fun getFamilyName() = QuickFixBundle.message("rename.wrong.reference.family")
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
return super.isAvailable(project, editor, file)
&& editor != null
&& element.getStrictParentOfType<KtTypeReference>() == null
}
private fun KtExpression.isCallee() = getParentOfTypeAndBranch<KtCallElement> { calleeExpression } != null
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
if (editor == null) return
val patternExpression = element.getQualifiedElement() as? KtExpression ?: return
val originalName = element.getReferencedName()
val container = element.parents.firstOrNull { it is KtDeclarationWithBody || it is KtClassOrObject || it is KtFile } ?: return
val isCallee = element.isCallee()
val occurrences = patternExpression.toRange()
.match(container, KotlinPsiUnifier.DEFAULT)
.mapNotNull {
val candidate = (it.range.elements.first() as? KtExpression)?.getQualifiedElementSelector() as? KtNameReferenceExpression
if (candidate != null && candidate.isCallee() == isCallee) candidate else null
}
val resolutionFacade = element.getResolutionFacade()
val context = resolutionFacade.analyze(element, BodyResolveMode.PARTIAL)
val moduleDescriptor = resolutionFacade.moduleDescriptor
val variantsHelper = ReferenceVariantsHelper(context, resolutionFacade, moduleDescriptor) {
it !is DeclarationDescriptorWithVisibility || it.isVisible(element, null, context, resolutionFacade)
}
val expectedTypes = patternExpression
.guessTypes(context, moduleDescriptor)
.ifEmpty { arrayOf(moduleDescriptor.builtIns.nullableAnyType) }
val descriptorKindFilter = if (isCallee) DescriptorKindFilter.FUNCTIONS else DescriptorKindFilter.VARIABLES
val lookupItems = variantsHelper
.getReferenceVariants(element, descriptorKindFilter, { true })
.filter { candidate ->
candidate is CallableDescriptor && (expectedTypes.any { candidate.returnType?.isSubtypeOf(it) ?: false })
}
.mapTo(if (ApplicationManager.getApplication().isUnitTestMode) linkedSetOf() else linkedSetOf(originalName)) {
it.name.asString()
}
.map { LookupElementBuilder.create(it) }
.toTypedArray()
val nameExpression = ReferenceNameExpression(lookupItems, originalName)
val builder = TemplateBuilderImpl(container)
occurrences.forEach {
if (it != element) {
builder.replaceElement(it.getReferencedNameElement(), OTHER_VARIABLE_NAME, INPUT_VARIABLE_NAME, false)
}
else {
builder.replaceElement(it.getReferencedNameElement(), INPUT_VARIABLE_NAME, nameExpression, true)
}
}
editor.caretModel.moveToOffset(container.startOffset)
TemplateManager.getInstance(project).startTemplate(editor, builder.buildInlineTemplate())
}
}
@@ -1,4 +1,5 @@
// "class org.jetbrains.kotlin.idea.quickfix.AutoImportFix" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: externalFun
package testing
@@ -3,6 +3,7 @@
// ACTION: Create object 'Nested'
// ACTION: Create parameter 'Nested'
// ACTION: Create property 'Nested'
// ACTION: Rename reference
// ERROR: Unresolved reference: Nested
fun test() {
@@ -3,6 +3,7 @@
// ACTION: Create object 'PrivateClass'
// ACTION: Create parameter 'PrivateClass'
// ACTION: Create property 'PrivateClass'
// ACTION: Rename reference
// ERROR: Unresolved reference: PrivateClass
fun test() {
@@ -4,6 +4,7 @@
// ACTION: Create interface 'SomeTest'
// ACTION: Create enum 'SomeTest'
// ACTION: Create object 'SomeTest'
// ACTION: Rename reference
// ERROR: Unresolved reference: SomeTest
package testing
@@ -1,5 +1,6 @@
// "class org.jetbrains.kotlin.idea.quickfix.AutoImportFix" "false"
// ACTION: Create class 'SomeTest'
// ACTION: Rename reference
// ERROR: Unresolved reference: SomeTest
package testing
@@ -3,6 +3,7 @@
// ERROR: Expression expected, but a package name found
// ACTION: Create class 'SomeTest'
// ACTION: Replace safe access expression with 'if' expression
// ACTION: Rename reference
package testing
@@ -1,6 +1,7 @@
// "class org.jetbrains.kotlin.idea.quickfix.AutoImportFix" "false"
// ACTION: Create class 'SomeClass'
// ACTION: Create function 'SomeClass'
// ACTION: Rename reference
// ERROR: Unresolved reference: SomeClass
val x = <caret>SomeClass()
@@ -1,6 +1,7 @@
// "class org.jetbrains.kotlin.idea.quickfix.AutoImportFix" "false"
// ACTION: Create class 'ExcludedClass'
// ACTION: Create function 'ExcludedClass'
// ACTION: Rename reference
// ERROR: Unresolved reference: ExcludedClass
val x = <caret>ExcludedClass()
@@ -1,5 +1,6 @@
// "class org.jetbrains.kotlin.idea.quickfix.AutoImportFix" "false"
// ACTION: Create function 'someFunction'
// ACTION: Rename reference
// ERROR: Unresolved reference: someFunction
val x = <caret>someFunction()
@@ -1,6 +1,7 @@
// "class org.jetbrains.kotlin.idea.quickfix.AutoImportFix" "false"
// ACTION: Create function 'FooPackage'
// ACTION: Create class 'FooPackage'
// ACTION: Rename reference
// ERROR: Unresolved reference: FooPackage
package packageClass
@@ -1,5 +1,6 @@
// "Create annotation 'foo'" "false"
// ACTION: Create function 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test() = <caret>foo(1, "2")
@@ -1,6 +1,7 @@
// "Create class 'Foo'" "false"
// ACTION: Create function 'Foo'
// ACTION: Convert to block body
// ACTION: Rename reference
// ERROR: Unresolved reference: Foo
internal fun test(): A = <caret>Foo(2, "2")
@@ -1,6 +1,7 @@
// "Create class 'Foo'" "false"
// ACTION: Create function 'Foo'
// ACTION: Convert to block body
// ACTION: Rename reference
// ERROR: Unresolved reference: Foo
final class A
@@ -1,4 +1,5 @@
// "Create class 'Foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: Foo
fun test() = J.<caret>Foo(2, "2")
@@ -1,5 +1,6 @@
// "Create class 'Foo'" "false"
// ACTION: Create extension function 'Foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: Foo
fun test() {
@@ -1,5 +1,6 @@
// "Create class 'Foo'" "false"
// ACTION: Create extension function 'Foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: Foo
class A<T>(val items: List<T>) {
@@ -1,4 +1,5 @@
// "Create class 'A'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: A
import J.<caret>A
@@ -3,6 +3,7 @@
// ACTION: Create class 'A'
// ACTION: Create enum 'A'
// ACTION: Create interface 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
import E.<caret>A
@@ -4,6 +4,7 @@
// ACTION: Create object 'A'
// ACTION: Create enum 'A'
// ACTION: Create annotation 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -4,6 +4,7 @@
// ACTION: Create object 'A'
// ACTION: Create enum 'A'
// ACTION: Create annotation 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -4,6 +4,7 @@
// ACTION: Create class 'A'
// ACTION: Create interface 'A'
// ACTION: Create enum 'A'
// ACTION: Rename reference
import J.<caret>A
class X {
@@ -3,6 +3,7 @@
// ACTION: Create local variable 'A'
// ACTION: Create parameter 'A'
// ACTION: Create property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -1,3 +1,4 @@
// "Create class 'A'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: A
fun foo() = J.<caret>A.B
@@ -1,5 +1,6 @@
// "Create class 'A'" "false"
// ACTION: Create object 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -3,6 +3,7 @@
// ACTION: Create local variable 'A'
// ACTION: Create parameter 'A'
// ACTION: Create property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -1,5 +1,6 @@
// "Create class 'A'" "false"
// ACTION: Create object 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -2,6 +2,7 @@
// ACTION: Create extension property 'A'
// ACTION: Create member property 'A'
// ACTION: Create property 'A' as constructor parameter
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -3,6 +3,7 @@
// ACTION: Create local variable 'A'
// ACTION: Create parameter 'A'
// ACTION: Create property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -1,4 +1,5 @@
// "Create enum constant 'A'" "false"
// ACTION: Create member property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
fun foo() = J.<caret>A
@@ -1,5 +1,6 @@
// "Create enum constant 'A'" "false"
// ACTION: Convert to block body
// ACTION: Create member property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
internal fun foo(): J = J.<caret>A
@@ -1,4 +1,5 @@
// "Create enum constant 'A'" "false"
// ACTION: Create member property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
fun foo() = J.<caret>A
@@ -1,5 +1,6 @@
// "Create enum constant 'A'" "false"
// ACTION: Convert to block body
// ACTION: Create member property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
internal fun foo(): X = E.<caret>A
@@ -1,5 +1,6 @@
// "Create enum constant 'A'" "false"
// ACTION: Create object 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -2,6 +2,7 @@
// ACTION: Create extension property 'A'
// ACTION: Create member property 'A'
// ACTION: Create property 'A' as constructor parameter
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -1,6 +1,7 @@
// "Create enum constant 'A'" "false"
// ACTION: Convert to block body
// ACTION: Create object 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -3,6 +3,7 @@
// ACTION: Create local variable 'A'
// ACTION: Create parameter 'A'
// ACTION: Create property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -1,4 +1,5 @@
// "Create object 'A'" "false"
// ACTION: Create member property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
fun foo() = J.<caret>A
@@ -2,6 +2,7 @@
// ACTION: Create extension property 'A'
// ACTION: Create member property 'A'
// ACTION: Create property 'A' as constructor parameter
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -3,6 +3,7 @@
// ACTION: Create parameter 'Foo'
// ACTION: Create property 'Foo'
// ACTION: Split property declaration
// ACTION: Rename reference
// ERROR: Unresolved reference: Foo
open class Cyclic<E : Cyclic<E>>
@@ -3,6 +3,7 @@
// ACTION: Create local variable 'A'
// ACTION: Create parameter 'A'
// ACTION: Create property 'A'
// ACTION: Rename reference
// ERROR: Unresolved reference: A
package p
@@ -2,6 +2,7 @@
// ACTION: Create annotation 'bar'
// ACTION: Make internal
// ACTION: Make private
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
// ERROR: Unresolved reference: bar
@@ -1,4 +1,5 @@
// "Create extension function 'foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
package p
@@ -1,4 +1,5 @@
// "Create member function 'foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A<T>(val n: T)
@@ -1,6 +1,7 @@
// "Create member function 'foo'" "false"
// ACTION: Convert to expression body
// ACTION: Create extension function 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test(): Int {
@@ -1,4 +1,5 @@
// "Create function 'foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
package p
@@ -1,5 +1,6 @@
// "Create extension function 'foo'" "false"
// ACTION: Create member function 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test() {
@@ -1,5 +1,6 @@
// "Create function 'foo'" "false"
// "Create member function 'foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test() {
@@ -1,6 +1,7 @@
// "Create local variable 'foo'" "false"
// ACTION: Create parameter 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A {
@@ -1,5 +1,6 @@
// "Create local variable 'foo'" "false"
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
val t: Int = <caret>foo
@@ -2,6 +2,7 @@
// ACTION: Create extension property 'foo'
// ACTION: Create member property 'foo'
// ACTION: Create property 'foo' as constructor parameter
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A
@@ -1,6 +1,7 @@
// "Create parameter 'foo'" "false"
// ACTION: Create local variable 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test(n: Int) {
@@ -2,6 +2,7 @@
// ACTION: Convert to expression body
// ACTION: Create local variable 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A {
@@ -2,6 +2,7 @@
// ACTION: Convert to expression body
// ACTION: Create local variable 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
object A {
@@ -2,6 +2,7 @@
// ACTION: Convert to expression body
// ACTION: Create local variable 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
interface A {
@@ -2,6 +2,7 @@
// ACTION: Convert to expression body
// ACTION: Create local variable 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
val test: Int get() {
@@ -2,6 +2,7 @@
// ACTION: Create local variable 'foo'
// ACTION: Create property 'foo'
// ACTION: Split property declaration
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A {
@@ -2,6 +2,7 @@
// ACTION: Convert to expression body
// ACTION: Create local variable 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A {
@@ -2,6 +2,7 @@
// ACTION: Convert to expression body
// ACTION: Create local variable 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A<T> {
@@ -1,5 +1,6 @@
// "Create parameter 'foo'" "false"
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A {
@@ -1,5 +1,6 @@
// "Create parameter 'foo'" "false"
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
object A {
@@ -1,5 +1,6 @@
// "Create parameter 'foo'" "false"
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
val test: Int = <caret>foo
@@ -1,6 +1,7 @@
// "Create parameter 'x'" "false"
// ERROR: Unresolved reference: x
// ACTION: Create property 'x'
// ACTION: Rename reference
enum class E(n: Int) {
X(<caret>x)
@@ -1,6 +1,7 @@
// "Create parameter 'b'" "false"
// ERROR: Unresolved reference: b
// ACTION: Create property 'b'
// ACTION: Rename reference
open class A(val a: Int) {
@@ -2,6 +2,7 @@
// ACTION: Create extension property 'foo'
// ACTION: Create member property 'foo'
// ACTION: Create property 'foo' as constructor parameter
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A
@@ -2,6 +2,7 @@
// ACTION: Convert to expression body
// ACTION: Create parameter 'foo'
// ACTION: Create local variable 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test() {
@@ -3,6 +3,7 @@
// ACTION: Create local variable 'foo'
// ACTION: Create parameter 'foo'
// ACTION: Create property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A {
@@ -1,5 +1,6 @@
// "Create member property 'foo' as constructor parameter" "false"
// ACTION: Create member property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test() {
@@ -3,6 +3,7 @@
// ACTION: Convert to expression body
// ACTION: Create local variable 'foo'
// ACTION: Create parameter 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test(): Int {
@@ -1,6 +1,7 @@
// "Create member property 'foo' as constructor parameter" "false"
// ACTION: Create member property 'foo'
// ACTION: Create extension property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A<T>(val n: T) {
@@ -2,6 +2,7 @@
// ACTION: Create member property 'foo'
// ACTION: Convert to expression body
// ACTION: Create extension property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test(): String? {
@@ -1,5 +1,6 @@
// "Create property 'foo' as constructor parameter" "false"
// ACTION: Create extension property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A<T>(val n: T)
@@ -1,6 +1,7 @@
// "Create property 'foo'" "false"
// ACTION: Create extension function 'bar'
// ACTION: Create member function 'bar'
// ACTION: Rename reference
// ERROR: Unresolved reference: bar
// ERROR: Unresolved reference: foo
@@ -1,4 +1,5 @@
// "Create extension property 'foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
package p
@@ -2,6 +2,7 @@
// ACTION: Convert to expression body
// ACTION: Create parameter 'foo'
// ACTION: Create local variable 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test() {
@@ -1,4 +1,5 @@
// "Create property 'foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
package p
@@ -1,5 +1,6 @@
// "Create extension property 'foo'" "false"
// ACTION: Create member property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test() {
@@ -1,4 +1,5 @@
// "Create property 'foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test() {
@@ -1,4 +1,5 @@
// "Create property 'foo'" "false"
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
class A<T>(val n: T)
@@ -1,6 +1,7 @@
// "Create property 'foo'" "false"
// ACTION: Convert to expression body
// ACTION: Create extension property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
fun test(): String? {
@@ -1,6 +1,7 @@
// "Create property 'foo'" "false"
// ACTION: Convert to expression body
// ACTION: Create extension property 'foo'
// ACTION: Rename reference
// ERROR: Unresolved reference: foo
internal fun test(a: A): String? {
@@ -0,0 +1,33 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
class A {
fun f() = 1
fun g() = ""
}
class B
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo(a: A, b: B) {
val aa = A()
bar(a.x)
baz(a.x)
bar(a.<caret>x())
baz(a.x())
bar(a.x(1))
baz(a.x(1))
bar(aa.x())
bar(b.x())
}
@@ -0,0 +1,33 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
class A {
fun f() = 1
fun g() = ""
}
class B
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo(a: A, b: B) {
val aa = A()
bar(a.x)
baz(a.x)
bar(a.f<caret>())
baz(a.f())
bar(a.x(1))
baz(a.x(1))
bar(aa.x())
bar(b.x())
}
@@ -0,0 +1,29 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
class A {
val a = 1
val s = ""
}
class B
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo(a: A, b: B) {
val aa = A()
bar(a.x<caret>)
baz(a.x)
bar(a.x())
baz(a.x(1))
bar(aa.x)
bar(b.x)
}
@@ -0,0 +1,29 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
class A {
val a = 1
val s = ""
}
class B
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo(a: A, b: B) {
val aa = A()
bar(a.a<caret>)
baz(a.a)
bar(a.x())
baz(a.x(1))
bar(aa.x)
bar(b.x)
}
@@ -0,0 +1,18 @@
// "Rename reference" "false"
// ACTION: Create annotation 'X'
// ACTION: Create class 'X'
// ACTION: Create enum 'X'
// ACTION: Create interface 'X'
// ERROR: Unresolved reference: X
// ERROR: Unresolved reference: X
class A {
class B
fun foo() {
}
}
fun test(x: A.<caret>X) {
val t: A.X
}
@@ -0,0 +1,26 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
class A {
fun f() = 1
fun g() = ""
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo() {
bar(x)
baz(x)
bar(<caret>x())
baz(x())
bar(x(1))
baz(x(1))
}
}
@@ -0,0 +1,26 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
class A {
fun f() = 1
fun g() = ""
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo() {
bar(x)
baz(x)
bar(f<caret>())
baz(f())
bar(x(1))
baz(x(1))
}
}
@@ -0,0 +1,22 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
class A {
val a = 1
val s = ""
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo() {
bar(<caret>x)
baz(x)
bar(x())
baz(x(1))
}
}
@@ -0,0 +1,22 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
class A {
val a = 1
val s = ""
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo() {
bar(a<caret>)
baz(a)
bar(x())
baz(x(1))
}
}
@@ -0,0 +1,24 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
package x
class A {
val a = 1
val s = ""
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo() {
bar(<caret>x)
baz(x)
bar(x())
baz(x(1))
}
}
@@ -0,0 +1,24 @@
// "Rename reference" "true"
// ERROR: Unresolved reference: x
// ERROR: Unresolved reference: x
package x
class A {
val a = 1
val s = ""
fun bar(i: Int) {
}
fun baz(i: Int) {
}
fun foo() {
bar(a<caret>)
baz(a)
bar(x())
baz(x(1))
}
}
@@ -5758,6 +5758,51 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
}
}
@TestMetadata("idea/testData/quickfix/renameUnresolvedReference")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class RenameUnresolvedReference extends AbstractQuickFixTest {
public void testAllFilesPresentInRenameUnresolvedReference() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/renameUnresolvedReference"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
}
@TestMetadata("qualifiedFunRef.kt")
public void testQualifiedFunRef() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameUnresolvedReference/qualifiedFunRef.kt");
doTest(fileName);
}
@TestMetadata("qualifiedPropertyRef.kt")
public void testQualifiedPropertyRef() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameUnresolvedReference/qualifiedPropertyRef.kt");
doTest(fileName);
}
@TestMetadata("typeRef.kt")
public void testTypeRef() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameUnresolvedReference/typeRef.kt");
doTest(fileName);
}
@TestMetadata("unqualifiedFunRef.kt")
public void testUnqualifiedFunRef() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameUnresolvedReference/unqualifiedFunRef.kt");
doTest(fileName);
}
@TestMetadata("unqualifiedPropertyRef.kt")
public void testUnqualifiedPropertyRef() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameUnresolvedReference/unqualifiedPropertyRef.kt");
doTest(fileName);
}
@TestMetadata("unqualifiedPropertyRefWithPackageError.kt")
public void testUnqualifiedPropertyRefWithPackageError() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameUnresolvedReference/unqualifiedPropertyRefWithPackageError.kt");
doTest(fileName);
}
}
@TestMetadata("idea/testData/quickfix/supercalls")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)