diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightPsi.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightPsi.kt index 8f89260d45a..ba946436a73 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightPsi.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightPsi.kt @@ -102,6 +102,7 @@ class KtUltraLightClass(classOrObject: KtClassOrObject, private val support: Ult // the following logic should be in the platform (super), overrides can be removed once that happens override fun getInterfaces(): Array = PsiClassImplUtil.getInterfaces(this) + override fun getSuperClass(): PsiClass? = PsiClassImplUtil.getSuperClass(this) override fun getSupers(): Array = PsiClassImplUtil.getSupers(this) override fun getSuperTypes(): Array = PsiClassImplUtil.getSuperTypes(this) @@ -559,9 +560,13 @@ internal class KtUltraLightMethod( containingClass: KtUltraLightClass ) : KtLightMethodImpl({ delegate }, LightMemberOriginForDeclaration(originalElement, JvmDeclarationOriginKind.OTHER), containingClass) { + // These two overrides are necessary because ones from KtLightMethodImpl suppose that clsDelegate.returnTypeElement is valid + // While here we only set return type for LightMethodBuilder (see org.jetbrains.kotlin.asJava.classes.KtUltraLightClass.asJavaMethod) override fun getReturnTypeElement(): PsiTypeElement? = null + override fun getReturnType(): PsiType? = clsDelegate.returnType - override fun getParameterList(): PsiParameterList = clsDelegate.parameterList + + override fun buildParametersForList(): List = clsDelegate.parameterList.parameters.toList() // should be in super override fun isVarArgs() = PsiImplUtil.isVarArgs(this) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt index b8af12f5a4d..a6e79d01b19 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethodImpl.kt @@ -53,10 +53,19 @@ open class KtLightMethodImpl protected constructor( private val paramsList: PsiParameterList by lazyPub { KtLightParameterList(this, dummyDelegate?.parameterList?.parametersCount ?: clsDelegate.parameterList.parametersCount) { - clsDelegate.parameterList.parameters.mapIndexed { index, clsParameter -> KtLightParameter(clsParameter, index, this@KtLightMethodImpl) } + buildParametersForList() } } + protected open fun buildParametersForList(): List = + clsDelegate.parameterList.parameters.mapIndexed { index, clsParameter -> + KtLightParameter( + clsParameter, + index, + this@KtLightMethodImpl + ) + } + private val typeParamsList: PsiTypeParameterList? by lazyPub { buildTypeParameterList() } protected open fun buildTypeParameterList(): PsiTypeParameterList? { @@ -253,4 +262,4 @@ val KtLightMethod.isGetter: Boolean get() = isAccessor(true) val KtLightMethod.isSetter: Boolean - get() = isAccessor(false) \ No newline at end of file + get() = isAccessor(false) diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.java new file mode 100644 index 00000000000..f6f7d125c3d --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.java @@ -0,0 +1,11 @@ +package test; + +public class MyFunctionType { + public void foo() { + MyFunction function1 = (CharSequence x) -> x.length(); + bar(x -> x.length()); + bar(CharSequence::length); + } + + public void bar(MyFunction x) {} +} diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.kt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.kt new file mode 100644 index 00000000000..030bf67afae --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.kt @@ -0,0 +1,7 @@ +package test + +public interface MyFunction : Function { + public operator fun invoke(p1: P1): R +} + + diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.txt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.txt new file mode 100644 index 00000000000..3d4d2b8287f --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.txt @@ -0,0 +1,2 @@ +// LANGUAGE_LEVEL 1.8 +// WITH_RUNTIME diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java index 348c63ec08f..8a2730612cb 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java @@ -124,6 +124,11 @@ public class JavaAgainstKotlinBinariesCheckerTestGenerated extends AbstractJavaA runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/KotlinAnnotations.kt"); } + @TestMetadata("MyFunctionType.kt") + public void testMyFunctionType() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.kt"); + } + @TestMetadata("ReturnInnerClasses.kt") public void testReturnInnerClasses() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ReturnInnerClasses.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java index fb0479f4f11..e952eb05047 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java @@ -126,6 +126,11 @@ public class JavaAgainstKotlinSourceCheckerTestGenerated extends AbstractJavaAga runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/KotlinAnnotations.kt"); } + @TestMetadata("MyFunctionType.kt") + public void testMyFunctionType() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.kt"); + } + @TestMetadata("ReturnInnerClasses.kt") public void testReturnInnerClasses() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ReturnInnerClasses.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java index cf4ee7f45c0..5b1fc983b38 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated.java @@ -126,6 +126,11 @@ public class JavaAgainstKotlinSourceCheckerWithUltraLightTestGenerated extends A runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/KotlinAnnotations.kt"); } + @TestMetadata("MyFunctionType.kt") + public void testMyFunctionType() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/MyFunctionType.kt"); + } + @TestMetadata("ReturnInnerClasses.kt") public void testReturnInnerClasses() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ReturnInnerClasses.kt");