[NI] Move ability to convert standalone SAM-argument under the feature
If new inference is enabled only for IDE analysis, then this feature will be disabled to reduce difference between new and old inference, but if new inference is enabled in the compiler, then this feature will be enabled too to preserve behavior of new inference for compilation #KT-32175 Fixed #KT-32143 Fixed #KT-32123 Fixed #KT-32230 Fixed
This commit is contained in:
+10
@@ -323,6 +323,7 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
|
|||||||
|
|
||||||
if (newInference) {
|
if (newInference) {
|
||||||
put(LanguageFeature.NewInference, LanguageFeature.State.ENABLED)
|
put(LanguageFeature.NewInference, LanguageFeature.State.ENABLED)
|
||||||
|
put(LanguageFeature.SamConversionPerArgument, LanguageFeature.State.ENABLED)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (legacySmartCastAfterTry) {
|
if (legacySmartCastAfterTry) {
|
||||||
@@ -360,11 +361,20 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
|
|||||||
private fun HashMap<LanguageFeature, LanguageFeature.State>.configureLanguageFeaturesFromInternalArgs(collector: MessageCollector) {
|
private fun HashMap<LanguageFeature, LanguageFeature.State>.configureLanguageFeaturesFromInternalArgs(collector: MessageCollector) {
|
||||||
val featuresThatForcePreReleaseBinaries = mutableListOf<LanguageFeature>()
|
val featuresThatForcePreReleaseBinaries = mutableListOf<LanguageFeature>()
|
||||||
|
|
||||||
|
var standaloneSamConversionFeaturePassedExplicitly = false
|
||||||
for ((feature, state) in internalArguments.filterIsInstance<ManualLanguageFeatureSetting>()) {
|
for ((feature, state) in internalArguments.filterIsInstance<ManualLanguageFeatureSetting>()) {
|
||||||
put(feature, state)
|
put(feature, state)
|
||||||
if (state == LanguageFeature.State.ENABLED && feature.forcesPreReleaseBinariesIfEnabled()) {
|
if (state == LanguageFeature.State.ENABLED && feature.forcesPreReleaseBinariesIfEnabled()) {
|
||||||
featuresThatForcePreReleaseBinaries += feature
|
featuresThatForcePreReleaseBinaries += feature
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (feature == LanguageFeature.SamConversionPerArgument) {
|
||||||
|
standaloneSamConversionFeaturePassedExplicitly = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!standaloneSamConversionFeaturePassedExplicitly && this[LanguageFeature.NewInference] == LanguageFeature.State.ENABLED) {
|
||||||
|
put(LanguageFeature.SamConversionPerArgument, LanguageFeature.State.ENABLED)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (featuresThatForcePreReleaseBinaries.isNotEmpty()) {
|
if (featuresThatForcePreReleaseBinaries.isNotEmpty()) {
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ class JavaSyntheticScopes(
|
|||||||
val scopesWithForceEnabledSamAdapters: Collection<SyntheticScope>
|
val scopesWithForceEnabledSamAdapters: Collection<SyntheticScope>
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val newInferenceEnabled = languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
val samConversionPerArgumentIsEnabled =
|
||||||
|
languageVersionSettings.supportsFeature(LanguageFeature.SamConversionPerArgument)
|
||||||
|
|
||||||
val javaSyntheticPropertiesScope = JavaSyntheticPropertiesScope(storageManager, lookupTracker)
|
val javaSyntheticPropertiesScope = JavaSyntheticPropertiesScope(storageManager, lookupTracker)
|
||||||
val scopesFromExtensions = SyntheticScopeProviderExtension
|
val scopesFromExtensions = SyntheticScopeProviderExtension
|
||||||
@@ -58,12 +59,12 @@ class JavaSyntheticScopes(
|
|||||||
samConventionResolver,
|
samConventionResolver,
|
||||||
deprecationResolver,
|
deprecationResolver,
|
||||||
lookupTracker,
|
lookupTracker,
|
||||||
samViaSyntheticScopeDisabled = newInferenceEnabled
|
samViaSyntheticScopeDisabled = samConversionPerArgumentIsEnabled
|
||||||
)
|
)
|
||||||
|
|
||||||
scopes = listOf(javaSyntheticPropertiesScope, samAdapterFunctionsScope) + scopesFromExtensions
|
scopes = listOf(javaSyntheticPropertiesScope, samAdapterFunctionsScope) + scopesFromExtensions
|
||||||
|
|
||||||
if (newInferenceEnabled) {
|
if (samConversionPerArgumentIsEnabled) {
|
||||||
val forceEnabledSamAdapterFunctionsScope = SamAdapterFunctionsScope(
|
val forceEnabledSamAdapterFunctionsScope = SamAdapterFunctionsScope(
|
||||||
storageManager,
|
storageManager,
|
||||||
samConventionResolver,
|
samConventionResolver,
|
||||||
|
|||||||
+7
-10
@@ -17,13 +17,11 @@
|
|||||||
package org.jetbrains.kotlin.synthetic
|
package org.jetbrains.kotlin.synthetic
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor
|
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor
|
import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor
|
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCallImpl
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl
|
import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
|
|
||||||
@@ -63,13 +61,12 @@ fun syntheticVisibility(originalDescriptor: DeclarationDescriptorWithVisibility,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun <D : CallableDescriptor> ResolvedCall<D>.isResolvedWithSamConversions(): Boolean {
|
fun <D : CallableDescriptor> ResolvedCall<D>.isResolvedWithSamConversions(): Boolean {
|
||||||
return if (this is NewResolvedCallImpl<D>) {
|
if (this is NewResolvedCallImpl<D> && resolvedCallAtom.argumentsWithConversion.isNotEmpty()) {
|
||||||
// New inference
|
return true
|
||||||
this.resolvedCallAtom.argumentsWithConversion.isNotEmpty()
|
|
||||||
} else {
|
|
||||||
// Old Inference
|
|
||||||
this.resultingDescriptor is SamAdapterDescriptor<*> ||
|
|
||||||
this.resultingDescriptor is SamConstructorDescriptor ||
|
|
||||||
this.resultingDescriptor is SamAdapterExtensionFunctionDescriptor
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Feature SamConversionPerArgument is disabled
|
||||||
|
return this.resultingDescriptor is SamAdapterDescriptor<*> ||
|
||||||
|
this.resultingDescriptor is SamConstructorDescriptor ||
|
||||||
|
this.resultingDescriptor is SamAdapterExtensionFunctionDescriptor
|
||||||
}
|
}
|
||||||
+2
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.resolve.calls.components
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
|
import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
|
||||||
import org.jetbrains.kotlin.builtins.isFunctionType
|
import org.jetbrains.kotlin.builtins.isFunctionType
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMapper.TypeArgumentsMapping.NoExplicitArguments
|
import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMapper.TypeArgumentsMapping.NoExplicitArguments
|
||||||
@@ -295,6 +296,7 @@ private fun KotlinResolutionCandidate.getExpectedTypeWithSAMConversion(
|
|||||||
argument: KotlinCallArgument,
|
argument: KotlinCallArgument,
|
||||||
candidateParameter: ParameterDescriptor
|
candidateParameter: ParameterDescriptor
|
||||||
): UnwrappedType? {
|
): UnwrappedType? {
|
||||||
|
if (!callComponents.languageVersionSettings.supportsFeature(LanguageFeature.SamConversionPerArgument)) return null
|
||||||
if (!callComponents.samConversionTransformer.shouldRunSamConversionForFunction(resolvedCall.candidateDescriptor)) return null
|
if (!callComponents.samConversionTransformer.shouldRunSamConversionForFunction(resolvedCall.candidateDescriptor)) return null
|
||||||
|
|
||||||
val argumentIsFunctional = when (argument) {
|
val argumentIsFunctional = when (argument) {
|
||||||
|
|||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
$TESTDATA_DIR$/standaloneSamConversionsAreEnabledWithNewInference.kt
|
||||||
|
-d
|
||||||
|
$TEMP_DIR$
|
||||||
|
-Xnew-inference -XXLanguage:-SamConversionPerArgument
|
||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
warning: flag is not supported by this version of the compiler: -Xnew-inference -XXLanguage:-SamConversionPerArgument
|
||||||
|
compiler/testData/cli/jvm/standaloneSamConversionsAreEnabledWithNewInference.kt:9:25: error: type mismatch: inferred type is () -> Unit but Runnable was expected
|
||||||
|
ForceSam.compare(r, {})
|
||||||
|
^
|
||||||
|
compiler/testData/cli/jvm/standaloneSamConversionsAreEnabledWithNewInference.kt:10:22: error: type mismatch: inferred type is () -> Unit but Runnable was expected
|
||||||
|
ForceSam.compare({}, r)
|
||||||
|
^
|
||||||
|
COMPILATION_ERROR
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
$TESTDATA_DIR$/standaloneSamConversionsAreEnabledWithNewInference.kt
|
||||||
|
-d
|
||||||
|
$TEMP_DIR$
|
||||||
|
-Xnew-inference
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
object ForceSam : java.util.Comparator<Runnable> {
|
||||||
|
override fun compare(o1: Runnable, o2: Runnable): Int = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test(r: Runnable) {
|
||||||
|
ForceSam.compare(r, r)
|
||||||
|
ForceSam.compare({}, {})
|
||||||
|
|
||||||
|
ForceSam.compare(r, {})
|
||||||
|
ForceSam.compare({}, r)
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
OK
|
||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
$TESTDATA_DIR$/standaloneSamConversionsAreEnabledWithNewInference.kt
|
||||||
|
-d
|
||||||
|
$TEMP_DIR$
|
||||||
|
-XXLanguage:+NewInference
|
||||||
Vendored
+10
@@ -0,0 +1,10 @@
|
|||||||
|
warning: ATTENTION!
|
||||||
|
This build uses unsafe internal compiler arguments:
|
||||||
|
|
||||||
|
-XXLanguage:+NewInference
|
||||||
|
|
||||||
|
This mode is not recommended for production use,
|
||||||
|
as no stability/compatibility guarantees are given on
|
||||||
|
compiler or generated code. Use it at your own risk!
|
||||||
|
|
||||||
|
OK
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
$TESTDATA_DIR$/standaloneSamConversionsAreEnabledWithNewInference.kt
|
||||||
|
-d
|
||||||
|
$TEMP_DIR$
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
compiler/testData/cli/jvm/standaloneSamConversionsAreEnabledWithNewInference.kt:9:25: error: type mismatch: inferred type is () -> Unit but Runnable was expected
|
||||||
|
ForceSam.compare(r, {})
|
||||||
|
^
|
||||||
|
compiler/testData/cli/jvm/standaloneSamConversionsAreEnabledWithNewInference.kt:10:22: error: type mismatch: inferred type is () -> Unit but Runnable was expected
|
||||||
|
ForceSam.compare({}, r)
|
||||||
|
^
|
||||||
|
COMPILATION_ERROR
|
||||||
-1
@@ -1,6 +1,5 @@
|
|||||||
// !LANGUAGE: +NewInference
|
// !LANGUAGE: +NewInference
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
|
|
||||||
// FILE: example/Hello.java
|
// FILE: example/Hello.java
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// !LANGUAGE: +NewInference
|
// !LANGUAGE: +NewInference +SamConversionPerArgument
|
||||||
// IGNORE_BACKEND: JVM_IR
|
// IGNORE_BACKEND: JVM_IR
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions
|
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions +SamConversionPerArgument
|
||||||
// IGNORE_BACKEND: JVM_IR
|
// IGNORE_BACKEND: JVM_IR
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
+3
-3
@@ -1,4 +1,4 @@
|
|||||||
// !WITH_NEW_INFERENCE
|
// !LANGUAGE: +SamConversionPerArgument +NewInference
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
// FILE: A.java
|
// FILE: A.java
|
||||||
@@ -16,14 +16,14 @@ fun <T> bar(s: T) {}
|
|||||||
fun <T> complex(t: T, f: (T) -> Unit) {}
|
fun <T> complex(t: T, f: (T) -> Unit) {}
|
||||||
|
|
||||||
fun test1() {
|
fun test1() {
|
||||||
foo(1, <!NI;TYPE_MISMATCH!>A::invokeLater<!>) // KT-24507 SAM conversion accidentally applied to callable reference and incorrectly handled via BE
|
foo(1, <!TYPE_MISMATCH!>A::invokeLater<!>) // KT-24507 SAM conversion accidentally applied to callable reference and incorrectly handled via BE
|
||||||
foo(1, ::bar)
|
foo(1, ::bar)
|
||||||
|
|
||||||
complex(1, ::bar)
|
complex(1, ::bar)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <R> test2(x: R) {
|
fun <R> test2(x: R) {
|
||||||
foo(x, <!NI;TYPE_MISMATCH!>A::invokeLater<!>) // KT-24507 SAM conversion accidentally applied to callable reference and incorrectly handled via BE
|
foo(x, <!TYPE_MISMATCH!>A::invokeLater<!>) // KT-24507 SAM conversion accidentally applied to callable reference and incorrectly handled via BE
|
||||||
foo(x, ::bar)
|
foo(x, ::bar)
|
||||||
|
|
||||||
complex(x, ::bar)
|
complex(x, ::bar)
|
||||||
|
|||||||
+1
-1
@@ -13,5 +13,5 @@ public class J {
|
|||||||
package test
|
package test
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
J("", <!NAMED_ARGUMENTS_NOT_ALLOWED!>r<!> = { }, <!NAMED_ARGUMENTS_NOT_ALLOWED!>z<!> = false)
|
J("", <!NAMED_ARGUMENTS_NOT_ALLOWED!>r<!> = <!NI;TYPE_MISMATCH!>{ }<!>, <!NAMED_ARGUMENTS_NOT_ALLOWED!>z<!> = false)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -13,5 +13,5 @@ public class J {
|
|||||||
package test
|
package test
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
J.foo("", <!NAMED_ARGUMENTS_NOT_ALLOWED!>r<!> = { }, <!NAMED_ARGUMENTS_NOT_ALLOWED!>z<!> = false)
|
J.foo("", <!NAMED_ARGUMENTS_NOT_ALLOWED!>r<!> = <!NI;TYPE_MISMATCH!>{ }<!>, <!NAMED_ARGUMENTS_NOT_ALLOWED!>z<!> = false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class B {
|
|||||||
fun main() {
|
fun main() {
|
||||||
fun println() {}
|
fun println() {}
|
||||||
// All parameters in SAM adapter of `foo` have functional types
|
// All parameters in SAM adapter of `foo` have functional types
|
||||||
B().foo(<!OI;TYPE_MISMATCH!>{ println() }<!>, B.bar())
|
B().foo(<!TYPE_MISMATCH!>{ println() }<!>, B.bar())
|
||||||
// So you should use SAM constructors when you want to use mix lambdas and Java objects
|
// So you should use SAM constructors when you want to use mix lambdas and Java objects
|
||||||
B().foo(Runnable { println() }, B.bar())
|
B().foo(Runnable { println() }, B.bar())
|
||||||
B().foo({ println() }, { it: Any? -> it == null } )
|
B().foo({ println() }, { it: Any? -> it == null } )
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !LANGUAGE: +NewInference
|
// !LANGUAGE: +NewInference +SamConversionPerArgument
|
||||||
// !CHECK_TYPE
|
// !CHECK_TYPE
|
||||||
// FILE: J.java
|
// FILE: J.java
|
||||||
public interface J<T> {
|
public interface J<T> {
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions
|
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions +SamConversionPerArgument
|
||||||
// !CHECK_TYPE
|
// !CHECK_TYPE
|
||||||
// FILE: F.java
|
// FILE: F.java
|
||||||
public interface F<S> {
|
public interface F<S> {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions
|
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions +SamConversionPerArgument
|
||||||
// !CHECK_TYPE
|
// !CHECK_TYPE
|
||||||
// FILE: Fn.java
|
// FILE: Fn.java
|
||||||
public interface Fn<T, R> {
|
public interface Fn<T, R> {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions
|
// !LANGUAGE: +NewInference +SamConversionPerArgument
|
||||||
// FILE: J.java
|
// FILE: J.java
|
||||||
public interface J {
|
public interface J {
|
||||||
public void foo1(Runnable r);
|
public void foo1(Runnable r);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions
|
// !LANGUAGE: +NewInference +SamConversionForKotlinFunctions +SamConversionPerArgument
|
||||||
// FILE: Runnable.java
|
// FILE: Runnable.java
|
||||||
public interface Runnable {
|
public interface Runnable {
|
||||||
void run();
|
void run();
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ class B : A() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (d.x is B) {
|
if (d.x is B) {
|
||||||
<!OI;SMARTCAST_IMPOSSIBLE!>d.x<!>.<!NI;INVISIBLE_MEMBER!>foo<!> {}
|
<!SMARTCAST_IMPOSSIBLE!>d.x<!>.<!NI;INVISIBLE_MEMBER!>foo<!> {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
// FILE: KotlinFile.kt
|
// FILE: KotlinFile.kt
|
||||||
fun foo(javaClass: JavaClass<Int>): Int {
|
fun foo(javaClass: JavaClass<Int>): Int {
|
||||||
val inner = javaClass.createInner<String>()
|
val inner = javaClass.createInner<String>()
|
||||||
return <!TYPE_MISMATCH!>inner.doSomething(<!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>, "") <!OI;TYPE_MISMATCH!>{ }<!><!>
|
return <!TYPE_MISMATCH!>inner.<!NI;TYPE_MISMATCH!>doSomething(<!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>, "") <!TYPE_MISMATCH!>{ }<!><!><!>
|
||||||
}
|
}
|
||||||
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|||||||
+2
-2
@@ -1,9 +1,9 @@
|
|||||||
// !WITH_NEW_INFERENCE
|
// !WITH_NEW_INFERENCE
|
||||||
// FILE: KotlinFile.kt
|
// FILE: KotlinFile.kt
|
||||||
fun foo(javaClass: JavaClass) {
|
fun foo(javaClass: JavaClass) {
|
||||||
javaClass.doSomething(<!NAMED_ARGUMENTS_NOT_ALLOWED!>p<!> = 1) {
|
javaClass.doSomething(<!NAMED_ARGUMENTS_NOT_ALLOWED!>p<!> = 1) <!NI;TYPE_MISMATCH!>{
|
||||||
bar()
|
bar()
|
||||||
}
|
}<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
fun bar(){}
|
fun bar(){}
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
// !WITH_NEW_INFERENCE
|
// !WITH_NEW_INFERENCE
|
||||||
// FILE: KotlinFile.kt
|
// FILE: KotlinFile.kt
|
||||||
fun foo(javaClass: JavaClass) {
|
fun foo(javaClass: JavaClass) {
|
||||||
javaClass.<!INVISIBLE_MEMBER!>doSomething<!> <!OI;TYPE_MISMATCH!>{ }<!>
|
javaClass.<!INVISIBLE_MEMBER!>doSomething<!> <!TYPE_MISMATCH!>{ }<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|||||||
@@ -576,6 +576,26 @@ public class CliTestGenerated extends AbstractCliTest {
|
|||||||
runTest("compiler/testData/cli/jvm/singleJavaFileRoots.args");
|
runTest("compiler/testData/cli/jvm/singleJavaFileRoots.args");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("standaloneSamConversionsAreDisabledExplicitlyWithNewInference.args")
|
||||||
|
public void testStandaloneSamConversionsAreDisabledExplicitlyWithNewInference() throws Exception {
|
||||||
|
runTest("compiler/testData/cli/jvm/standaloneSamConversionsAreDisabledExplicitlyWithNewInference.args");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("standaloneSamConversionsAreEnabledWithNewInference.args")
|
||||||
|
public void testStandaloneSamConversionsAreEnabledWithNewInference() throws Exception {
|
||||||
|
runTest("compiler/testData/cli/jvm/standaloneSamConversionsAreEnabledWithNewInference.args");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("standaloneSamConversionsAreEnabledWithNewInferenceInternalFlag.args")
|
||||||
|
public void testStandaloneSamConversionsAreEnabledWithNewInferenceInternalFlag() throws Exception {
|
||||||
|
runTest("compiler/testData/cli/jvm/standaloneSamConversionsAreEnabledWithNewInferenceInternalFlag.args");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("standaloneSamConversionsBaseline_1_3.args")
|
||||||
|
public void testStandaloneSamConversionsBaseline_1_3() throws Exception {
|
||||||
|
runTest("compiler/testData/cli/jvm/standaloneSamConversionsBaseline_1_3.args");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("suppressAllWarningsJvm.args")
|
@TestMetadata("suppressAllWarningsJvm.args")
|
||||||
public void testSuppressAllWarningsJvm() throws Exception {
|
public void testSuppressAllWarningsJvm() throws Exception {
|
||||||
runTest("compiler/testData/cli/jvm/suppressAllWarningsJvm.args");
|
runTest("compiler/testData/cli/jvm/suppressAllWarningsJvm.args");
|
||||||
|
|||||||
@@ -125,6 +125,8 @@ enum class LanguageFeature(
|
|||||||
|
|
||||||
SamConversionForKotlinFunctions(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED),
|
SamConversionForKotlinFunctions(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED),
|
||||||
|
|
||||||
|
SamConversionPerArgument(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED),
|
||||||
|
|
||||||
// can be used only with NewInference feature
|
// can be used only with NewInference feature
|
||||||
NewDataFlowForTryExpressions(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED),
|
NewDataFlowForTryExpressions(sinceVersion = KOTLIN_1_3, defaultState = State.DISABLED),
|
||||||
|
|
||||||
|
|||||||
@@ -10,11 +10,13 @@ import com.intellij.codeInspection.*
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElementVisitor
|
import com.intellij.psi.PsiElementVisitor
|
||||||
import org.jetbrains.kotlin.codegen.SamCodegenUtil
|
import org.jetbrains.kotlin.codegen.SamCodegenUtil
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.forceEnableSamAdapters
|
import org.jetbrains.kotlin.idea.codeInsight.forceEnableSamAdapters
|
||||||
|
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.idea.resolve.frontendService
|
import org.jetbrains.kotlin.idea.resolve.frontendService
|
||||||
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
@@ -131,10 +133,13 @@ class RedundantSamConstructorInspection : AbstractKotlinInspection() {
|
|||||||
if (!resolutionResults.isSuccess) return false
|
if (!resolutionResults.isSuccess) return false
|
||||||
|
|
||||||
val samAdapterOriginalDescriptor =
|
val samAdapterOriginalDescriptor =
|
||||||
if (resolutionResults.resultingCall is NewResolvedCallImpl<*>)
|
if (parentCall.languageVersionSettings.supportsFeature(LanguageFeature.SamConversionPerArgument) &&
|
||||||
|
resolutionResults.resultingCall is NewResolvedCallImpl<*>
|
||||||
|
) {
|
||||||
resolutionResults.resultingDescriptor
|
resolutionResults.resultingDescriptor
|
||||||
else
|
} else {
|
||||||
SamCodegenUtil.getOriginalIfSamAdapter(resolutionResults.resultingDescriptor) ?: return false
|
SamCodegenUtil.getOriginalIfSamAdapter(resolutionResults.resultingDescriptor) ?: return false
|
||||||
|
}
|
||||||
|
|
||||||
return samAdapterOriginalDescriptor.original == originalCall.resultingDescriptor.original
|
return samAdapterOriginalDescriptor.original == originalCall.resultingDescriptor.original
|
||||||
}
|
}
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
object ForceSam : java.util.Comparator<Runnable> {
|
||||||
|
override fun compare(o1: Runnable, o2: Runnable): Int = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test(r: Runnable) {
|
||||||
|
ForceSam.compare(r, r)
|
||||||
|
ForceSam.compare({}, {})
|
||||||
|
|
||||||
|
ForceSam.compare(r, <error descr="[TYPE_MISMATCH] Type mismatch: inferred type is () -> Unit but Runnable was expected">{}</error>)
|
||||||
|
ForceSam.compare(<error descr="[TYPE_MISMATCH] Type mismatch: inferred type is () -> Unit but Runnable was expected">{}</error>, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that new inference is enabled
|
||||||
|
object Scope {
|
||||||
|
interface A
|
||||||
|
interface B<T>
|
||||||
|
class C<T>
|
||||||
|
|
||||||
|
fun <T, K> foo(<warning descr="[UNUSED_PARAMETER] Parameter 'c' is never used">c</warning>: C<T>) where K : A, K : B<T> {}
|
||||||
|
|
||||||
|
fun usage(c: C<Any>) {
|
||||||
|
foo(c) // should compile only in NI
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -930,5 +930,10 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest {
|
|||||||
public void testOperatorCallDiagnosticsOnInOperator() throws Exception {
|
public void testOperatorCallDiagnosticsOnInOperator() throws Exception {
|
||||||
runTest("idea/testData/checker/diagnosticsMessage/operatorCallDiagnosticsOnInOperator.kt");
|
runTest("idea/testData/checker/diagnosticsMessage/operatorCallDiagnosticsOnInOperator.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("standaloneSamConversionIsDisabledInIDE.kt")
|
||||||
|
public void testStandaloneSamConversionIsDisabledInIDE() throws Exception {
|
||||||
|
runTest("idea/testData/checker/diagnosticsMessage/standaloneSamConversionIsDisabledInIDE.kt");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user