Rename Parameter to Match Overridden Method Quick-Fix: Convert to Kotlin & refactor

This commit is contained in:
Alexey Sedunov
2016-01-06 12:48:43 +03:00
parent c3b3ad52a9
commit 474ab531ea
3 changed files with 31 additions and 76 deletions
@@ -29,8 +29,6 @@ implement.members=Implement members
new.kotlin.file.action=Kotlin File/Class new.kotlin.file.action=Kotlin File/Class
import.fix=Import import.fix=Import
imports.chooser.title=Imports imports.chooser.title=Imports
rename.parameter.to.match.overridden.method=Rename parameter to match overridden method
rename.family=Rename
rename.kotlin.package.class.error=Can't rename Kotlin package facade class rename.kotlin.package.class.error=Can't rename Kotlin package facade class
add.semicolon.after.invocation=Add semicolon after invocation of ''{0}'' add.semicolon.after.invocation=Add semicolon after invocation of ''{0}''
add.semicolon.family=Add Semicolon add.semicolon.family=Add Semicolon
@@ -205,7 +205,7 @@ class QuickFixRegistrar : QuickFixContributor {
OVERRIDING_FINAL_MEMBER.registerFactory(MakeOverriddenMemberOpenFix) OVERRIDING_FINAL_MEMBER.registerFactory(MakeOverriddenMemberOpenFix)
PARAMETER_NAME_CHANGED_ON_OVERRIDE.registerFactory(RenameParameterToMatchOverriddenMethodFix.createFactory()) PARAMETER_NAME_CHANGED_ON_OVERRIDE.registerFactory(RenameParameterToMatchOverriddenMethodFix)
NESTED_CLASS_NOT_ALLOWED.registerFactory(AddModifierFix.createFactory(INNER_KEYWORD)) NESTED_CLASS_NOT_ALLOWED.registerFactory(AddModifierFix.createFactory(INNER_KEYWORD))
@@ -14,84 +14,41 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.idea.quickfix; package org.jetbrains.kotlin.idea.quickfix
import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile; import com.intellij.refactoring.rename.RenameProcessor
import com.intellij.refactoring.rename.RenameProcessor; import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import com.intellij.util.IncorrectOperationException; import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.descriptors.VariableDescriptor; import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.idea.KotlinBundle;
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils;
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.psi.KtParameter;
import org.jetbrains.kotlin.resolve.BindingContext;
public class RenameParameterToMatchOverriddenMethodFix extends KotlinQuickFixAction<KtParameter>{ class RenameParameterToMatchOverriddenMethodFix(
private final KtParameter parameter; private val parameter: KtParameter,
private String parameterFromSuperclassName; private val newName: String
) : KotlinQuickFixAction<KtParameter>(parameter) {
override fun getFamilyName() = "Rename"
public RenameParameterToMatchOverriddenMethodFix(@NotNull KtParameter parameter) { override fun getText() = "Rename parameter to match overridden method"
super(parameter);
this.parameter = parameter; public override fun invoke(project: Project, editor: Editor?, file: KtFile) {
RenameProcessor(project, parameter, newName, false, false).run()
} }
@Override companion object : KotlinSingleIntentionActionFactory() {
public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiFile file) { override fun createAction(diagnostic: Diagnostic): IntentionAction? {
if (!super.isAvailable(project, editor, file)) { val parameter = diagnostic.psiElement.getNonStrictParentOfType<KtParameter>() ?: return null
return false; val parameterDescriptor = parameter.resolveToDescriptor() as ValueParameterDescriptor
val parameterFromSuperclassName = parameterDescriptor
.overriddenDescriptors
.map { it.name.asString() }
.distinct()
.singleOrNull() ?: return null
return RenameParameterToMatchOverriddenMethodFix(parameter, parameterFromSuperclassName)
} }
BindingContext context = ResolutionUtils.analyze(parameter);
VariableDescriptor parameterDescriptor = context.get(BindingContext.VALUE_PARAMETER, parameter);
if (parameterDescriptor == null) {
return false;
}
for (CallableDescriptor parameterFromSuperclass : parameterDescriptor.getOverriddenDescriptors()) {
if (parameterFromSuperclassName == null) {
parameterFromSuperclassName = parameterFromSuperclass.getName().asString();
}
else if (!parameterFromSuperclassName.equals(parameterFromSuperclass.getName().asString())) {
return false;
}
}
return parameterFromSuperclassName != null;
}
@NotNull
@Override
public String getText() {
return KotlinBundle.message("rename.parameter.to.match.overridden.method");
}
@NotNull
@Override
public String getFamilyName() {
return KotlinBundle.message("rename.family");
}
@Override
public void invoke(@NotNull Project project, Editor editor, @NotNull KtFile file) throws IncorrectOperationException {
new RenameProcessor(project, parameter, parameterFromSuperclassName, false, false).run();
}
@NotNull
public static KotlinSingleIntentionActionFactory createFactory() {
return new KotlinSingleIntentionActionFactory() {
@Nullable
@Override
public IntentionAction createAction(@NotNull Diagnostic diagnostic) {
KtParameter parameter = QuickFixUtil.getParentElementOfType(diagnostic, KtParameter.class);
return parameter == null ? null : new RenameParameterToMatchOverriddenMethodFix(parameter);
}
};
} }
} }