Name Validator: Translate JetNameValidator to Kotlin
This commit is contained in:
@@ -42,6 +42,7 @@ import org.jetbrains.jet.plugin.completion.ExpectedInfos
|
|||||||
import org.jetbrains.jet.lang.psi.JetFile
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
|
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
|
||||||
import org.jetbrains.jet.plugin.refactoring.runWriteAction
|
import org.jetbrains.jet.plugin.refactoring.runWriteAction
|
||||||
|
import org.jetbrains.jet.plugin.refactoring.EmptyValidator
|
||||||
|
|
||||||
fun insertLambdaTemplate(context: InsertionContext, placeholderRange: TextRange, lambdaType: JetType) {
|
fun insertLambdaTemplate(context: InsertionContext, placeholderRange: TextRange, lambdaType: JetType) {
|
||||||
val explicitParameterTypes = needExplicitParameterTypes(context, placeholderRange, lambdaType)
|
val explicitParameterTypes = needExplicitParameterTypes(context, placeholderRange, lambdaType)
|
||||||
@@ -98,8 +99,6 @@ private fun needExplicitParameterTypes(context: InsertionContext, placeholderRan
|
|||||||
private fun buildTemplate(lambdaType: JetType, explicitParameterTypes: Boolean, project: Project): Template {
|
private fun buildTemplate(lambdaType: JetType, explicitParameterTypes: Boolean, project: Project): Template {
|
||||||
val parameterTypes = functionParameterTypes(lambdaType)
|
val parameterTypes = functionParameterTypes(lambdaType)
|
||||||
|
|
||||||
val nameValidator = JetNameValidator.getEmptyValidator() //TODO: check for names in scope
|
|
||||||
|
|
||||||
val useParenthesis = explicitParameterTypes || parameterTypes.size != 1
|
val useParenthesis = explicitParameterTypes || parameterTypes.size != 1
|
||||||
|
|
||||||
val manager = TemplateManager.getInstance(project)
|
val manager = TemplateManager.getInstance(project)
|
||||||
@@ -116,7 +115,8 @@ private fun buildTemplate(lambdaType: JetType, explicitParameterTypes: Boolean,
|
|||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
template.addTextSegment(", ")
|
template.addTextSegment(", ")
|
||||||
}
|
}
|
||||||
template.addVariable(ParameterNameExpression(JetNameSuggester.suggestNames(parameterType, nameValidator, "p")), true)
|
//TODO: check for names in scope
|
||||||
|
template.addVariable(ParameterNameExpression(JetNameSuggester.suggestNames(parameterType, EmptyValidator, "p")), true)
|
||||||
if (explicitParameterTypes) {
|
if (explicitParameterTypes) {
|
||||||
template.addTextSegment(": " + DescriptorRenderer.SOURCE_CODE.renderType(parameterType))
|
template.addTextSegment(": " + DescriptorRenderer.SOURCE_CODE.renderType(parameterType))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.types.JetType;
|
|||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
||||||
import org.jetbrains.jet.plugin.JetBundle;
|
import org.jetbrains.jet.plugin.JetBundle;
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
|
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
|
||||||
|
import org.jetbrains.jet.plugin.refactoring.CollectingValidator;
|
||||||
import org.jetbrains.jet.plugin.refactoring.JetNameValidator;
|
import org.jetbrains.jet.plugin.refactoring.JetNameValidator;
|
||||||
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureConfiguration;
|
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureConfiguration;
|
||||||
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureData;
|
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureData;
|
||||||
@@ -116,7 +117,7 @@ public class AddFunctionParametersFix extends ChangeFunctionSignatureFix {
|
|||||||
public void configure(@NotNull JetChangeSignatureData changeSignatureData, @NotNull BindingContext bindingContext) {
|
public void configure(@NotNull JetChangeSignatureData changeSignatureData, @NotNull BindingContext bindingContext) {
|
||||||
List<ValueParameterDescriptor> parameters = functionDescriptor.getValueParameters();
|
List<ValueParameterDescriptor> parameters = functionDescriptor.getValueParameters();
|
||||||
List<? extends ValueArgument> arguments = callElement.getValueArguments();
|
List<? extends ValueArgument> arguments = callElement.getValueArguments();
|
||||||
JetNameValidator validator = JetNameValidator.createCollectingValidator();
|
JetNameValidator validator = new CollectingValidator();
|
||||||
|
|
||||||
for (int i = 0; i < arguments.size(); i ++) {
|
for (int i = 0; i < arguments.size(); i ++) {
|
||||||
ValueArgument argument = arguments.get(i);
|
ValueArgument argument = arguments.get(i);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
|
|||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.plugin.JetBundle;
|
import org.jetbrains.jet.plugin.JetBundle;
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
|
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
|
||||||
|
import org.jetbrains.jet.plugin.refactoring.CollectingValidator;
|
||||||
import org.jetbrains.jet.plugin.refactoring.JetNameSuggester;
|
import org.jetbrains.jet.plugin.refactoring.JetNameSuggester;
|
||||||
import org.jetbrains.jet.plugin.refactoring.JetNameValidator;
|
import org.jetbrains.jet.plugin.refactoring.JetNameValidator;
|
||||||
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureConfiguration;
|
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureConfiguration;
|
||||||
@@ -61,7 +62,7 @@ public class ChangeFunctionLiteralSignatureFix extends ChangeFunctionSignatureFi
|
|||||||
runChangeSignature(project, functionDescriptor, new JetChangeSignatureConfiguration() {
|
runChangeSignature(project, functionDescriptor, new JetChangeSignatureConfiguration() {
|
||||||
@Override
|
@Override
|
||||||
public void configure(@NotNull JetChangeSignatureData changeSignatureData, @NotNull BindingContext bindingContext) {
|
public void configure(@NotNull JetChangeSignatureData changeSignatureData, @NotNull BindingContext bindingContext) {
|
||||||
JetNameValidator validator = JetNameValidator.createCollectingValidator();
|
JetNameValidator validator = new CollectingValidator();
|
||||||
changeSignatureData.clearParameters();
|
changeSignatureData.clearParameters();
|
||||||
for (JetType type : parameterTypes) {
|
for (JetType type : parameterTypes) {
|
||||||
String name = JetNameSuggester.suggestNames(type, validator, "param")[0];
|
String name = JetNameSuggester.suggestNames(type, validator, "param")[0];
|
||||||
|
|||||||
+3
-6
@@ -66,6 +66,7 @@ import org.jetbrains.jet.plugin.caches.resolve.getAnalysisResults
|
|||||||
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
|
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
|
||||||
import org.jetbrains.jet.plugin.quickfix.QuickFixUtil
|
import org.jetbrains.jet.plugin.quickfix.QuickFixUtil
|
||||||
import org.jetbrains.jet.plugin.quickfix.createFromUsage.CreateFromUsageFixBase
|
import org.jetbrains.jet.plugin.quickfix.createFromUsage.CreateFromUsageFixBase
|
||||||
|
import org.jetbrains.jet.plugin.refactoring.EmptyValidator
|
||||||
|
|
||||||
private val TYPE_PARAMETER_LIST_VARIABLE_NAME = "typeParameterList"
|
private val TYPE_PARAMETER_LIST_VARIABLE_NAME = "typeParameterList"
|
||||||
private val TEMPLATE_FROM_USAGE_FUNCTION_BODY = "New Kotlin Function Body.kt"
|
private val TEMPLATE_FROM_USAGE_FUNCTION_BODY = "New Kotlin Function Body.kt"
|
||||||
@@ -126,10 +127,7 @@ private class TypeOrExpressionThereof(private val variance: Variance,
|
|||||||
ArrayUtil.EMPTY_STRING_ARRAY
|
ArrayUtil.EMPTY_STRING_ARRAY
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
JetNameSuggester.suggestNamesForExpression(
|
JetNameSuggester.suggestNamesForExpression(expressionOfType!!, EmptyValidator)
|
||||||
expressionOfType!!,
|
|
||||||
JetNameValidator.getEmptyValidator()
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -665,7 +663,6 @@ public class CreateFunctionFromUsageFix internal (
|
|||||||
private fun setupParameterTypeTemplates(builder: TemplateBuilder, parameterList: JetParameterList): List<TypeExpression> {
|
private fun setupParameterTypeTemplates(builder: TemplateBuilder, parameterList: JetParameterList): List<TypeExpression> {
|
||||||
val jetParameters = parameterList.getParameters()
|
val jetParameters = parameterList.getParameters()
|
||||||
assert(jetParameters.size == parameters.size)
|
assert(jetParameters.size == parameters.size)
|
||||||
val dummyValidator = JetNameValidator.getEmptyValidator()
|
|
||||||
|
|
||||||
val typeParameters = ArrayList<TypeExpression>()
|
val typeParameters = ArrayList<TypeExpression>()
|
||||||
for ((parameter, jetParameter) in parameters.zip(jetParameters)) {
|
for ((parameter, jetParameter) in parameters.zip(jetParameters)) {
|
||||||
@@ -686,7 +683,7 @@ public class CreateFunctionFromUsageFix internal (
|
|||||||
// figure out suggested names for each type option
|
// figure out suggested names for each type option
|
||||||
val parameterTypeToNamesMap = HashMap<String, Array<String>>()
|
val parameterTypeToNamesMap = HashMap<String, Array<String>>()
|
||||||
parameter.theType.typeCandidates!!.forEach { typeCandidate ->
|
parameter.theType.typeCandidates!!.forEach { typeCandidate ->
|
||||||
val suggestedNames = JetNameSuggester.suggestNamesForType(typeCandidate.theType, dummyValidator)
|
val suggestedNames = JetNameSuggester.suggestNamesForType(typeCandidate.theType, EmptyValidator)
|
||||||
parameterTypeToNamesMap[typeCandidate.renderedType!!] = suggestedNames
|
parameterTypeToNamesMap[typeCandidate.renderedType!!] = suggestedNames
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2013 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.jet.plugin.refactoring;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public abstract class JetNameValidator {
|
|
||||||
private static final JetNameValidator EMPTY_VALIDATOR = new JetNameValidator() {
|
|
||||||
@Override
|
|
||||||
protected boolean validateInner(String name) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static JetNameValidator getEmptyValidator() {
|
|
||||||
return EMPTY_VALIDATOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static JetNameValidator createCollectingValidator() {
|
|
||||||
return new JetNameValidator() {
|
|
||||||
private final Set<String> suggestedSet = new HashSet<String>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean validateInner(String name) {
|
|
||||||
return !suggestedSet.contains(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String validateName(String name) {
|
|
||||||
String validatedName = super.validateName(name);
|
|
||||||
suggestedSet.add(validatedName);
|
|
||||||
return validatedName;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates name, and slightly improves it by adding number to name in case of conflicts
|
|
||||||
* @param name to check it in scope
|
|
||||||
* @return name or nameI, where I is number
|
|
||||||
*/
|
|
||||||
public String validateName(String name) {
|
|
||||||
if (validateInner(name)) return name;
|
|
||||||
int i = 1;
|
|
||||||
while (!validateInner(name + i)) {
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return name + i;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract boolean validateInner(String name);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2013 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.jet.plugin.refactoring
|
||||||
|
|
||||||
|
import java.util.HashSet
|
||||||
|
|
||||||
|
public abstract class JetNameValidator {
|
||||||
|
/**
|
||||||
|
* Validates name, and slightly improves it by adding number to name in case of conflicts
|
||||||
|
* @param name to check it in scope
|
||||||
|
* @return name or nameI, where I is number
|
||||||
|
*/
|
||||||
|
public open fun validateName(name: String): String {
|
||||||
|
if (validateInner(name)) return name
|
||||||
|
var i = 1
|
||||||
|
while (!validateInner(name + i)) {
|
||||||
|
++i
|
||||||
|
}
|
||||||
|
|
||||||
|
return name + i
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract fun validateInner(name: String): Boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
public object EmptyValidator : JetNameValidator() {
|
||||||
|
override fun validateInner(name: String): Boolean = true
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CollectingValidator: JetNameValidator() {
|
||||||
|
private val suggestedSet = HashSet<String>()
|
||||||
|
|
||||||
|
override fun validateInner(name: String): Boolean = !suggestedSet.contains(name)
|
||||||
|
|
||||||
|
override fun validateName(name: String): String {
|
||||||
|
val validatedName = super.validateName(name)
|
||||||
|
suggestedSet.add(validatedName)
|
||||||
|
return validatedName
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-1
@@ -23,6 +23,7 @@ import org.jetbrains.jet.JetTestUtils;
|
|||||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.plugin.PluginTestCaseBase;
|
import org.jetbrains.jet.plugin.PluginTestCaseBase;
|
||||||
|
import org.jetbrains.jet.plugin.refactoring.EmptyValidator;
|
||||||
import org.jetbrains.jet.plugin.refactoring.JetNameSuggester;
|
import org.jetbrains.jet.plugin.refactoring.JetNameSuggester;
|
||||||
import org.jetbrains.jet.plugin.refactoring.JetNameValidator;
|
import org.jetbrains.jet.plugin.refactoring.JetNameValidator;
|
||||||
import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil;
|
import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil;
|
||||||
@@ -92,7 +93,7 @@ public class JetNameSuggesterTest extends LightCodeInsightFixtureTestCase {
|
|||||||
JetRefactoringUtil.selectExpression(myFixture.getEditor(), file, new JetRefactoringUtil.SelectExpressionCallback() {
|
JetRefactoringUtil.selectExpression(myFixture.getEditor(), file, new JetRefactoringUtil.SelectExpressionCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void run(@Nullable JetExpression expression) {
|
public void run(@Nullable JetExpression expression) {
|
||||||
String[] names = JetNameSuggester.suggestNames(expression, JetNameValidator.getEmptyValidator(), "value");
|
String[] names = JetNameSuggester.suggestNames(expression, EmptyValidator.INSTANCE$, "value");
|
||||||
Arrays.sort(names);
|
Arrays.sort(names);
|
||||||
String result = StringUtil.join(names, "\n").trim();
|
String result = StringUtil.join(names, "\n").trim();
|
||||||
assertEquals(expectedResultText, result);
|
assertEquals(expectedResultText, result);
|
||||||
|
|||||||
Reference in New Issue
Block a user