Change Type Quick-Fix: Convert to Kotlin & refactor. Wrap in delegating quick fix to decrease memory footprint

This commit is contained in:
Alexey Sedunov
2015-12-25 16:36:09 +03:00
parent 11ef780adf
commit 3153196343
2 changed files with 29 additions and 54 deletions
@@ -14,67 +14,42 @@
* 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.openapi.editor.Editor
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project
import com.intellij.openapi.project.Project; import org.jetbrains.kotlin.diagnostics.Diagnostic
import com.intellij.util.IncorrectOperationException; import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil
import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters1; import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil; import org.jetbrains.kotlin.psi.KtTypeReference
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers; import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.idea.util.ShortenReferences;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.psi.KtParameter;
import org.jetbrains.kotlin.psi.KtPsiFactoryKt;
import org.jetbrains.kotlin.psi.KtTypeReference;
import org.jetbrains.kotlin.types.KotlinType;
public class ChangeTypeFix extends KotlinQuickFixAction<KtTypeReference> { class ChangeTypeFix(element: KtTypeReference, private val type: KotlinType) : KotlinQuickFixAction<KtTypeReference>(element) {
private final KotlinType type; override fun getFamilyName() = "Change type"
private final String renderedType;
public ChangeTypeFix(@NotNull KtTypeReference element, KotlinType type) { override fun getText(): String {
super(element); val currentTypeText = element.text
this.type = type; return "Change type from '$currentTypeText' to '${QuickFixUtil.renderTypeWithFqNameOnClash(type, currentTypeText)}'"
renderedType = IdeDescriptorRenderers.SOURCE_CODE.renderType(type);
} }
@NotNull override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@Override val newTypeRef = element.replaced(KtPsiFactory(file).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type)))
public String getText() { ShortenReferences.DEFAULT.process(newTypeRef)
String currentTypeText = getElement().getText();
return KotlinBundle.message("change.type", currentTypeText, QuickFixUtil.renderTypeWithFqNameOnClash(type, currentTypeText));
} }
@NotNull companion object : KotlinSingleIntentionActionFactoryWithDelegate<KtTypeReference, KotlinType>() {
@Override override fun getElementOfInterest(diagnostic: Diagnostic) =
public String getFamilyName() { Errors.EXPECTED_PARAMETER_TYPE_MISMATCH.cast(diagnostic).psiElement.typeReference
return KotlinBundle.message("change.type.family");
}
@Override override fun extractFixData(element: KtTypeReference, diagnostic: Diagnostic) =
public void invoke(@NotNull Project project, Editor editor, @NotNull KtFile file) throws IncorrectOperationException { Errors.EXPECTED_PARAMETER_TYPE_MISMATCH.cast(diagnostic).a
KtTypeReference newTypeRef = (KtTypeReference) getElement().replace(KtPsiFactoryKt.KtPsiFactory(file).createType(renderedType));
ShortenReferences.DEFAULT.process(newTypeRef);
}
@NotNull override fun createFix(originalElement: KtTypeReference, data: KotlinType) =
public static KotlinSingleIntentionActionFactory createFactoryForExpectedParameterTypeMismatch() { ChangeTypeFix(originalElement, data)
return new KotlinSingleIntentionActionFactory() {
@Nullable
@Override
public IntentionAction createAction(@NotNull Diagnostic diagnostic) {
DiagnosticWithParameters1<KtParameter, KotlinType> diagnosticWithParameters = Errors.EXPECTED_PARAMETER_TYPE_MISMATCH.cast(diagnostic);
KtTypeReference typeReference = diagnosticWithParameters.getPsiElement().getTypeReference();
assert typeReference != null : "EXPECTED_PARAMETER_TYPE_MISMATCH reported on parameter without explicitly declared type";
return new ChangeTypeFix(typeReference, diagnosticWithParameters.getA());
}
};
} }
} }
@@ -236,7 +236,7 @@ class QuickFixRegistrar : QuickFixContributor {
UNUSED_PARAMETER.registerFactory(RemoveUnusedFunctionParameterFix) UNUSED_PARAMETER.registerFactory(RemoveUnusedFunctionParameterFix)
EXPECTED_PARAMETERS_NUMBER_MISMATCH.registerFactory(ChangeFunctionLiteralSignatureFix) EXPECTED_PARAMETERS_NUMBER_MISMATCH.registerFactory(ChangeFunctionLiteralSignatureFix)
EXPECTED_PARAMETER_TYPE_MISMATCH.registerFactory(ChangeTypeFix.createFactoryForExpectedParameterTypeMismatch()) EXPECTED_PARAMETER_TYPE_MISMATCH.registerFactory(ChangeTypeFix)
EXTENSION_PROPERTY_WITH_BACKING_FIELD.registerFactory(ConvertExtensionPropertyInitializerToGetterFix) EXTENSION_PROPERTY_WITH_BACKING_FIELD.registerFactory(ConvertExtensionPropertyInitializerToGetterFix)