Converted to Kotlin + no i18n

This commit is contained in:
Valentin Kipyatkov
2015-09-04 14:35:08 +03:00
parent 55558e2969
commit 955a0c2281
3 changed files with 141 additions and 186 deletions
@@ -200,10 +200,6 @@ change.function.signature.action.multiple=Change function signature...
change.function.signature.family=Change function signature
change.function.signature.chooser.title=Choose signature
change.function.signature.action=Change function signature
add.name.to.argument.family=Add Name to Argument
add.name.to.argument.single=Add name to argument\: ''{0}''
add.name.to.argument.multiple=Add name to argument...
add.name.to.argument.action=Add name to argument...
add.name.to.parameter.name.chooser.title=Choose parameter name
replace.java.class.argument=Replace javaClass<T>() with T::class
@@ -1,182 +0,0 @@
/*
* Copyright 2010-2015 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.kotlin.idea.quickfix;
import com.google.common.collect.Lists;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.ListPopupStep;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.util.PsiTreeUtil;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.JetIcons;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.core.CorePackage;
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.JetCallElement;
import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.psi.JetValueArgument;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.checker.JetTypeChecker;
import javax.swing.*;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static org.jetbrains.kotlin.psi.PsiPackage.JetPsiFactory;
public class AddNameToArgumentFix extends JetIntentionAction<JetValueArgument> {
@NotNull
private final List<String> possibleNames;
public AddNameToArgumentFix(@NotNull JetValueArgument argument, @NotNull List<String> possibleNames) {
super(argument);
this.possibleNames = possibleNames;
}
@NotNull
private static List<String> generatePossibleNames(@NotNull JetValueArgument argument) {
JetCallElement callElement = PsiTreeUtil.getParentOfType(argument, JetCallElement.class);
assert callElement != null : "The argument has to be inside a function or constructor call";
BindingContext context = ResolvePackage.analyze(argument);
ResolvedCall<?> resolvedCall = CallUtilPackage.getResolvedCall(callElement, context);
if (resolvedCall == null) return Collections.emptyList();
CallableDescriptor callableDescriptor = resolvedCall.getResultingDescriptor();
JetExpression argExpression = argument.getArgumentExpression();
JetType type = argExpression != null ? context.getType(argExpression) : null;
Set<ValueParameterDescriptor> usedParameters = KotlinPackage.toSet( CorePackage.mapArgumentsToParameters(resolvedCall.getCall(), callableDescriptor).values());
List<String> names = Lists.newArrayList();
for (ValueParameterDescriptor parameter: callableDescriptor.getValueParameters()) {
if (!usedParameters.contains(parameter) && (type == null || JetTypeChecker.DEFAULT.isSubtypeOf(type, parameter.getType()))) {
names.add(parameter.getName().asString());
}
}
return names;
}
@Override
protected void invoke(@NotNull Project project, Editor editor, JetFile file) {
if (possibleNames.size() == 1 || editor == null || !editor.getComponent().isShowing()) {
addName(project, element, possibleNames.get(0));
}
else {
chooseNameAndAdd(project, editor);
}
}
private void chooseNameAndAdd(@NotNull Project project, Editor editor) {
JBPopupFactory.getInstance().createListPopup(getNamePopup(project)).showInBestPositionFor(editor);
}
private ListPopupStep getNamePopup(final @NotNull Project project) {
return new BaseListPopupStep<String>(
JetBundle.message("add.name.to.parameter.name.chooser.title"), possibleNames) {
@Override
public PopupStep onChosen(String selectedName, boolean finalChoice) {
if (finalChoice) {
addName(project, element, selectedName);
}
return FINAL_CHOICE;
}
@Override
public Icon getIconFor(String name) {
return JetIcons.PARAMETER;
}
@NotNull
@Override
public String getTextFor(String name) {
return getParsedArgumentWithName(name, element).getText();
}
};
}
private static void addName(@NotNull Project project, final @NotNull JetValueArgument argument, final @NotNull String name) {
PsiDocumentManager.getInstance(project).commitAllDocuments();
CommandProcessor.getInstance().executeCommand(project, new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
JetValueArgument newArgument = getParsedArgumentWithName(name, argument);
argument.replace(newArgument);
}
});
}
}, JetBundle.message("add.name.to.argument.action"), null);
}
@NotNull
private static JetValueArgument getParsedArgumentWithName(@NotNull String name, @NotNull JetValueArgument argument) {
JetExpression argumentExpression = argument.getArgumentExpression();
assert argumentExpression != null : "Argument should be already parsed.";
return JetPsiFactory(argument).createArgument(argumentExpression, Name.identifier(name), argument.getSpreadElement() != null);
}
@NotNull
@Override
public String getText() {
if (possibleNames.size() == 1) {
return JetBundle.message("add.name.to.argument.single", getParsedArgumentWithName(possibleNames.get(0), element).getText());
} else {
return JetBundle.message("add.name.to.argument.multiple");
}
}
@NotNull
@Override
public String getFamilyName() {
return JetBundle.message("add.name.to.argument.family");
}
@NotNull
public static JetIntentionActionsFactory createFactory() {
return new JetSingleIntentionActionFactory() {
@Nullable
@Override
public IntentionAction createAction(@NotNull Diagnostic diagnostic) {
JetValueArgument argument = QuickFixUtil.getParentElementOfType(diagnostic, JetValueArgument.class);
if (argument == null) return null;
List<String> possibleNames = generatePossibleNames(argument);
return possibleNames.isEmpty() ? null : new AddNameToArgumentFix(argument, possibleNames);
}
};
}
}
@@ -0,0 +1,141 @@
/*
* Copyright 2010-2015 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.kotlin.idea.quickfix
import com.google.common.collect.Lists
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.command.CommandProcessor
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.ui.popup.ListPopupStep
import com.intellij.openapi.ui.popup.PopupStep
import com.intellij.openapi.ui.popup.util.BaseListPopupStep
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.idea.JetIcons
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.core.mapArgumentsToParameters
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.JetCallElement
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.JetValueArgument
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.types.checker.JetTypeChecker
public class AddNameToArgumentFix(argument: JetValueArgument, private val possibleNames: List<String>) : JetIntentionAction<JetValueArgument>(argument) {
override fun invoke(project: Project, editor: Editor?, file: JetFile) {
if (possibleNames.size() == 1 || editor == null || !editor.component.isShowing) {
addName(project, element, possibleNames.get(0))
}
else {
chooseNameAndAdd(project, editor)
}
}
private fun chooseNameAndAdd(project: Project, editor: Editor) {
JBPopupFactory.getInstance().createListPopup(getNamePopup(project)).showInBestPositionFor(editor)
}
private fun getNamePopup(project: Project): ListPopupStep<String> {
return object : BaseListPopupStep<String>(JetBundle.message("add.name.to.parameter.name.chooser.title"), possibleNames) {
override fun onChosen(selectedName: String, finalChoice: Boolean): PopupStep<Any> {
if (finalChoice) {
addName(project, element, selectedName)
}
return PopupStep.FINAL_CHOICE
}
override fun getIconFor(name: String) = JetIcons.PARAMETER
override fun getTextFor(name: String) = getParsedArgumentWithName(name, element).text
}
}
override fun getText(): String {
return possibleNames
.singleOrNull()
?.let { "Add name to argument: '${getParsedArgumentWithName(it, element).text}'" }
?: "Add name to argument..."
}
override fun getFamilyName() = "Add Name to Argument"
companion object {
private fun generatePossibleNames(argument: JetValueArgument): List<String> {
val callElement = PsiTreeUtil.getParentOfType(argument, JetCallElement::class.java)
assert(callElement != null, "The argument has to be inside a function or constructor call")
val context = argument.analyze()
val resolvedCall = callElement!!.getResolvedCall(context) ?: return emptyList()
val callableDescriptor = resolvedCall.resultingDescriptor
val argExpression = argument.getArgumentExpression()
val type = if (argExpression != null) context.getType(argExpression) else null
val usedParameters = resolvedCall.call.mapArgumentsToParameters(callableDescriptor).values().toSet()
val names = Lists.newArrayList<String>()
for (parameter in callableDescriptor.valueParameters) {
if (!usedParameters.contains(parameter) && (type == null || JetTypeChecker.DEFAULT.isSubtypeOf(type, parameter.type))) {
names.add(parameter.name.asString())
}
}
return names
}
private fun addName(project: Project, argument: JetValueArgument, name: String) {
PsiDocumentManager.getInstance(project).commitAllDocuments()
CommandProcessor.getInstance().executeCommand(
project,
object : Runnable {
override fun run() {
ApplicationManager.getApplication().runWriteAction(object : Runnable {
override fun run() {
val newArgument = getParsedArgumentWithName(name, argument)
argument.replace(newArgument)
}
})
}
},
"Add name to argument...",
null)
}
private fun getParsedArgumentWithName(name: String, argument: JetValueArgument): JetValueArgument {
val argumentExpression = argument.getArgumentExpression()
assert(argumentExpression != null, "Argument should be already parsed.")
return JetPsiFactory(argument).createArgument(argumentExpression!!, Name.identifier(name), argument.getSpreadElement() != null)
}
public fun createFactory(): JetIntentionActionsFactory {
return object : JetSingleIntentionActionFactory() {
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
val argument = QuickFixUtil.getParentElementOfType(diagnostic, JetValueArgument::class.java) ?: return null
val possibleNames = generatePossibleNames(argument)
if (possibleNames.isEmpty()) return null
return AddNameToArgumentFix(argument, possibleNames)
}
}
}
}
}