JetNameSuggester: no name duplicates + no full body resolve always
This commit is contained in:
@@ -16,15 +16,12 @@
|
||||
|
||||
package org.jetbrains.kotlin.idea.core
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import com.intellij.util.ArrayUtil
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.lexer.JetLexer
|
||||
import org.jetbrains.kotlin.lexer.JetTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.types.ErrorUtils
|
||||
import org.jetbrains.kotlin.types.JetType
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
@@ -50,14 +47,14 @@ public object KotlinNameSuggester {
|
||||
* *
|
||||
* @return possible names
|
||||
*/
|
||||
public fun suggestNamesByExpressionAndType(expression: JetExpression, validator: (String) -> Boolean, defaultName: String?): List<String> {
|
||||
val result = ArrayList<String>()
|
||||
public fun suggestNamesByExpressionAndType(expression: JetExpression, bindingContext: BindingContext, validator: (String) -> Boolean, defaultName: String?): Collection<String> {
|
||||
val result = LinkedHashSet<String>()
|
||||
|
||||
val bindingContext = expression.analyze(BodyResolveMode.FULL)
|
||||
val jetType = bindingContext.getType(expression)
|
||||
if (jetType != null) {
|
||||
result.addNamesByType(jetType, validator)
|
||||
val type = bindingContext.getType(expression)
|
||||
if (type != null) {
|
||||
result.addNamesByType(type, validator)
|
||||
}
|
||||
|
||||
result.addNamesByExpression(expression, validator)
|
||||
|
||||
if (result.isEmpty()) {
|
||||
|
||||
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetValVar;
|
||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
|
||||
import org.jetbrains.kotlin.psi.*;
|
||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode;
|
||||
import org.jetbrains.kotlin.types.JetType;
|
||||
import org.jetbrains.kotlin.types.checker.JetTypeChecker;
|
||||
|
||||
@@ -105,10 +106,12 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiE
|
||||
return KotlinNameSuggester.INSTANCE$.suggestNameByName(argumentName.getAsName().asString(), validator);
|
||||
}
|
||||
else if (expression != null) {
|
||||
return KotlinNameSuggester.INSTANCE$.suggestNamesByExpressionAndType(expression, validator, "param").get(0);
|
||||
BindingContext bindingContext = ResolvePackage.analyze(expression, BodyResolveMode.PARTIAL);
|
||||
return KotlinNameSuggester.INSTANCE$.suggestNamesByExpressionAndType(expression, bindingContext, validator, "param").iterator().next();
|
||||
}
|
||||
else {
|
||||
return KotlinNameSuggester.INSTANCE$.suggestNameByName("param", validator);
|
||||
}
|
||||
|
||||
return KotlinNameSuggester.INSTANCE$.suggestNameByName("param", validator);
|
||||
}
|
||||
|
||||
protected static JetParameterInfo getNewParameterInfo(
|
||||
|
||||
+4
-2
@@ -62,6 +62,7 @@ import org.jetbrains.kotlin.resolve.BindingTraceContext;
|
||||
import org.jetbrains.kotlin.resolve.ObservableBindingTrace;
|
||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage;
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode;
|
||||
import org.jetbrains.kotlin.resolve.scopes.JetScope;
|
||||
import org.jetbrains.kotlin.types.JetType;
|
||||
import org.jetbrains.kotlin.types.TypeUtils;
|
||||
@@ -197,12 +198,13 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase {
|
||||
calculateAnchor(commonParent, commonContainer, allReplaces),
|
||||
NameValidatorImpl.Target.PROPERTIES
|
||||
);
|
||||
final List<String> suggestedNames = KotlinNameSuggester.INSTANCE$.suggestNamesByExpressionAndType(expression, validator, "value");
|
||||
final Collection<String> suggestedNames = KotlinNameSuggester.INSTANCE$.suggestNamesByExpressionAndType(
|
||||
expression, ResolvePackage.analyze(expression, BodyResolveMode.PARTIAL), validator, "value");
|
||||
final Ref<JetProperty> propertyRef = new Ref<JetProperty>();
|
||||
final ArrayList<JetExpression> references = new ArrayList<JetExpression>();
|
||||
final Ref<JetExpression> reference = new Ref<JetExpression>();
|
||||
final Runnable introduceRunnable = introduceVariable(
|
||||
expression, suggestedNames.get(0), allReplaces, commonContainer,
|
||||
expression, suggestedNames.iterator().next(), allReplaces, commonContainer,
|
||||
commonParent, replaceOccurrence, propertyRef, references,
|
||||
reference, finalNoTypeInference, expressionType, bindingContext);
|
||||
CommandProcessor.getInstance().executeCommand(project, new Runnable() {
|
||||
|
||||
+1
-1
@@ -44,7 +44,7 @@ public class KotlinVariableInplaceIntroducer(
|
||||
val addedVariable: JetProperty,
|
||||
val originalExpression: JetExpression?,
|
||||
val occurrencesToReplace: Array<JetExpression>,
|
||||
suggestedNames: List<String>,
|
||||
suggestedNames: Collection<String>,
|
||||
val isVar: Boolean,
|
||||
val doNotChangeVar: Boolean,
|
||||
val expressionType: JetType?,
|
||||
|
||||
+4
-4
@@ -18,14 +18,14 @@ package org.jetbrains.kotlin.idea.refactoring.nameSuggester
|
||||
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
|
||||
import org.jetbrains.kotlin.idea.refactoring.JetRefactoringUtil
|
||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||
import org.jetbrains.kotlin.psi.JetExpression
|
||||
import org.jetbrains.kotlin.psi.JetFile
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.test.JetTestUtils
|
||||
|
||||
import java.util.Arrays
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
public class JetNameSuggesterTest : LightCodeInsightFixtureTestCase() {
|
||||
@@ -69,7 +69,7 @@ public class JetNameSuggesterTest : LightCodeInsightFixtureTestCase() {
|
||||
try {
|
||||
JetRefactoringUtil.selectExpression(myFixture.getEditor(), file, object : JetRefactoringUtil.SelectExpressionCallback {
|
||||
override fun run(expression: JetExpression) {
|
||||
val names = KotlinNameSuggester.suggestNamesByExpressionAndType(expression, { true }, "value").sort()
|
||||
val names = KotlinNameSuggester.suggestNamesByExpressionAndType(expression, expression.analyze(BodyResolveMode.PARTIAL), { true }, "value").sort()
|
||||
val result = StringUtil.join(names, "\n").trim()
|
||||
assertEquals(expectedResultText, result)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user