Change Type Quick-Fix: Convert to Kotlin & refactor. Wrap in delegating quick fix to decrease memory footprint
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user