Change Signature: Translate JetParameterInfo to Kotlin

This commit is contained in:
Alexey Sedunov
2014-12-08 18:48:44 +03:00
parent 04a56afa23
commit 6544294f8f
15 changed files with 171 additions and 255 deletions
@@ -137,16 +137,18 @@ public class AddFunctionParametersFix extends ChangeFunctionSignatureFix {
JetType parameterType = parameters.get(i).getType(); JetType parameterType = parameters.get(i).getType();
if (argumentType != null && !JetTypeChecker.DEFAULT.isSubtypeOf(argumentType, parameterType)) { if (argumentType != null && !JetTypeChecker.DEFAULT.isSubtypeOf(argumentType, parameterType)) {
changeSignatureData.getParameters().get(i).setTypeText(IdeDescriptorRenderers.SOURCE_CODE.renderType(argumentType)); changeSignatureData.getParameters().get(i).setCurrentTypeText(
IdeDescriptorRenderers.SOURCE_CODE.renderType(argumentType)
);
typesToShorten.add(argumentType); typesToShorten.add(argumentType);
} }
} }
else { else {
JetParameterInfo parameterInfo = getNewParameterInfo(bindingContext, argument, validator); JetParameterInfo parameterInfo = getNewParameterInfo(bindingContext, argument, validator);
typesToShorten.add(parameterInfo.getType()); typesToShorten.add(parameterInfo.getOriginalType());
if (expression != null) { if (expression != null) {
parameterInfo.setDefaultValueText(expression.getText()); parameterInfo.setDefaultValueForCall(expression.getText());
} }
changeSignatureData.addParameter(parameterInfo); changeSignatureData.addParameter(parameterInfo);
@@ -66,7 +66,7 @@ public class ChangeFunctionLiteralSignatureFix extends ChangeFunctionSignatureFi
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];
changeSignatureData.addParameter(new JetParameterInfo(name, type)); changeSignatureData.addParameter(new JetParameterInfo(-1, name, type, null, "", null, null));
} }
} }
@@ -117,8 +117,8 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiE
JetExpression expression = argument.getArgumentExpression(); JetExpression expression = argument.getArgumentExpression();
JetType type = expression != null ? bindingContext.get(BindingContext.EXPRESSION_TYPE, expression) : null; JetType type = expression != null ? bindingContext.get(BindingContext.EXPRESSION_TYPE, expression) : null;
type = type != null ? type : KotlinBuiltIns.getInstance().getNullableAnyType(); type = type != null ? type : KotlinBuiltIns.getInstance().getNullableAnyType();
JetParameterInfo parameterInfo = new JetParameterInfo(name, type); JetParameterInfo parameterInfo = new JetParameterInfo(-1, name, type, null, "", null, null);
parameterInfo.setTypeText(IdeDescriptorRenderers.SOURCE_CODE.renderType(type)); parameterInfo.setCurrentTypeText(IdeDescriptorRenderers.SOURCE_CODE.renderType(type));
return parameterInfo; return parameterInfo;
} }
@@ -53,10 +53,10 @@ object CreateParameterActionFactory: JetSingleIntentionActionFactory() {
} }
} }
val parameterInfo = JetParameterInfo(refExpr.getReferencedName(), paramType) val parameterInfo = JetParameterInfo(name = refExpr.getReferencedName(), type = paramType)
fun chooseContainingClass(it: PsiElement): JetClass? { fun chooseContainingClass(it: PsiElement): JetClass? {
parameterInfo.setValOrVar(if (varExpected) JetValVar.Var else JetValVar.Val) parameterInfo.valOrVar = if (varExpected) JetValVar.Var else JetValVar.Val
return it.parents(false).firstIsInstanceOrNull<JetClassOrObject>() as? JetClass return it.parents(false).firstIsInstanceOrNull<JetClassOrObject>() as? JetClass
} }
@@ -59,8 +59,11 @@ public object CreateParameterByNamedArgumentActionFactory: JetSingleIntentionAct
} ?: anyType } ?: anyType
if (paramType.hasTypeParametersToAdd(functionDescriptor, context)) return null if (paramType.hasTypeParametersToAdd(functionDescriptor, context)) return null
val parameterInfo = JetParameterInfo(name, paramType) val parameterInfo = JetParameterInfo(
parameterInfo.setDefaultValueText(argumentExpression.getText() ?: "") name = name,
type = paramType,
defaultValueForCall = argumentExpression.getText() ?: ""
)
return CreateParameterFromUsageFix(functionDescriptor, context, parameterInfo, argument) return CreateParameterFromUsageFix(functionDescriptor, context, parameterInfo, argument)
} }
} }
@@ -343,7 +343,7 @@ public class JetChangeInfo implements ChangeInfo {
PsiType type = primaryMethodUpdated PsiType type = primaryMethodUpdated
? currentPsiMethod.getParameterList().getParameters()[pair.getFirst()].getType() ? currentPsiMethod.getParameterList().getParameters()[pair.getFirst()].getType()
: PsiType.VOID; : PsiType.VOID;
return new ParameterInfoImpl(info.getOldIndex(), info.getName(), type, info.getDefaultValueText()); return new ParameterInfoImpl(info.getOldIndex(), info.getName(), type, info.getDefaultValueForCall());
} }
} }
); );
@@ -390,10 +390,16 @@ public class JetChangeInfo implements ChangeInfo {
JetType originalType = oldIndex >= 0 JetType originalType = oldIndex >= 0
? originalParameterDescriptors.get(oldIndex).getType() ? originalParameterDescriptors.get(oldIndex).getType()
: currentType; : currentType;
String defaultValue = info.getDefaultValue();
JetParameterInfo jetParameterInfo = new JetParameterInfo(oldIndex, info.getName(), originalType, null, null); JetParameterInfo jetParameterInfo =
jetParameterInfo.setDefaultValueText(info.getDefaultValue()); new JetParameterInfo(oldIndex,
jetParameterInfo.setTypeText(IdeDescriptorRenderers.SOURCE_CODE.renderType(currentType)); info.getName(),
originalType, null,
defaultValue != null ? defaultValue : "",
null,
null);
jetParameterInfo.setCurrentTypeText(IdeDescriptorRenderers.SOURCE_CODE.renderType(currentType));
return jetParameterInfo; return jetParameterInfo;
} }
} }
@@ -40,7 +40,7 @@ public class JetChangeSignatureData(
) : JetMethodDescriptor { ) : JetMethodDescriptor {
private val parameters: MutableList<JetParameterInfo> private val parameters: MutableList<JetParameterInfo>
;{ ;{
val valueParameters = when { val valueParameters = when {
baseDeclaration is JetFunction -> baseDeclaration.getValueParameters() baseDeclaration is JetFunction -> baseDeclaration.getValueParameters()
baseDeclaration is JetClass -> baseDeclaration.getPrimaryConstructorParameters() baseDeclaration is JetClass -> baseDeclaration.getPrimaryConstructorParameters()
@@ -48,15 +48,14 @@ public class JetChangeSignatureData(
} }
parameters = baseDescriptor.getValueParameters().mapTo(ArrayList()) { parameterDescriptor -> parameters = baseDescriptor.getValueParameters().mapTo(ArrayList()) { parameterDescriptor ->
val jetParameter = valueParameters?.get(parameterDescriptor.getIndex()) val jetParameter = valueParameters?.get(parameterDescriptor.getIndex())
val parameterInfo = JetParameterInfo( JetParameterInfo(
parameterDescriptor.getIndex(), originalIndex = parameterDescriptor.getIndex(),
parameterDescriptor.getName().asString(), name = parameterDescriptor.getName().asString(),
parameterDescriptor.getType(), type = parameterDescriptor.getType(),
jetParameter?.getDefaultValue(), defaultValueForParameter = jetParameter?.getDefaultValue(),
jetParameter?.getValOrVarNode() valOrVarNode = jetParameter?.getValOrVarNode(),
modifierList = jetParameter?.getModifierList()
) )
parameterInfo.setModifierList(jetParameter?.getModifierList())
parameterInfo
} }
} }
@@ -223,7 +223,7 @@ public class JetChangeSignatureDialog extends ChangeSignatureDialogBase<
protected JBTableRowEditor getTableEditor(final JTable t, final ParameterTableModelItemBase<JetParameterInfo> item) { protected JBTableRowEditor getTableEditor(final JTable t, final ParameterTableModelItemBase<JetParameterInfo> item) {
return new JBTableRowEditor() { return new JBTableRowEditor() {
private final List<JComponent> components = new ArrayList<JComponent>(); private final List<JComponent> components = new ArrayList<JComponent>();
private final boolean defaultValueColumnEnabled = item.parameter.isNewParameter(); private final boolean defaultValueColumnEnabled = item.parameter.getIsNewParameter();
@Override @Override
public void prepareEditor(JTable table, final int row) { public void prepareEditor(JTable table, final int row) {
@@ -414,8 +414,8 @@ public class JetChangeSignatureDialog extends ChangeSignatureDialogBase<
for (int i = 0; i < parameters.size(); i++) { for (int i = 0; i < parameters.size(); i++) {
JetParameterInfo parameter = parameters.get(i); JetParameterInfo parameter = parameters.get(i);
parameter.setTypeText(myParametersTableModel.getItems().get(i).typeCodeFragment.getText().trim()); parameter.setCurrentTypeText(myParametersTableModel.getItems().get(i).typeCodeFragment.getText().trim());
parameter.setDefaultValueText(myParametersTableModel.getItems().get(i).defaultValueCodeFragment.getText().trim()); parameter.setDefaultValueForCall(myParametersTableModel.getItems().get(i).defaultValueCodeFragment.getText().trim());
} }
String returnTypeText = myReturnTypeCodeFragment != null ? myReturnTypeCodeFragment.getText().trim() : ""; String returnTypeText = myReturnTypeCodeFragment != null ? myReturnTypeCodeFragment.getText().trim() : "";
@@ -429,9 +429,7 @@ public class JetChangeSignatureDialog extends ChangeSignatureDialogBase<
List<JetParameterInfo> parameters = myMethod.getParameters(); List<JetParameterInfo> parameters = myMethod.getParameters();
for (int i = 0; i < parameters.size(); i++) { for (int i = 0; i < parameters.size(); i++) {
JetParameterInfo info = parameters.get(i); JetParameterInfo info = parameters.get(i);
if (info.isNewParameter()) { if (info.getIsNewParameter()) return i;
return i;
}
} }
return super.getSelectedIdx(); return super.getSelectedIdx();
} }
@@ -48,7 +48,7 @@ public class JetConstructorParameterTableModel extends JetFunctionParameterTable
@Override @Override
public boolean isCellEditable(ParameterTableModelItemBase<JetParameterInfo> item) { public boolean isCellEditable(ParameterTableModelItemBase<JetParameterInfo> item) {
return !item.isEllipsisType() && item.parameter.isNewParameter(); return !item.isEllipsisType() && item.parameter.getIsNewParameter();
} }
@Override @Override
@@ -46,11 +46,11 @@ public class JetFunctionParameterTableModel extends ParameterTableModelBase<JetP
@Override @Override
protected ParameterTableModelItemBase<JetParameterInfo> createRowItem(@Nullable JetParameterInfo parameterInfo) { protected ParameterTableModelItemBase<JetParameterInfo> createRowItem(@Nullable JetParameterInfo parameterInfo) {
if (parameterInfo == null) { if (parameterInfo == null) {
parameterInfo = new JetParameterInfo(-1); parameterInfo = new JetParameterInfo(-1, "", null, null, "", null, null);
} }
JetPsiFactory psiFactory = JetPsiFactory(project); JetPsiFactory psiFactory = JetPsiFactory(project);
final PsiCodeFragment paramTypeCodeFragment = psiFactory.createTypeCodeFragment(parameterInfo.getTypeText(), myTypeContext); PsiCodeFragment paramTypeCodeFragment = psiFactory.createTypeCodeFragment(parameterInfo.getTypeText(), myTypeContext);
final PsiCodeFragment defaultValueCodeFragment = psiFactory.createExpressionCodeFragment(parameterInfo.getDefaultValueText(), myDefaultValueContext); PsiCodeFragment defaultValueCodeFragment = psiFactory.createExpressionCodeFragment(parameterInfo.getDefaultValueForCall(), myDefaultValueContext);
return new ParameterTableModelItemBase<JetParameterInfo>(parameterInfo, paramTypeCodeFragment, defaultValueCodeFragment) { return new ParameterTableModelItemBase<JetParameterInfo>(parameterInfo, paramTypeCodeFragment, defaultValueCodeFragment) {
@Override @Override
public boolean isEllipsisType() { public boolean isEllipsisType() {
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -14,212 +14,118 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.plugin.refactoring.changeSignature; package org.jetbrains.jet.plugin.refactoring.changeSignature
import com.intellij.lang.ASTNode; import com.intellij.lang.ASTNode
import com.intellij.refactoring.changeSignature.ParameterInfo; import com.intellij.refactoring.changeSignature.ParameterInfo
import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.types.JetType
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetFunctionDefinitionUsage
import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor; import com.intellij.psi.PsiElement
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor
import org.jetbrains.jet.lang.psi.JetModifierList; import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.jet.lang.psi.JetParameter
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; import org.jetbrains.jet.lang.psi.JetModifierList
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeSubstitutor;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetFunctionDefinitionUsage;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import java.util.List; public class JetParameterInfo(
val originalIndex: Int = -1,
private var name: String,
type: JetType? = null,
var defaultValueForParameter: JetExpression? = null,
var defaultValueForCall: String = "",
valOrVarNode: ASTNode? = null,
val modifierList: JetModifierList? = null
): ParameterInfo {
val originalType: JetType? = type
var currentTypeText: String = getOldTypeText()
var valOrVar: JetValVar = valOrVarNode.toValVar()
public class JetParameterInfo implements ParameterInfo { private fun getOldTypeText() = originalType?.let { IdeDescriptorRenderers.SOURCE_CODE.renderType(it) } ?: ""
private String name = "";
private final int oldIndex;
private JetType type;
private String typeText;
private String defaultValueText = "";
private JetValVar valOrVar;
@Nullable private JetExpression defaultValue;
@Nullable JetModifierList modifierList;
public JetParameterInfo(int oldIndex, String name, JetType type, @Nullable JetExpression defaultValue, @Nullable ASTNode valOrVar) { override fun getOldIndex(): Int = originalIndex
this.oldIndex = oldIndex;
this.name = name;
this.type = type;
this.typeText = getOldTypeText();
this.defaultValue = defaultValue;
if (valOrVar == null) public val isNewParameter: Boolean
this.valOrVar = JetValVar.None; get() = originalIndex == -1
else if (valOrVar.getElementType() == JetTokens.VAL_KEYWORD)
this.valOrVar = JetValVar.Val; override fun getDefaultValue(): String? = null
else if (valOrVar.getElementType() == JetTokens.VAR_KEYWORD)
this.valOrVar = JetValVar.Var; override fun getName(): String = name
else
throw new IllegalArgumentException("Unknown val/var token: " + valOrVar.getText()); override fun setName(name: String?) {
this.name = name ?: ""
} }
public JetParameterInfo(String name, JetType type) { override fun getTypeText(): String = currentTypeText
this(-1, name, type, null, null);
public val isTypeChanged: Boolean get() = getOldTypeText() != currentTypeText
override fun isUseAnySingleVariable(): Boolean = false
override fun setUseAnySingleVariable(b: Boolean) {
throw UnsupportedOperationException()
} }
public JetParameterInfo(int index) { public fun renderType(parameterIndex: Int, inheritedFunction: JetFunctionDefinitionUsage<*>): String {
oldIndex = index; val typeSubstitutor = inheritedFunction.getOrCreateTypeSubstitutor() ?: return currentTypeText
typeText = ""; val currentBaseFunction = inheritedFunction.getBaseFunction().getCurrentFunctionDescriptor() ?: return currentTypeText
valOrVar = JetValVar.None; val parameterType = currentBaseFunction.getValueParameters().get(parameterIndex).getType()
return parameterType.renderTypeWithSubstitution(typeSubstitutor, currentTypeText, true)
} }
@Override public fun getInheritedName(inheritedFunction: JetFunctionDefinitionUsage<PsiElement>): String {
public String getName() { if (!inheritedFunction.isInherited()) return name
return name;
val baseFunction = inheritedFunction.getBaseFunction()
val baseFunctionDescriptor = baseFunction.getOriginalFunctionDescriptor()
val inheritedFunctionDescriptor = inheritedFunction.getOriginalFunctionDescriptor()
val inheritedParameterDescriptors = inheritedFunctionDescriptor.getValueParameters()
if (originalIndex < 0
|| originalIndex >= baseFunctionDescriptor.getValueParameters().size()
|| originalIndex >= inheritedParameterDescriptors.size()) return name
val inheritedParamName = inheritedParameterDescriptors.get(originalIndex).getName().asString()
val oldParamName = baseFunctionDescriptor.getValueParameters().get(originalIndex).getName().asString()
return when {
oldParamName == inheritedParamName && inheritedFunctionDescriptor !is AnonymousFunctionDescriptor -> name
else -> inheritedParamName
}
} }
public String renderType(int parameterIndex, @NotNull JetFunctionDefinitionUsage inheritedFunction) { public fun requiresExplicitType(inheritedFunction: JetFunctionDefinitionUsage<PsiElement>): Boolean {
TypeSubstitutor typeSubstitutor = inheritedFunction.getOrCreateTypeSubstitutor(); val inheritedFunctionDescriptor = inheritedFunction.getOriginalFunctionDescriptor()
if (typeSubstitutor == null) return typeText; if (inheritedFunctionDescriptor !is AnonymousFunctionDescriptor) return true
FunctionDescriptor currentBaseFunction = inheritedFunction.getBaseFunction().getCurrentFunctionDescriptor(); if (originalIndex < 0) return !inheritedFunction.hasExpectedType()
if (currentBaseFunction == null) return typeText;
JetType parameterType = currentBaseFunction.getValueParameters().get(parameterIndex).getType(); val inheritedParameterDescriptor = inheritedFunctionDescriptor.getValueParameters().get(originalIndex)
val parameter = DescriptorToSourceUtils.descriptorToDeclaration(inheritedParameterDescriptor) as? JetParameter ?: return false
return ChangeSignaturePackage.renderTypeWithSubstitution(parameterType, typeSubstitutor, typeText, true); return parameter.getTypeReference() != null
} }
public String getInheritedName(@NotNull JetFunctionDefinitionUsage inheritedFunction) { public fun getDeclarationSignature(parameterIndex: Int, inheritedFunction: JetFunctionDefinitionUsage<PsiElement>): String {
if (!inheritedFunction.isInherited()) return name; val buffer = StringBuilder()
JetFunctionDefinitionUsage baseFunction = inheritedFunction.getBaseFunction();
FunctionDescriptor baseFunctionDescriptor = baseFunction.getOriginalFunctionDescriptor();
FunctionDescriptor inheritedFunctionDescriptor = inheritedFunction.getOriginalFunctionDescriptor();
List<ValueParameterDescriptor> inheritedParameterDescriptors = inheritedFunctionDescriptor.getValueParameters();
if (oldIndex < 0
|| oldIndex >= baseFunctionDescriptor.getValueParameters().size()
|| oldIndex >= inheritedParameterDescriptors.size()) return name;
String inheritedParamName = inheritedParameterDescriptors.get(oldIndex).getName().asString();
String oldParamName = baseFunctionDescriptor.getValueParameters().get(oldIndex).getName().asString();
return oldParamName.equals(inheritedParamName) && !(inheritedFunctionDescriptor instanceof AnonymousFunctionDescriptor)
? name
: inheritedParamName;
}
@Override
public int getOldIndex() {
return oldIndex;
}
public boolean isNewParameter() {
return oldIndex == -1;
}
@Nullable
@Override
public String getDefaultValue() {
return null;
}
@Override
public void setName(String name) {
this.name = name != null ? name : "";
}
@Override
public boolean isUseAnySingleVariable() {
return false;
}
@Override
public void setUseAnySingleVariable(boolean b) {
throw new UnsupportedOperationException();
}
private String getOldTypeText() {
return IdeDescriptorRenderers.SOURCE_CODE.renderType(type);
}
@Override
public String getTypeText() {
return typeText;
}
public void setTypeText(String typeText) {
this.typeText = typeText;
}
public boolean isTypeChanged() {
return !getOldTypeText().equals(typeText);
}
public String getDefaultValueText() {
return defaultValueText;
}
public void setDefaultValueText(String defaultValueText) {
this.defaultValueText = defaultValueText;
}
public JetValVar getValOrVar() {
return valOrVar != null ? valOrVar : JetValVar.None;
}
public void setValOrVar(JetValVar valOrVar) {
this.valOrVar = valOrVar;
}
public JetType getType() {
return type;
}
@Nullable
public JetModifierList getModifierList() {
return modifierList;
}
public void setModifierList(@Nullable JetModifierList modifierList) {
this.modifierList = modifierList;
}
public boolean requiresExplicitType(@NotNull JetFunctionDefinitionUsage inheritedFunction) {
FunctionDescriptor inheritedFunctionDescriptor = inheritedFunction.getOriginalFunctionDescriptor();
if (!(inheritedFunctionDescriptor instanceof AnonymousFunctionDescriptor)) return true;
if (oldIndex < 0) return !inheritedFunction.hasExpectedType();
ValueParameterDescriptor inheritedParameterDescriptor = inheritedFunctionDescriptor.getValueParameters().get(oldIndex);
JetParameter parameter = (JetParameter) DescriptorToSourceUtils.descriptorToDeclaration(inheritedParameterDescriptor);
if (parameter == null) return false;
return parameter.getTypeReference() != null;
}
public String getDeclarationSignature(int parameterIndex, @NotNull JetFunctionDefinitionUsage inheritedFunction) {
StringBuilder buffer = new StringBuilder();
if (modifierList != null) { if (modifierList != null) {
buffer.append(modifierList.getText()).append(' '); buffer.append(modifierList.getText()).append(' ')
} }
JetValVar valVar = getValOrVar(); if (valOrVar != JetValVar.None) {
if (valVar != JetValVar.None) { buffer.append(valOrVar).append(' ')
buffer.append(valVar.toString()).append(' ');
} }
buffer.append(getInheritedName(inheritedFunction)); buffer.append(getInheritedName(inheritedFunction))
if (requiresExplicitType(inheritedFunction)) { if (requiresExplicitType(inheritedFunction)) {
buffer.append(": ").append(renderType(parameterIndex, inheritedFunction)); buffer.append(": ").append(renderType(parameterIndex, inheritedFunction))
} }
if (defaultValue != null && !inheritedFunction.isInherited()) { if (!inheritedFunction.isInherited()) {
buffer.append(" = ").append(defaultValue.getText()); defaultValueForParameter?.let { buffer.append(" = ").append(it.getText()) }
} }
return buffer.toString(); return buffer.toString()
} }
} }
@@ -16,6 +16,9 @@
package org.jetbrains.jet.plugin.refactoring.changeSignature package org.jetbrains.jet.plugin.refactoring.changeSignature
import com.intellij.lang.ASTNode
import org.jetbrains.jet.lexer.JetTokens
public enum class JetValVar(val name: String) { public enum class JetValVar(val name: String) {
None: JetValVar("none") None: JetValVar("none")
Val: JetValVar("val") Val: JetValVar("val")
@@ -23,3 +26,12 @@ public enum class JetValVar(val name: String) {
override fun toString(): String = name override fun toString(): String = name
} }
fun ASTNode?.toValVar(): JetValVar {
return when {
this == null -> JetValVar.None
getElementType() == JetTokens.VAL_KEYWORD -> JetValVar.Val
getElementType() == JetTokens.VAR_KEYWORD -> JetValVar.Var
else -> throw IllegalArgumentException("Unknown val/var token: " + getText())
}
}
@@ -70,7 +70,7 @@ public class JetFunctionCallUsage extends JetUsageInfo<JetCallElement> {
else else
parametersBuilder.append(','); parametersBuilder.append(',');
String defaultValueText = parameterInfo.getDefaultValueText(); String defaultValueText = parameterInfo.getDefaultValueForCall();
if (isNamedCall) { if (isNamedCall) {
String newName = parameterInfo.getInheritedName(callee); String newName = parameterInfo.getInheritedName(callee);
@@ -96,7 +96,7 @@ public class JetFunctionCallUsage extends JetUsageInfo<JetCallElement> {
changeArgumentName(argumentNameExpression, parameterInfo); changeArgumentName(argumentNameExpression, parameterInfo);
newArgument.replace(oldArgument); newArgument.replace(oldArgument);
} }
else if (parameterInfo.getDefaultValueText().isEmpty()) else if (parameterInfo.getDefaultValueForCall().isEmpty())
newArgument.delete(); newArgument.delete();
} }
@@ -292,7 +292,7 @@ public class JetFunctionDefinitionUsage<T extends PsiElement> extends JetUsageIn
parameter.addBefore(psiFactory.createWhiteSpace(), firstChild); parameter.addBefore(psiFactory.createWhiteSpace(), firstChild);
} }
if (parameterInfo.isTypeChanged() && parameter.getTypeReference() != null) { if (parameterInfo.getIsTypeChanged() && parameter.getTypeReference() != null) {
String renderedType = parameterInfo.renderType(parameterIndex, this); String renderedType = parameterInfo.renderType(parameterIndex, this);
parameter.setTypeReference(psiFactory.createType(renderedType)); parameter.setTypeReference(psiFactory.createType(renderedType));
} }
@@ -300,7 +300,8 @@ public class JetFunctionDefinitionUsage<T extends PsiElement> extends JetUsageIn
PsiElement identifier = parameter.getNameIdentifier(); PsiElement identifier = parameter.getNameIdentifier();
if (identifier != null) { if (identifier != null) {
String newName = parameterInfo.getInheritedName(this); //noinspection unchecked
String newName = parameterInfo.getInheritedName((JetFunctionDefinitionUsage<PsiElement>) this);
identifier.replace(psiFactory.createIdentifier(newName)); identifier.replace(psiFactory.createIdentifier(newName));
} }
} }
@@ -108,8 +108,7 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
changeInfo.setNewVisibility(Visibilities.PROTECTED); changeInfo.setNewVisibility(Visibilities.PROTECTED);
JetParameterInfo newParameter = new JetParameterInfo(-1, "x", KotlinBuiltIns.getInstance().getAnyType(), JetParameterInfo newParameter = new JetParameterInfo(-1, "x", KotlinBuiltIns.getInstance().getAnyType(),
null, JetPsiFactory(getProject()).createValOrVarNode("val")); null, "12", JetPsiFactory(getProject()).createValOrVarNode("val"), null);
newParameter.setDefaultValueText("12");
changeInfo.addParameter(newParameter); changeInfo.addParameter(newParameter);
doTest(changeInfo); doTest(changeInfo);
} }
@@ -123,7 +122,7 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
changeInfo.getNewParameters()[0].setName("_x1"); changeInfo.getNewParameters()[0].setName("_x1");
changeInfo.getNewParameters()[1].setName("_x2"); changeInfo.getNewParameters()[1].setName("_x2");
changeInfo.getNewParameters()[2].setName("_x3"); changeInfo.getNewParameters()[2].setName("_x3");
changeInfo.getNewParameters()[1].setTypeText("Float?"); changeInfo.getNewParameters()[1].setCurrentTypeText("Float?");
doTest(changeInfo); doTest(changeInfo);
} }
@@ -136,7 +135,7 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
changeInfo.getNewParameters()[0].setName("_x1"); changeInfo.getNewParameters()[0].setName("_x1");
changeInfo.getNewParameters()[1].setName("_x2"); changeInfo.getNewParameters()[1].setName("_x2");
changeInfo.getNewParameters()[2].setName("_x3"); changeInfo.getNewParameters()[2].setName("_x3");
changeInfo.getNewParameters()[1].setTypeText("Double?"); changeInfo.getNewParameters()[1].setCurrentTypeText("Double?");
doTest(changeInfo); doTest(changeInfo);
} }
@@ -156,7 +155,7 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
changeInfo.getNewParameters()[0].setName("_x1"); changeInfo.getNewParameters()[0].setName("_x1");
changeInfo.getNewParameters()[1].setName("_x2"); changeInfo.getNewParameters()[1].setName("_x2");
changeInfo.getNewParameters()[2].setName("_x3"); changeInfo.getNewParameters()[2].setName("_x3");
changeInfo.getNewParameters()[1].setTypeText("Float?"); changeInfo.getNewParameters()[1].setCurrentTypeText("Float?");
doTest(changeInfo); doTest(changeInfo);
} }
@@ -166,14 +165,14 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
changeInfo.getNewParameters()[0].setName("_x1"); changeInfo.getNewParameters()[0].setName("_x1");
changeInfo.getNewParameters()[1].setName("_x2"); changeInfo.getNewParameters()[1].setName("_x2");
changeInfo.getNewParameters()[2].setName("_x3"); changeInfo.getNewParameters()[2].setName("_x3");
changeInfo.getNewParameters()[1].setTypeText("Double?"); changeInfo.getNewParameters()[1].setCurrentTypeText("Double?");
doTest(changeInfo); doTest(changeInfo);
} }
public void testExpressionFunction() throws Exception { public void testExpressionFunction() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
changeInfo.getNewParameters()[0].setName("x1"); changeInfo.getNewParameters()[0].setName("x1");
changeInfo.addParameter(new JetParameterInfo("y1", KotlinBuiltIns.getInstance().getIntType())); changeInfo.addParameter(new JetParameterInfo(-1, "y1", KotlinBuiltIns.getInstance().getIntType(), null, "", null, null));
doTest(changeInfo); doTest(changeInfo);
} }
@@ -182,15 +181,14 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
changeInfo.setNewVisibility(Visibilities.INTERNAL); changeInfo.setNewVisibility(Visibilities.INTERNAL);
changeInfo.setNewParameter(2, changeInfo.getNewParameters()[1]); changeInfo.setNewParameter(2, changeInfo.getNewParameters()[1]);
changeInfo.setNewParameter(1, changeInfo.getNewParameters()[0]); changeInfo.setNewParameter(1, changeInfo.getNewParameters()[0]);
JetParameterInfo newParameter = new JetParameterInfo("x0", KotlinBuiltIns.getInstance().getNullableAnyType()); JetParameterInfo newParameter = new JetParameterInfo(-1, "x0", KotlinBuiltIns.getInstance().getNullableAnyType(), null, "null", null, null);
newParameter.setDefaultValueText("null");
changeInfo.setNewParameter(0, newParameter); changeInfo.setNewParameter(0, newParameter);
doTest(changeInfo); doTest(changeInfo);
} }
public void testFakeOverride() throws Exception { public void testFakeOverride() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo newParameter = new JetParameterInfo("i", KotlinBuiltIns.getInstance().getIntType()); JetParameterInfo newParameter = new JetParameterInfo(-1, "i", KotlinBuiltIns.getInstance().getIntType(), null, "", null, null);
changeInfo.addParameter(newParameter); changeInfo.addParameter(newParameter);
doTest(changeInfo); doTest(changeInfo);
} }
@@ -198,7 +196,7 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
public void testFunctionLiteral() throws Exception { public void testFunctionLiteral() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
changeInfo.getNewParameters()[1].setName("y1"); changeInfo.getNewParameters()[1].setName("y1");
changeInfo.addParameter(new JetParameterInfo("x", KotlinBuiltIns.getInstance().getAnyType())); changeInfo.addParameter(new JetParameterInfo(-1, "x", KotlinBuiltIns.getInstance().getAnyType(), null, "", null, null));
changeInfo.setNewReturnTypeText("Int"); changeInfo.setNewReturnTypeText("Int");
doTest(changeInfo); doTest(changeInfo);
} }
@@ -290,15 +288,14 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
public void testOverridesInEnumEntries() throws Exception { public void testOverridesInEnumEntries() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo newParameter = new JetParameterInfo("s", KotlinBuiltIns.getInstance().getStringType()); JetParameterInfo newParameter = new JetParameterInfo(-1, "s", KotlinBuiltIns.getInstance().getStringType(), null, "", null, null);
changeInfo.addParameter(newParameter); changeInfo.addParameter(newParameter);
doTest(changeInfo); doTest(changeInfo);
} }
public void testEnumEntriesWithoutSuperCalls() throws Exception { public void testEnumEntriesWithoutSuperCalls() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo newParameter = new JetParameterInfo("n", KotlinBuiltIns.getInstance().getIntType()); JetParameterInfo newParameter = new JetParameterInfo(-1, "n", KotlinBuiltIns.getInstance().getIntType(), null, "1", null, null);
newParameter.setDefaultValueText("1");
changeInfo.addParameter(newParameter); changeInfo.addParameter(newParameter);
doTest(changeInfo); doTest(changeInfo);
} }
@@ -307,29 +304,21 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo parameterInfo = changeInfo.getNewParameters()[0]; JetParameterInfo parameterInfo = changeInfo.getNewParameters()[0];
parameterInfo.setName("n"); parameterInfo.setName("n");
parameterInfo.setTypeText("Int"); parameterInfo.setCurrentTypeText("Int");
doTest(changeInfo); doTest(changeInfo);
} }
public void testConstructorJavaUsages() throws Exception { public void testConstructorJavaUsages() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo newParameter = new JetParameterInfo("s", KotlinBuiltIns.getInstance().getStringType()); JetParameterInfo newParameter = new JetParameterInfo(-1, "s", KotlinBuiltIns.getInstance().getStringType(), null, "\"abc\"", null, null);
newParameter.setDefaultValueText("\"abc\"");
changeInfo.addParameter(newParameter); changeInfo.addParameter(newParameter);
doTest(changeInfo); doTest(changeInfo);
} }
public void testFunctionJavaUsagesAndOverridesAddParam() throws Exception { public void testFunctionJavaUsagesAndOverridesAddParam() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
changeInfo.addParameter(new JetParameterInfo(-1, "s", KotlinBuiltIns.getInstance().getStringType(), null, "\"abc\"", null, null));
JetParameterInfo param1 = new JetParameterInfo("s", KotlinBuiltIns.getInstance().getStringType()); changeInfo.addParameter(new JetParameterInfo(-1, "o", KotlinBuiltIns.getInstance().getNullableAnyType(), null, "\"def\"", null, null));
param1.setDefaultValueText("\"abc\"");
changeInfo.addParameter(param1);
JetParameterInfo param2 = new JetParameterInfo("o", KotlinBuiltIns.getInstance().getNullableAnyType());
param2.setDefaultValueText("\"def\"");
changeInfo.addParameter(param2);
doTest(changeInfo); doTest(changeInfo);
} }
@@ -337,8 +326,8 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo[] newParameters = changeInfo.getNewParameters(); JetParameterInfo[] newParameters = changeInfo.getNewParameters();
newParameters[1].setTypeText("String?"); newParameters[1].setCurrentTypeText("String?");
newParameters[2].setTypeText("Any"); newParameters[2].setCurrentTypeText("Any");
changeInfo.setNewReturnTypeText("String?"); changeInfo.setNewReturnTypeText("String?");
@@ -349,9 +338,9 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo[] newParameters = changeInfo.getNewParameters(); JetParameterInfo[] newParameters = changeInfo.getNewParameters();
newParameters[0].setTypeText("String?"); newParameters[0].setCurrentTypeText("String?");
newParameters[1].setTypeText("Int"); newParameters[1].setCurrentTypeText("Int");
newParameters[2].setTypeText("Long?"); newParameters[2].setCurrentTypeText("Long?");
changeInfo.setNewReturnTypeText("Any?"); changeInfo.setNewReturnTypeText("Any?");
@@ -362,9 +351,9 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo[] newParameters = changeInfo.getNewParameters(); JetParameterInfo[] newParameters = changeInfo.getNewParameters();
newParameters[0].setTypeText("List<C>"); newParameters[0].setCurrentTypeText("List<C>");
newParameters[1].setTypeText("A?"); newParameters[1].setCurrentTypeText("A?");
newParameters[2].setTypeText("U<B>"); newParameters[2].setCurrentTypeText("U<B>");
changeInfo.setNewReturnTypeText("U<C>?"); changeInfo.setNewReturnTypeText("U<C>?");
@@ -408,7 +397,7 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
@Override @Override
ParameterInfoImpl[] getNewParameters(@NotNull PsiMethod method) { ParameterInfoImpl[] getNewParameters(@NotNull PsiMethod method) {
PsiType paramType = PsiType.getJavaLangString(getPsiManager(), GlobalSearchScope.allScope(getProject())); PsiType paramType = PsiType.getJavaLangString(getPsiManager(), GlobalSearchScope.allScope(getProject()));
return new ParameterInfoImpl[] { new ParameterInfoImpl(-1, "s", paramType) }; return new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "s", paramType)};
} }
} }
); );
@@ -555,14 +544,14 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
public void testParameterModifiers() throws Exception { public void testParameterModifiers() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
changeInfo.addParameter(new JetParameterInfo("n", KotlinBuiltIns.getInstance().getIntType())); changeInfo.addParameter(new JetParameterInfo(-1, "n", KotlinBuiltIns.getInstance().getIntType(), null, "", null, null));
doTest(changeInfo); doTest(changeInfo);
} }
public void testFqNameShortening() throws Exception { public void testFqNameShortening() throws Exception {
JetChangeInfo changeInfo = getChangeInfo(); JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo parameterInfo = new JetParameterInfo("s", KotlinBuiltIns.getInstance().getAnyType()); JetParameterInfo parameterInfo = new JetParameterInfo(-1, "s", KotlinBuiltIns.getInstance().getAnyType(), null, "", null, null);
parameterInfo.setTypeText("kotlin.String"); parameterInfo.setCurrentTypeText("kotlin.String");
changeInfo.addParameter(parameterInfo); changeInfo.addParameter(parameterInfo);
doTest(changeInfo); doTest(changeInfo);
} }