Rewrite RedundantSamConstructorInspection to support more cases

- Now inspection does not rely on synthetic descriptors at all, instead
it uses `SamConversionOracle` and `SamConversionResolver` to detect
if the argument type support SAM conversion
- This transparently considers all language features like
`SAM conversions for kotlin functions`, `Functional interfaces` etc.
- In case of multiple SAM arguments, part of them can be converted only
when `SAM conversion per argument` is enabled
- Fix inspection and nj2k tests that were failing because of better
working inspection
- Rewrite automatically fixes multiple bugs that were present
- ^KT-36367 ^KT-36368 ^KT-36296 ^KT-36395 Fixed
This commit is contained in:
Roman Golyshev
2020-02-10 13:12:21 +03:00
committed by Roman Golyshev
parent 9b5110b9f3
commit 46ae6136cb
23 changed files with 248 additions and 65 deletions
@@ -0,0 +1,3 @@
public class Test {
static public void test(Runnable r1, Runnable r2) {}
}
@@ -0,0 +1,5 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion -XXLanguage:+SamConversionPerArgument
fun usage(r1: Runnable) {
Test.test(r1, Runnable<caret> {})
}
@@ -0,0 +1,5 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion -XXLanguage:+SamConversionPerArgument
fun usage(r1: Runnable) {
Test.test(r1, {})
}
@@ -0,0 +1,7 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion -XXLanguage:+SamConversionPerArgument
fun test(r1: Runnable, r2: Runnable) {}
fun usage(r1: Runnable) {
test(r1, Runnable<caret> {})
}
@@ -0,0 +1,7 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion -XXLanguage:+SamConversionPerArgument
fun test(r1: Runnable, r2: Runnable) {}
fun usage(r1: Runnable) {
test(r1, {})
}
@@ -0,0 +1,11 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion -XXLanguage:+SamConversionPerArgument
fun interface KtRunnable {
fun run()
}
fun test(r1: KtRunnable, r2: KtRunnable) {}
fun usage(r1: KtRunnable) {
test(r1, KtRunnable<caret> {})
}
@@ -0,0 +1,11 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion -XXLanguage:+SamConversionPerArgument
fun interface KtRunnable {
fun run()
}
fun test(r1: KtRunnable, r2: KtRunnable) {}
fun usage(r1: KtRunnable) {
test(r1, {})
}
@@ -0,0 +1,7 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion -XXLanguage:+SamConversionPerArgument
fun test(r1: Runnable, r2: Runnable) {}
fun usage() {
test(Runnable { return@Runnable }, Runnable<caret> {})
}
@@ -0,0 +1,7 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion -XXLanguage:+SamConversionPerArgument
fun test(r1: Runnable, r2: Runnable) {}
fun usage() {
test(Runnable { return@Runnable }, {})
}
@@ -0,0 +1,8 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions
// PROBLEM: none
fun <T> test(t: T): T = t
fun usage() {
test(Runnable<caret> {})
}
@@ -0,0 +1,14 @@
interface Base {
void test1();
}
interface Extender extends Base {
@java.lang.Override
default void test1() { test2(); }
void test2();
}
class Taker {
static void take(Base b) {}
}
@@ -0,0 +1,5 @@
// PROBLEM: none
fun usage() {
Taker.take(Extender<caret> {})
}
@@ -0,0 +1,13 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion
fun interface KtRunnable {
fun run()
}
class Test {
fun usage(r: KtRunnable) {}
fun test() {
usage(KtRunnable<caret> { })
}
}
@@ -0,0 +1,13 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions -XXLanguage:+FunctionalInterfaceConversion
fun interface KtRunnable {
fun run()
}
class Test {
fun usage(r: KtRunnable) {}
fun test() {
usage({ })
}
}
@@ -0,0 +1,7 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions
fun usage(r: Runnable) {}
fun test() {
usage(Runnable<caret> { })
}
@@ -0,0 +1,7 @@
// COMPILER_ARGUMENTS: -XXLanguage:+NewInference -XXLanguage:+SamConversionForKotlinFunctions
fun usage(r: Runnable) {}
fun test() {
usage({ })
}