From cd0551078c864851df04ebde40d8cece04d42ef1 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 26 Sep 2014 17:05:43 +0400 Subject: [PATCH] Support static method references #KT-5123 Fixed --- .../BasicExpressionTypingVisitor.java | 18 +++++++++++---- .../callableReference/staticMethod.java | 5 ++++ .../callableReference/staticMethod.kt | 5 ++++ .../function/enumValueOfMethod.kt | 9 ++++++++ .../function/javaCollectionsStaticMethod.kt | 13 +++++++++++ .../function/javaStaticMethod.kt | 23 +++++++++++++++++++ .../function/javaStaticMethod.txt | 3 +++ ...JetDiagnosticsTestWithStdLibGenerated.java | 6 +++++ ...ackBoxAgainstJavaCodegenTestGenerated.java | 6 +++++ ...lackBoxWithStdlibCodegenTestGenerated.java | 12 ++++++++++ 10 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.java create mode 100644 compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.kt create mode 100644 compiler/testData/codegen/boxWithStdlib/callableReference/function/enumValueOfMethod.kt create mode 100644 compiler/testData/codegen/boxWithStdlib/callableReference/function/javaCollectionsStaticMethod.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 086a21148e6..7600f70fa6a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -591,14 +591,24 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return null; } - JetScope staticScope = getStaticNestedClassesScope((ClassDescriptor) classifier); + JetScope staticScope = ((ClassDescriptor) classifier).getStaticScope(); TemporaryTraceAndCache temporaryForStatic = TemporaryTraceAndCache.create( context, "trace to resolve callable reference in static scope", reference); - CallableDescriptor possibleStaticNestedClassConstructor = resolveCallableNotCheckingArguments(reference, NO_RECEIVER, - context.replaceTraceAndCache(temporaryForStatic).replaceScope(staticScope), result); + CallableDescriptor possibleStatic = resolveCallableNotCheckingArguments( + reference, NO_RECEIVER, context.replaceTraceAndCache(temporaryForStatic).replaceScope(staticScope), result); if (result[0]) { temporaryForStatic.commit(); - return possibleStaticNestedClassConstructor; + return possibleStatic; + } + + JetScope staticNestedClasses = getStaticNestedClassesScope((ClassDescriptor) classifier); + TemporaryTraceAndCache temporaryForNested = TemporaryTraceAndCache.create( + context, "trace to resolve callable reference in static nested classes scope", reference); + CallableDescriptor possibleNestedClassConstructor = resolveCallableNotCheckingArguments(reference, NO_RECEIVER, + context.replaceTraceAndCache(temporaryForNested).replaceScope(staticNestedClasses), result); + if (result[0]) { + temporaryForNested.commit(); + return possibleNestedClassConstructor; } ReceiverValue receiver = new TransientReceiver(lhsType); diff --git a/compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.java b/compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.java new file mode 100644 index 00000000000..9a46c3df9c2 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.java @@ -0,0 +1,5 @@ +class A { + public static void main(String[] args) { + args[0] = "OK"; + } +} diff --git a/compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.kt b/compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.kt new file mode 100644 index 00000000000..5e42d2a5920 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.kt @@ -0,0 +1,5 @@ +fun box(): String { + val args = array("Fail") + (A::main)(args) + return args[0] +} diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/function/enumValueOfMethod.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/function/enumValueOfMethod.kt new file mode 100644 index 00000000000..21a53adfff3 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/function/enumValueOfMethod.kt @@ -0,0 +1,9 @@ +enum class E { + ENTRY +} + +fun box(): String { + val f = E::valueOf + val result = f("ENTRY") + return if (result == E.ENTRY) "OK" else "Fail $result" +} diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/function/javaCollectionsStaticMethod.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/function/javaCollectionsStaticMethod.kt new file mode 100644 index 00000000000..11cbd34f706 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/function/javaCollectionsStaticMethod.kt @@ -0,0 +1,13 @@ +// KT-5123 + +import java.util.Collections +import java.util.ArrayList + +fun box(): String { + val numbers = ArrayList() + numbers.add(1) + numbers.add(2) + numbers.add(3) + (Collections::rotate)(numbers, 1) + return if ("$numbers" == "[3, 1, 2]") "OK" else "Fail $numbers" +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.kt b/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.kt new file mode 100644 index 00000000000..09149c11656 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.kt @@ -0,0 +1,23 @@ +// FILE: test/A.java + +package test + +import java.util.Arrays; + +public class A { + public static void main(String[] args) { + System.out.println(Arrays.asList(args)); + } +} + +// FILE: 1.kt + +import kotlin.reflect.* +import test.A + +fun foo(args: Array) { + val main2 = A::main + main2 : KFunction1, Unit> + main2(args) + (A::main)(args) +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.txt b/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.txt new file mode 100644 index 00000000000..3c638eb0f74 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.txt @@ -0,0 +1,3 @@ +package + +internal fun foo(/*0*/ args: kotlin.Array): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 44c8cc46456..98a11eef754 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -289,6 +289,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic doTest(fileName); } + @TestMetadata("javaStaticMethod.kt") + public void testJavaStaticMethod() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/callableReference/function/javaStaticMethod.kt"); + doTest(fileName); + } + @TestMetadata("lhsNotAClass.kt") public void testLhsNotAClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/callableReference/function/lhsNotAClass.kt"); diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index 5b39bc81b33..0a75c2f9f62 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -111,6 +111,12 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod doTestAgainstJava(fileName); } + @TestMetadata("staticMethod.kt") + public void testStaticMethod() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/callableReference/staticMethod.kt"); + doTestAgainstJava(fileName); + } + } @TestMetadata("compiler/testData/codegen/boxAgainstJava/constructor") diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 912e5399066..461acc1d2b0 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -297,6 +297,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("enumValueOfMethod.kt") + public void testEnumValueOfMethod() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/function/enumValueOfMethod.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("equalsIntrinsic.kt") public void testEqualsIntrinsic() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/function/equalsIntrinsic.kt"); @@ -369,6 +375,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("javaCollectionsStaticMethod.kt") + public void testJavaCollectionsStaticMethod() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/function/javaCollectionsStaticMethod.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("nestedConstructorFromClass.kt") public void testNestedConstructorFromClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/function/nestedConstructorFromClass.kt");