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