Add quickfix for JAVA_TYPE_MISMATCH
This commit is contained in:
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
+6
@@ -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>?)
|
||||
}
|
||||
+6
@@ -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)
|
||||
}
|
||||
Vendored
+5
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user