From dea7ef77eca54056699bbc62a62d43538d930976 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 21 Mar 2013 21:22:38 +0400 Subject: [PATCH] If interface method has generic parameters, interface is not functional. --- .../lang/resolve/java/sam/SingleAbstractMethodUtils.java | 9 +++++++-- .../singleAbstractMethod/GenericMethodParameters.java | 7 +++++++ .../singleAbstractMethod/GenericMethodParameters.txt | 5 +++++ .../jet/jvm/compiler/LoadJavaTestGenerated.java | 5 +++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.java create mode 100644 compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.txt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java index fb9e88a17c4..f9ea9153c7c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java @@ -42,7 +42,13 @@ public class SingleAbstractMethodUtils { } List abstractMembers = getAbstractMembers(klass); - return abstractMembers.size() == 1 && abstractMembers.get(0) instanceof SimpleFunctionDescriptor; + if (abstractMembers.size() == 1) { + CallableMemberDescriptor member = abstractMembers.get(0); + if (member instanceof SimpleFunctionDescriptor) { + return member.getTypeParameters().isEmpty(); + } + } + return false; } @NotNull @@ -58,7 +64,6 @@ public class SingleAbstractMethodUtils { @NotNull private static JetType getFunctionalTypeForFunction(@NotNull FunctionDescriptor function) { - // TODO substitute type parameters of function with star projections JetType returnType = function.getReturnType(); assert returnType != null : "function is not initialized: " + function; List parameterTypes = Lists.newArrayList(); diff --git a/compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.java b/compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.java new file mode 100644 index 00000000000..fe723bd5d13 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.java @@ -0,0 +1,7 @@ +package test; + +import java.util.List; + +public interface GenericMethodParameters { + > void method(A[] a, B b); +} diff --git a/compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.txt b/compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.txt new file mode 100644 index 00000000000..ad9506c4cb8 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.txt @@ -0,0 +1,5 @@ +package test + +public trait GenericMethodParameters : java.lang.Object { + public abstract fun ?> method(/*0*/ p0 : jet.Array?, /*1*/ p1 : B?) : jet.Unit +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 4e17da419b0..15e654443a7 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -1140,6 +1140,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledJava("compiler/testData/loadJava/compiledJava/singleAbstractMethod/FilenameFilter.java"); } + @TestMetadata("GenericMethodParameters.java") + public void testGenericMethodParameters() throws Exception { + doTestCompiledJava("compiler/testData/loadJava/compiledJava/singleAbstractMethod/GenericMethodParameters.java"); + } + @TestMetadata("InterfaceWithObjectMethod.java") public void testInterfaceWithObjectMethod() throws Exception { doTestCompiledJava("compiler/testData/loadJava/compiledJava/singleAbstractMethod/InterfaceWithObjectMethod.java");