From c0fc5cfb53479950890d90156ac5a81c622811e4 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 27 Jun 2014 17:31:44 +0400 Subject: [PATCH] Disallow named arguments for SAM adapters SAM adapters are Java functions, and named arguments are not allowed for Java functions #KT-5022 Fixed --- .../disallowForSamAdapterConstructor.kt | 16 ++++++++++++++++ .../disallowForSamAdapterFunction.kt | 16 ++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 10 ++++++++++ .../descriptor/JavaConstructorDescriptor.java | 11 ++++++----- .../java/descriptor/JavaMethodDescriptor.java | 2 +- .../java/descriptor/SamAdapterDescriptor.java | 3 ++- .../lazy/descriptors/LazyJavaClassMemberScope.kt | 8 ++++---- .../java/lazy/descriptors/LazyJavaMemberScope.kt | 8 ++++---- .../sam/SamAdapterConstructorDescriptor.java | 14 +++++++------- .../java/sam/SamAdapterFunctionDescriptor.java | 14 +++++++------- .../java/sam/SingleAbstractMethodUtils.java | 8 +++----- .../plugin/caches/resolve/KotlinResolveCache.kt | 6 +++--- 12 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.kt create mode 100644 compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterFunction.kt diff --git a/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.kt b/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.kt new file mode 100644 index 00000000000..8e681d78d2f --- /dev/null +++ b/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.kt @@ -0,0 +1,16 @@ +// FILE: test/J.java + +package test; + +public class J { + public J(String s, Runnable r, Boolean z) { + } +} + +// FILE: usage.kt + +package test + +fun test() { + J("", r = { }, z = false) +} diff --git a/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterFunction.kt b/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterFunction.kt new file mode 100644 index 00000000000..f1c57739a06 --- /dev/null +++ b/compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterFunction.kt @@ -0,0 +1,16 @@ +// FILE: test/J.java + +package test; + +public class J { + public static void foo(String s, Runnable r, Boolean z) { + } +} + +// FILE: usage.kt + +package test + +fun test() { + J.foo("", r = { }, z = false) +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index a119e222184..b5904f23301 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -5480,6 +5480,16 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.kt"); } + @TestMetadata("disallowForSamAdapterConstructor.kt") + public void testDisallowForSamAdapterConstructor() throws Exception { + doTest("compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterConstructor.kt"); + } + + @TestMetadata("disallowForSamAdapterFunction.kt") + public void testDisallowForSamAdapterFunction() throws Exception { + doTest("compiler/testData/diagnostics/tests/namedArguments/disallowForSamAdapterFunction.kt"); + } + @TestMetadata("namedArgumentsAndDefaultValues.kt") public void testNamedArgumentsAndDefaultValues() throws Exception { doTest("compiler/testData/diagnostics/tests/namedArguments/namedArgumentsAndDefaultValues.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaConstructorDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaConstructorDescriptor.java index ddf5e0d98b8..63d9b224817 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaConstructorDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaConstructorDescriptor.java @@ -28,13 +28,14 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme private Boolean hasStableParameterNames = null; private Boolean hasSynthesizedParameterNames = null; - private JavaConstructorDescriptor( + protected JavaConstructorDescriptor( @NotNull ClassDescriptor containingDeclaration, @Nullable JavaConstructorDescriptor original, @NotNull Annotations annotations, - boolean isPrimary + boolean isPrimary, + @NotNull Kind kind ) { - super(containingDeclaration, original, annotations, isPrimary, Kind.DECLARATION); + super(containingDeclaration, original, annotations, isPrimary, kind); } @NotNull @@ -43,7 +44,7 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme @NotNull Annotations annotations, boolean isPrimary ) { - return new JavaConstructorDescriptor(containingDeclaration, null, annotations, isPrimary); + return new JavaConstructorDescriptor(containingDeclaration, null, annotations, isPrimary, Kind.DECLARATION); } @Override @@ -80,7 +81,7 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme "kind: " + kind); } JavaConstructorDescriptor result = - new JavaConstructorDescriptor((ClassDescriptor) newOwner, this, Annotations.EMPTY /* TODO */, isPrimary); + new JavaConstructorDescriptor((ClassDescriptor) newOwner, this, Annotations.EMPTY /* TODO */, isPrimary, kind); result.setHasStableParameterNames(hasStableParameterNames()); result.setHasSynthesizedParameterNames(hasSynthesizedParameterNames()); return result; diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaMethodDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaMethodDescriptor.java index 18962277c6e..5f338d4627e 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaMethodDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaMethodDescriptor.java @@ -30,7 +30,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement private Boolean hasStableParameterNames = null; private Boolean hasSynthesizedParameterNames = null; - private JavaMethodDescriptor( + protected JavaMethodDescriptor( @NotNull DeclarationDescriptor containingDeclaration, @Nullable SimpleFunctionDescriptor original, @NotNull Annotations annotations, diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamAdapterDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamAdapterDescriptor.java index 9e1149289ba..00a8d80fd59 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamAdapterDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/SamAdapterDescriptor.java @@ -19,5 +19,6 @@ package org.jetbrains.jet.lang.resolve.java.descriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.SynthesizedCallableMemberDescriptor; -public interface SamAdapterDescriptor extends FunctionDescriptor, SynthesizedCallableMemberDescriptor { +public interface SamAdapterDescriptor + extends FunctionDescriptor, JavaCallableMemberDescriptor, SynthesizedCallableMemberDescriptor { } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 27f37a7a044..189df4762fc 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -60,7 +60,7 @@ public class LazyJavaClassMemberScope( val constructor = resolveConstructor(jCtor, getContainingDeclaration(), jClass.isStatic()) val samAdapter = resolveSamAdapter(constructor) if (samAdapter != null) { - (samAdapter as ConstructorDescriptorImpl).setReturnType(containingDeclaration.getDefaultType()) + samAdapter.setReturnType(containingDeclaration.getDefaultType()) listOf(constructor, samAdapter) } else @@ -108,13 +108,13 @@ public class LazyJavaClassMemberScope( return MethodSignatureData(effectiveSignature, superFunctions, propagated.getErrors() + effectiveSignature.getErrors()) } - private fun resolveSamAdapter(original: ConstructorDescriptor): ConstructorDescriptor? { + private fun resolveSamAdapter(original: JavaConstructorDescriptor): JavaConstructorDescriptor? { return if (SingleAbstractMethodUtils.isSamAdapterNecessary(original)) - SingleAbstractMethodUtils.createSamAdapterConstructor(original) as ConstructorDescriptor + SingleAbstractMethodUtils.createSamAdapterConstructor(original) as JavaConstructorDescriptor else null } - private fun resolveConstructor(constructor: JavaMethod, classDescriptor: ClassDescriptor, isStaticClass: Boolean): ConstructorDescriptor { + private fun resolveConstructor(constructor: JavaMethod, classDescriptor: ClassDescriptor, isStaticClass: Boolean): JavaConstructorDescriptor { val constructorDescriptor = JavaConstructorDescriptor.createJavaConstructor(classDescriptor, Annotations.EMPTY, /* isPrimary = */ false) val valueParameters = resolveValueParameters(c, constructorDescriptor, constructor.getValueParameters()) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt index 4be047f677e..fbe74a49ac5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -75,7 +75,7 @@ public abstract class LazyJavaMemberScope( (name: Name): Collection -> val methods = memberIndex().findMethodsByName(name) - val functions = LinkedHashSet( + val functions = LinkedHashSet( methods.stream() // values() and valueOf() are added manually, see LazyJavaClassDescriptor::getClassObjectDescriptor() .filter{ m -> !DescriptorResolverUtils.shouldBeInEnumClassObject(m) } @@ -110,7 +110,7 @@ public abstract class LazyJavaMemberScope( abstract fun resolveMethodSignature(method: JavaMethod, methodTypeParameters: List, returnType: JetType, valueParameters: ResolvedValueParameters): MethodSignatureData - fun resolveMethodToFunctionDescriptor(method: JavaMethod, record: Boolean = true): SimpleFunctionDescriptor { + fun resolveMethodToFunctionDescriptor(method: JavaMethod, record: Boolean = true): JavaMethodDescriptor { val functionDescriptorImpl = JavaMethodDescriptor.createJavaMethod(_containingDeclaration, c.resolveAnnotations(method), method.getName()) @@ -216,9 +216,9 @@ public abstract class LazyJavaMemberScope( return ResolvedValueParameters(descriptors, synthesizedNames) } - private fun resolveSamAdapter(original: SimpleFunctionDescriptor): SimpleFunctionDescriptor? { + private fun resolveSamAdapter(original: JavaMethodDescriptor): JavaMethodDescriptor? { return if (SingleAbstractMethodUtils.isSamAdapterNecessary(original)) - SingleAbstractMethodUtils.createSamAdapterFunction(original) as SimpleFunctionDescriptor + SingleAbstractMethodUtils.createSamAdapterFunction(original) as JavaMethodDescriptor else null } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterConstructorDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterConstructorDescriptor.java index 5b7ab94097d..3078f63cdcd 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterConstructorDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterConstructorDescriptor.java @@ -17,22 +17,22 @@ package org.jetbrains.jet.lang.resolve.java.sam; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; -import org.jetbrains.jet.lang.descriptors.impl.ConstructorDescriptorImpl; +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaConstructorDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; -/* package */ class SamAdapterConstructorDescriptor extends ConstructorDescriptorImpl - implements SamAdapterDescriptor { - private final ConstructorDescriptor declaration; +/* package */ class SamAdapterConstructorDescriptor extends JavaConstructorDescriptor implements SamAdapterDescriptor { + private final JavaConstructorDescriptor declaration; - public SamAdapterConstructorDescriptor(@NotNull ConstructorDescriptor declaration) { + public SamAdapterConstructorDescriptor(@NotNull JavaConstructorDescriptor declaration) { super(declaration.getContainingDeclaration(), null, declaration.getAnnotations(), declaration.isPrimary(), Kind.SYNTHESIZED); this.declaration = declaration; + setHasStableParameterNames(declaration.hasStableParameterNames()); + setHasSynthesizedParameterNames(declaration.hasSynthesizedParameterNames()); } @NotNull @Override - public ConstructorDescriptor getBaseForSynthesized() { + public JavaConstructorDescriptor getBaseForSynthesized() { return declaration; } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterFunctionDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterFunctionDescriptor.java index 0bc3833cf0f..019b489a9d9 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterFunctionDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SamAdapterFunctionDescriptor.java @@ -17,22 +17,22 @@ package org.jetbrains.jet.lang.resolve.java.sam; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaMethodDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; -/* package */ class SamAdapterFunctionDescriptor extends SimpleFunctionDescriptorImpl - implements SamAdapterDescriptor { - private final SimpleFunctionDescriptor declaration; +/* package */ class SamAdapterFunctionDescriptor extends JavaMethodDescriptor implements SamAdapterDescriptor { + private final JavaMethodDescriptor declaration; - public SamAdapterFunctionDescriptor(@NotNull SimpleFunctionDescriptor declaration) { + public SamAdapterFunctionDescriptor(@NotNull JavaMethodDescriptor declaration) { super(declaration.getContainingDeclaration(), null, declaration.getAnnotations(), declaration.getName(), Kind.SYNTHESIZED); this.declaration = declaration; + setHasStableParameterNames(declaration.hasStableParameterNames()); + setHasSynthesizedParameterNames(declaration.hasSynthesizedParameterNames()); } @NotNull @Override - public SimpleFunctionDescriptor getBaseForSynthesized() { + public JavaMethodDescriptor getBaseForSynthesized() { return declaration; } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java index cf6f5851379..f0b5832c254 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java @@ -22,9 +22,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; -import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor; -import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor; -import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor; +import org.jetbrains.jet.lang.resolve.java.descriptor.*; import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.structure.*; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -180,7 +178,7 @@ public class SingleAbstractMethodUtils { } @NotNull - public static SamAdapterDescriptor createSamAdapterFunction(@NotNull final SimpleFunctionDescriptor original) { + public static SamAdapterDescriptor createSamAdapterFunction(@NotNull final JavaMethodDescriptor original) { final SamAdapterFunctionDescriptor result = new SamAdapterFunctionDescriptor(original); return initSamAdapter(original, result, new FunctionInitializer() { @Override @@ -203,7 +201,7 @@ public class SingleAbstractMethodUtils { } @NotNull - public static SamAdapterDescriptor createSamAdapterConstructor(@NotNull final ConstructorDescriptor original) { + public static SamAdapterDescriptor createSamAdapterConstructor(@NotNull final JavaConstructorDescriptor original) { final SamAdapterConstructorDescriptor result = new SamAdapterConstructorDescriptor(original); return initSamAdapter(original, result, new FunctionInitializer() { @Override diff --git a/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt b/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt index f69828af521..e1afdddfcde 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt +++ b/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt @@ -255,9 +255,9 @@ private object KotlinResolveDataProvider { TopDownAnalysisParameters.createForLazy( resolveSession.getStorageManager(), resolveSession.getExceptionTracker(), - analyzeCompletely = { true }, - analyzingBootstrapLibrary = false, - declaredLocally = false + /* analyzeCompletely = */ { true }, + /* analyzingBootstrapLibrary = */ false, + /* declaredLocally = */ false ), listOf(analyzableElement) )