diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 6b46f2834f7..c8dea2936f0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.psi.JetClassOrObject; import org.jetbrains.kotlin.psi.JetNamedFunction; import org.jetbrains.kotlin.resolve.BindingContext; +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.annotations.AnnotationsPackage; import org.jetbrains.kotlin.resolve.calls.CallResolverUtil; @@ -76,7 +77,9 @@ import static org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.callableDescr import static org.jetbrains.kotlin.resolve.DescriptorUtils.isFunctionLiteral; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isTrait; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE; -import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.*; +import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.Delegation; +import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.OtherOrigin; +import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.Synthetic; import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class FunctionCodegen { @@ -836,7 +839,7 @@ public class FunctionCodegen { final StackValue field ) { generateMethod( - Delegation(null, delegateFunction), delegateFunction, + Delegation(DescriptorToSourceUtils.descriptorToDeclaration(delegatedTo), delegateFunction), delegateFunction, new FunctionGenerationStrategy() { @Override public void generateBody( diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.0.kt new file mode 100644 index 00000000000..79ac40d91c0 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.0.kt @@ -0,0 +1,11 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetNamedFunction +// OPTIONS: usages, skipImports +package server + +trait TraitWithImpl { + fun foo() = 1 +} + +public class TraitWithDelegatedWithImpl(f: TraitWithImpl): TraitWithImpl by f + +fun test(twdwi: TraitWithDelegatedWithImpl) = twdwi.foo() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.1.java b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.1.java new file mode 100644 index 00000000000..e1a4bad1459 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.1.java @@ -0,0 +1,9 @@ +package client; + +import server.TraitWithDelegatedWithImpl; + +public class Test { + public static void bar(TraitWithDelegatedWithImpl some) { + some.foo(); + } +} diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.results.txt new file mode 100644 index 00000000000..4798668d12c --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.results.txt @@ -0,0 +1,2 @@ +Function call (11: 53) fun test(twdwi: TraitWithDelegatedWithImpl) = twdwi.foo() +Unclassified usage (7: 14) some.foo(); \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.0.kt new file mode 100644 index 00000000000..e553c835df9 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.0.kt @@ -0,0 +1,11 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetNamedFunction +// OPTIONS: usages, skipImports +package server + +trait TraitNoImpl { + fun foo() +} + +public class TraitWithDelegatedNoImpl(f: TraitNoImpl): TraitNoImpl by f + +fun test(twdni: TraitWithDelegatedNoImpl) = twdni.foo() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.1.java b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.1.java new file mode 100644 index 00000000000..73c0d4c314f --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.1.java @@ -0,0 +1,9 @@ +package client; + +import server.TraitWithDelegatedNoImpl; + +public class JClient { + public static void bar(TraitWithDelegatedNoImpl some) { + some.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.results.txt new file mode 100644 index 00000000000..6b6c5c37f8c --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.results.txt @@ -0,0 +1,2 @@ +Function call (11: 51) fun test(twdni: TraitWithDelegatedNoImpl) = twdni.foo() +Unclassified usage (7: 14) some.foo(); \ No newline at end of file diff --git a/idea/testData/resolve/referenceInJava/DelegatedMethodFromTraitNoImpl.java b/idea/testData/resolve/referenceInJava/DelegatedMethodFromTraitNoImpl.java new file mode 100644 index 00000000000..df5ff354286 --- /dev/null +++ b/idea/testData/resolve/referenceInJava/DelegatedMethodFromTraitNoImpl.java @@ -0,0 +1,9 @@ +import k.*; + +public class Test { + public static void bar(TraitWithDelegatedNoImpl some) { + some.foo(); + } +} + +// REF: (in k.TraitNoImpl).foo() diff --git a/idea/testData/resolve/referenceInJava/DelegatedMethodFromTraitWithImpl.java b/idea/testData/resolve/referenceInJava/DelegatedMethodFromTraitWithImpl.java new file mode 100644 index 00000000000..766cb22ff65 --- /dev/null +++ b/idea/testData/resolve/referenceInJava/DelegatedMethodFromTraitWithImpl.java @@ -0,0 +1,9 @@ +import k.*; + +public class Test { + public static void bar(TraitWithDelegatedWithImpl some) { + some.foo(); + } +} + +// REF: (in k.TraitWithImpl).foo() diff --git a/idea/testData/resolve/referenceInJava/dependencies.kt b/idea/testData/resolve/referenceInJava/dependencies.kt index 65894cf61ae..3f0d30d0ce3 100644 --- a/idea/testData/resolve/referenceInJava/dependencies.kt +++ b/idea/testData/resolve/referenceInJava/dependencies.kt @@ -39,4 +39,12 @@ object PlatformStaticFun { trait TraitNoImpl { fun foo() -} \ No newline at end of file +} + +public class TraitWithDelegatedNoImpl(f: TraitNoImpl): TraitNoImpl by f + +trait TraitWithImpl { + fun foo() = 1 +} + +public class TraitWithDelegatedWithImpl(f: TraitWithImpl): TraitWithImpl by f diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java index f4857026d51..ca52c38d04f 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java @@ -556,6 +556,18 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest(fileName); } + @TestMetadata("kotlinTraitImplThroughDelegate.0.kt") + public void testKotlinTraitImplThroughDelegate() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitImplThroughDelegate.0.kt"); + doTest(fileName); + } + + @TestMetadata("kotlinTraitNoImplThroughDelegate.0.kt") + public void testKotlinTraitNoImplThroughDelegate() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/kotlinTraitNoImplThroughDelegate.0.kt"); + doTest(fileName); + } + @TestMetadata("synthesizedFunction.0.kt") public void testSynthesizedFunction() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/synthesizedFunction.0.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveInJavaTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveInJavaTestGenerated.java index a36ac00f57e..a04643c944c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveInJavaTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveInJavaTestGenerated.java @@ -60,6 +60,18 @@ public class ReferenceResolveInJavaTestGenerated extends AbstractReferenceResolv doTest(fileName); } + @TestMetadata("DelegatedMethodFromTraitNoImpl.java") + public void testDelegatedMethodFromTraitNoImpl() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/DelegatedMethodFromTraitNoImpl.java"); + doTest(fileName); + } + + @TestMetadata("DelegatedMethodFromTraitWithImpl.java") + public void testDelegatedMethodFromTraitWithImpl() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/DelegatedMethodFromTraitWithImpl.java"); + doTest(fileName); + } + @TestMetadata("DeprecatedClassObjectField.java") public void testDeprecatedClassObjectField() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/DeprecatedClassObjectField.java");