Fix 'add not-null asserted call' quick fix for operation in
#KT-18529 Fixed
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -33,14 +33,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
|||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getImplicitReceiverValue
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
import org.jetbrains.kotlin.util.isValidOperator
|
import org.jetbrains.kotlin.util.isValidOperator
|
||||||
import org.jetbrains.kotlin.psi.KtPsiFactory
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getImplicitReceiverValue
|
|
||||||
|
|
||||||
|
|
||||||
abstract class ExclExclCallFix(psiElement: PsiElement) : KotlinQuickFixAction<PsiElement>(psiElement) {
|
abstract class ExclExclCallFix(psiElement: PsiElement) : KotlinQuickFixAction<PsiElement>(psiElement) {
|
||||||
@@ -117,7 +116,10 @@ class AddExclExclCallFix(psiElement: PsiElement, val checkImplicitReceivers: Boo
|
|||||||
val parent = psiElement.parent
|
val parent = psiElement.parent
|
||||||
when (parent) {
|
when (parent) {
|
||||||
is KtUnaryExpression -> parent.baseExpression.expressionForCall()
|
is KtUnaryExpression -> parent.baseExpression.expressionForCall()
|
||||||
is KtBinaryExpression -> parent.left.expressionForCall()
|
is KtBinaryExpression -> {
|
||||||
|
val receiver = if (KtPsiUtil.isInOrNotInOperation(parent)) parent.right else parent.left
|
||||||
|
receiver.expressionForCall()
|
||||||
|
}
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
// IS_APPLICABLE: false
|
// IS_APPLICABLE: false
|
||||||
// ERROR: Type mismatch: inferred type is Int but Boolean was expected
|
// ERROR: Type mismatch: inferred type is Int but Boolean was expected
|
||||||
// ERROR: Type mismatch: inferred type is Int but Boolean was expected
|
// ERROR: Type mismatch: inferred type is Int but Boolean was expected
|
||||||
// ERROR: Infix call corresponds to a dot-qualified call 'foo.times(10)' which is not allowed on a nullable receiver 'foo'. Use '?.'-qualified call instead
|
// ERROR: Operator call corresponds to a dot-qualified call 'foo.times(10)' which is not allowed on a nullable receiver 'foo'.
|
||||||
|
|
||||||
fun String?.times(a: Int): Boolean = a == 0
|
fun String?.times(a: Int): Boolean = a == 0
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// IS_APPLICABLE: false
|
// IS_APPLICABLE: false
|
||||||
// ERROR: Type mismatch: inferred type is Int but Boolean was expected
|
// ERROR: Type mismatch: inferred type is Int but Boolean was expected
|
||||||
// ERROR: Type mismatch: inferred type is Int but Boolean was expected
|
// ERROR: Type mismatch: inferred type is Int but Boolean was expected
|
||||||
// ERROR: Infix call corresponds to a dot-qualified call 'foo.times(10)' which is not allowed on a nullable receiver 'foo'. Use '?.'-qualified call instead
|
// ERROR: Operator call corresponds to a dot-qualified call 'foo.times(10)' which is not allowed on a nullable receiver 'foo'.
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
val foo: Int? = 4
|
val foo: Int? = 4
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
// IS_APPLICABLE: false
|
// IS_APPLICABLE: false
|
||||||
// ERROR: Infix call corresponds to a dot-qualified call 'nullable?.compareTo(1).compareTo(0)' which is not allowed on a nullable receiver 'nullable?.compareTo(1)'. Use '?.'-qualified call instead
|
// ERROR: Operator call corresponds to a dot-qualified call 'nullable?.compareTo(1).compareTo(0)' which is not allowed on a nullable receiver 'nullable?.compareTo(1)'.
|
||||||
|
|
||||||
val nullable: Int? = null
|
val nullable: Int? = null
|
||||||
val x = nullable?.compareTo<caret>(1) >= 0
|
val x = nullable?.compareTo<caret>(1) >= 0
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// "Add non-null asserted (!!) call" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun foo(a: List<String>?) {
|
||||||
|
"x" <caret>in a
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// "Add non-null asserted (!!) call" "true"
|
||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun foo(a: List<String>?) {
|
||||||
|
"x" in a!!
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
// "Replace with safe (?.) call" "false"
|
// "Replace with safe (?.) call" "false"
|
||||||
// ERROR: Infix call corresponds to a dot-qualified call 'p1.compareTo(p2)' which is not allowed on a nullable receiver 'p1'. Use '?.'-qualified call instead
|
// ERROR: Operator call corresponds to a dot-qualified call 'p1.compareTo(p2)' which is not allowed on a nullable receiver 'p1'.
|
||||||
// ACTION: Add non-null asserted (!!) call
|
// ACTION: Add non-null asserted (!!) call
|
||||||
// ACTION: Flip '>'
|
// ACTION: Flip '>'
|
||||||
// ACTION: Replace overloaded operator with function call
|
// ACTION: Replace overloaded operator with function call
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
// ACTION: Add non-null asserted (!!) call
|
// ACTION: Add non-null asserted (!!) call
|
||||||
// ACTION: Flip '<'
|
// ACTION: Flip '<'
|
||||||
// ACTION: Replace overloaded operator with function call
|
// ACTION: Replace overloaded operator with function call
|
||||||
// ERROR: Infix call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'. Use '?.'-qualified call instead
|
// ERROR: Operator call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'.
|
||||||
|
|
||||||
class Wrapper(val x: Int)
|
class Wrapper(val x: Int)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
// ACTION: Flip '>'
|
// ACTION: Flip '>'
|
||||||
// ACTION: Replace overloaded operator with function call
|
// ACTION: Replace overloaded operator with function call
|
||||||
// ACTION: Simplify boolean expression
|
// ACTION: Simplify boolean expression
|
||||||
// ERROR: Infix call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'. Use '?.'-qualified call instead
|
// ERROR: Operator call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'.
|
||||||
|
|
||||||
class Wrapper(val x: Int)
|
class Wrapper(val x: Int)
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// ACTION: Add non-null asserted (!!) call
|
// ACTION: Add non-null asserted (!!) call
|
||||||
// ACTION: Flip '<='
|
// ACTION: Flip '<='
|
||||||
// ACTION: Replace overloaded operator with function call
|
// ACTION: Replace overloaded operator with function call
|
||||||
// ERROR: Infix call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'. Use '?.'-qualified call instead
|
// ERROR: Operator call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'.
|
||||||
|
|
||||||
class Wrapper(val x: Int)
|
class Wrapper(val x: Int)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
// ACTION: Add non-null asserted (!!) call
|
// ACTION: Add non-null asserted (!!) call
|
||||||
// ACTION: Flip '>='
|
// ACTION: Flip '>='
|
||||||
// ACTION: Replace overloaded operator with function call
|
// ACTION: Replace overloaded operator with function call
|
||||||
// ERROR: Infix call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'. Use '?.'-qualified call instead
|
// ERROR: Operator call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'.
|
||||||
|
|
||||||
class Wrapper(val x: Int)
|
class Wrapper(val x: Int)
|
||||||
|
|
||||||
|
|||||||
@@ -265,6 +265,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addExclExclCall/normal2.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addExclExclCall/normal2.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("operationIn.kt")
|
||||||
|
public void testOperationIn() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addExclExclCall/operationIn.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("idea/testData/quickfix/addGenericUpperBound")
|
@TestMetadata("idea/testData/quickfix/addGenericUpperBound")
|
||||||
|
|||||||
Reference in New Issue
Block a user