JetNameSuggester: no name duplicates + no full body resolve always

This commit is contained in:
Valentin Kipyatkov
2015-06-26 19:27:46 +03:00
parent bce79906ef
commit f60470b3eb
5 changed files with 22 additions and 20 deletions
@@ -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(
@@ -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() {
@@ -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?,
@@ -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)
}