Minor: Allow passing explicit type to KotlinNameSuggester.suggestByExpressionAndType

This commit is contained in:
Alexey Sedunov
2015-11-17 20:06:52 +03:00
parent 94f58c4b3d
commit c80826aab4
5 changed files with 13 additions and 11 deletions
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.core
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.lexer.KotlinLexer
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
@@ -26,7 +25,6 @@ import org.jetbrains.kotlin.psi.psiUtil.getOutermostParenthesizerOrThis
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getParentResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.types.ErrorUtils
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils
@@ -37,15 +35,19 @@ import java.util.*
import java.util.regex.Pattern
public object KotlinNameSuggester {
public fun suggestNamesByExpressionAndType(expression: KtExpression, bindingContext: BindingContext, validator: (String) -> Boolean, defaultName: String?): Collection<String> {
public fun suggestNamesByExpressionAndType(
expression: KtExpression,
type: KotlinType?,
bindingContext: BindingContext?,
validator: (String) -> Boolean,
defaultName: String?
): Collection<String> {
val result = LinkedHashSet<String>()
result.addNamesByExpression(expression, bindingContext, validator)
val type = bindingContext.getType(expression)
if (type != null) {
result.addNamesByType(type, validator)
(type ?: bindingContext?.getType(expression))?.let {
result.addNamesByType(it, validator)
}
if (result.isEmpty()) {
@@ -63,7 +63,7 @@ class SuggestVariableNameMacro : Macro() {
val initializer = (declaration as? KtWithExpressionInitializer)?.initializer
if (initializer != null) {
val bindingContext = initializer.analyze(BodyResolveMode.PARTIAL)
return KotlinNameSuggester.suggestNamesByExpressionAndType(initializer, bindingContext, nameValidator, null)
return KotlinNameSuggester.suggestNamesByExpressionAndType(initializer, null, bindingContext, nameValidator, null)
}
val parent = declaration.parent
@@ -69,7 +69,7 @@ abstract class ChangeFunctionSignatureFix(
}
else if (expression != null) {
val bindingContext = expression.analyze(BodyResolveMode.PARTIAL)
return KotlinNameSuggester.suggestNamesByExpressionAndType(expression, bindingContext, validator, "param").first()
return KotlinNameSuggester.suggestNamesByExpressionAndType(expression, null, bindingContext, validator, "param").first()
}
else {
return KotlinNameSuggester.suggestNameByName("param", validator)
@@ -439,7 +439,7 @@ object KotlinIntroduceVariableHandler : KotlinIntroduceHandlerBase() {
calculateAnchor(commonParent, commonContainer, allReplaces),
NewDeclarationNameValidator.Target.VARIABLES
)
val suggestedNames = KotlinNameSuggester.suggestNamesByExpressionAndType(expression, bindingContext, validator, "value")
val suggestedNames = KotlinNameSuggester.suggestNamesByExpressionAndType(expression, null, bindingContext, validator, "value")
val introduceVariableContext = IntroduceVariableContext(
expression, suggestedNames.iterator().next(), allReplaces, commonContainer, commonParent,
replaceOccurrence, noTypeInference, expressionType, bindingContext, resolutionFacade
@@ -78,7 +78,7 @@ public class KotlinNameSuggesterTest : LightCodeInsightFixtureTestCase() {
}
KotlinRefactoringUtil.selectExpression(myFixture.getEditor(), file, object : KotlinRefactoringUtil.SelectExpressionCallback {
override fun run(expression: KtExpression?) {
val names = KotlinNameSuggester.suggestNamesByExpressionAndType(expression!!, expression.analyze(BodyResolveMode.PARTIAL), { true }, "value").sorted()
val names = KotlinNameSuggester.suggestNamesByExpressionAndType(expression!!, null, expression.analyze(BodyResolveMode.PARTIAL), { true }, "value").sorted()
val result = StringUtil.join(names, "\n").trim()
assertEquals(expectedResultText, result)
}