Add quickfix for JAVA_TYPE_MISMATCH

This commit is contained in:
Denis Zharkov
2015-08-31 19:54:01 +03:00
parent 632e336782
commit c17451cf5c
6 changed files with 57 additions and 1 deletions
@@ -31,7 +31,9 @@ import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.idea.util.ShortenReferences;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm;
import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.TypesPackage;
import org.jetbrains.kotlin.types.checker.JetTypeChecker;
import static org.jetbrains.kotlin.psi.PsiPackage.JetPsiFactory;
@@ -64,7 +66,11 @@ public class CastExpressionFix extends JetIntentionAction<JetExpression> {
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
if (!super.isAvailable(project, editor, file)) return false;
JetType expressionType = ResolvePackage.analyze(element).getType(element);
return expressionType != null && JetTypeChecker.DEFAULT.isSubtypeOf(type, expressionType);
return expressionType != null
&& (
JetTypeChecker.DEFAULT.isSubtypeOf(type, expressionType) // downcast
|| JetTypeChecker.DEFAULT.isSubtypeOf(expressionType, type) // upcast
);
}
@Override
@@ -106,4 +112,19 @@ public class CastExpressionFix extends JetIntentionAction<JetExpression> {
}
};
}
@NotNull
public static JetSingleIntentionActionFactory createFactoryForGenericVarianceConversion() {
return new JetSingleIntentionActionFactory() {
@Nullable
@Override
public IntentionAction createAction(@NotNull Diagnostic diagnostic) {
DiagnosticWithParameters2<JetExpression, JetType, JetType> diagnosticWithParameters =
ErrorsJvm.JAVA_TYPE_MISMATCH.cast(diagnostic);
return new CastExpressionFix(
diagnosticWithParameters.getPsiElement(), TypesPackage.flexibility(diagnosticWithParameters.getB()).getUpperBound()
);
}
};
}
}
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createVariable.CreateP
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createVariable.CreateParameterByRefActionFactory
import org.jetbrains.kotlin.lexer.JetTokens.*
import org.jetbrains.kotlin.psi.JetClass
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.DEPRECATED_ANNOTATION_METHOD_CALL
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.NO_REFLECTION_IN_CLASS_PATH
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION
@@ -315,5 +316,7 @@ public class QuickFixRegistrar : QuickFixContributor {
POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION.registerFactory(ReplaceJavaAnnotationPositionedArgumentsFix)
NO_REFLECTION_IN_CLASS_PATH.registerFactory(AddReflectionQuickFix)
ErrorsJvm.JAVA_TYPE_MISMATCH.registerFactory(CastExpressionFix.createFactoryForGenericVarianceConversion())
}
}
@@ -0,0 +1,6 @@
// "Cast expression 'x' to 'List<Any>?'" "true"
// ERROR: Java type mismatch expected kotlin.(Mutable)List<kotlin.Any!>! but found kotlin.MutableList<kotlin.String>. Use explicit cast
fun main(x: MutableList<String>) {
A.foo(x as List<Any>?)
}
@@ -0,0 +1,6 @@
// "Cast expression 'x' to 'List<Any>?'" "true"
// ERROR: Java type mismatch expected kotlin.(Mutable)List<kotlin.Any!>! but found kotlin.MutableList<kotlin.String>. Use explicit cast
fun main(x: MutableList<String>) {
A.foo(<caret>x)
}
@@ -0,0 +1,5 @@
import java.util.*
class A {
static void foo(List<Object> x) {}
}
@@ -1220,6 +1220,21 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/typeMismatch"), Pattern.compile("^(\\w+)\\.before\\.Main\\.kt$"), true);
}
@TestMetadata("idea/testData/quickfix/typeMismatch/genericVarianceViolation")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class GenericVarianceViolation extends AbstractQuickFixMultiFileTest {
public void testAllFilesPresentInGenericVarianceViolation() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/typeMismatch/genericVarianceViolation"), Pattern.compile("^(\\w+)\\.before\\.Main\\.kt$"), true);
}
@TestMetadata("basicMultiple.before.Main.kt")
public void testBasicMultiple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/genericVarianceViolation/basicMultiple.before.Main.kt");
doTestWithExtraFile(fileName);
}
}
}
@TestMetadata("idea/testData/quickfix/variables")