From 311166737f6dad875ef411b974909eecf15bff0f Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 5 Aug 2014 17:57:53 +0400 Subject: [PATCH] Associate synthetic component function descriptors with corresponding constructor parameters --- .../jet/codegen/ImplementationBodyCodegen.java | 7 +++++-- .../jet/lang/resolve/DescriptorResolver.java | 2 +- .../jetbrains/jet/lang/resolve/OverloadResolver.java | 3 ++- .../src/org/jetbrains/jet/asJava/LightClassUtil.java | 12 +++++++++++- .../tests/dataClasses/conflictingCopyOverloads.kt | 6 ++++++ .../tests/dataClasses/conflictingOverloads.kt | 4 ++-- .../jet/checkers/JetDiagnosticsTestGenerated.java | 8 +++++++- .../org/jetbrains/jet/lang/resolve/java/JvmAbi.java | 4 ++++ .../org/jetbrains/jet/lang/resolve/name/NameUtil.kt | 8 ++++++++ .../jet/plugin/libraries/DecompiledTextFactory.kt | 6 +++++- .../plugin/quickfix/CreateFunctionFromUsageFix.kt | 3 +-- .../references/JetMultiDeclarationReference.kt | 3 +-- .../jetbrains/jet/plugin/references/JetReference.kt | 10 ++++++---- 13 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataClasses/conflictingCopyOverloads.kt create mode 100644 core/descriptors/src/org/jetbrains/jet/lang/resolve/name/NameUtil.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 0a685f8392d..7114622acc7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.codegen; import com.google.common.collect.Lists; import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.psi.PsiElement; import com.intellij.util.ArrayUtil; import kotlin.Function0; import kotlin.Function1; @@ -43,6 +44,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DeclarationResolver; +import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil; import org.jetbrains.jet.lang.resolve.calls.callUtil.CallUtilPackage; @@ -63,6 +65,7 @@ import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.org.objectweb.asm.*; import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; import org.jetbrains.org.objectweb.asm.commons.Method; @@ -75,7 +78,6 @@ import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver; import static org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils.descriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*; -import static org.jetbrains.jet.lang.resolve.calls.callUtil.CallUtilPackage.getResolvedCallWithAssert; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass; import static org.jetbrains.jet.lang.resolve.java.diagnostics.DiagnosticsPackage.DelegationToTraitImpl; @@ -821,7 +823,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @Override public void generateComponentFunction(@NotNull FunctionDescriptor function, @NotNull final ValueParameterDescriptor parameter) { - functionCodegen.generateMethod(OtherOrigin(myClass, function), typeMapper.mapSignature(function), function, new FunctionGenerationStrategy() { + PsiElement originalElement = DescriptorToSourceUtils.descriptorToDeclaration(parameter); + functionCodegen.generateMethod(OtherOrigin(originalElement, function), typeMapper.mapSignature(function), function, new FunctionGenerationStrategy() { @Override public void generateBody( @NotNull MethodVisitor mv, diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 119783f181b..d2b27c3a2c0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -390,7 +390,7 @@ public class DescriptorResolver { Annotations.EMPTY, Name.identifier(functionName), CallableMemberDescriptor.Kind.SYNTHESIZED, - SourceElement.NO_SOURCE + parameter.getSource() ); functionDescriptor.initialize( diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index ae8f9834541..435f4ba1a90 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetObjectDeclaration; +import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; @@ -169,7 +170,7 @@ public class OverloadResolver { } OverloadUtil.OverloadCompatibilityInfo overloadable = OverloadUtil.isOverloadable(member, member2); - if (!overloadable.isSuccess()) { + if (!overloadable.isSuccess() && member.getKind() != CallableMemberDescriptor.Kind.SYNTHESIZED) { JetDeclaration jetDeclaration = (JetDeclaration) DescriptorToSourceUtils.descriptorToDeclaration(member); if (jetDeclaration != null) { redeclarations.add(Pair.create(jetDeclaration, member)); diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassUtil.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassUtil.java index e379db6e8f5..12b34a54677 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassUtil.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassUtil.java @@ -33,6 +33,8 @@ import com.intellij.psi.stubs.StubElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.PathUtil; import com.intellij.util.SmartList; +import kotlin.Function1; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.*; @@ -257,7 +259,15 @@ public class LightClassUtil { if (getterWrapper == null || setterWrapper == null) { // If some getter or setter isn't found yet try to get it from wrappers for general declaration - List wrappers = getPsiMethodWrappers(jetDeclaration, true); + List wrappers = KotlinPackage.filter( + getPsiMethodWrappers(jetDeclaration, true), + new Function1() { + @Override + public Boolean invoke(PsiMethod method) { + return JvmAbi.isAccessorName(method.getName()); + } + } + ); assert wrappers.size() <= 2 : "Maximum two wrappers are expected to be generated for declaration: " + jetDeclaration.getText(); for (PsiMethod wrapper : wrappers) { diff --git a/compiler/testData/diagnostics/tests/dataClasses/conflictingCopyOverloads.kt b/compiler/testData/diagnostics/tests/dataClasses/conflictingCopyOverloads.kt new file mode 100644 index 00000000000..ec9a04b0632 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/conflictingCopyOverloads.kt @@ -0,0 +1,6 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +data class A(val x: Int, val y: String) { + fun copy(x: Int, y: String) = x + fun copy(x: Int, y: String) = A(x, y) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dataClasses/conflictingOverloads.kt b/compiler/testData/diagnostics/tests/dataClasses/conflictingOverloads.kt index e20e3462214..0afcdaca95e 100644 --- a/compiler/testData/diagnostics/tests/dataClasses/conflictingOverloads.kt +++ b/compiler/testData/diagnostics/tests/dataClasses/conflictingOverloads.kt @@ -1,4 +1,4 @@ -data class A(val x: Int, val y: String) { +data class A(val x: Int, val y: String) { fun component1() = 1 fun component2() = 2 -} +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 1a0671ea85a..104b0b88699 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1777,8 +1777,14 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/dataClasses/componentNamedComponent1.kt"); } + @TestMetadata("conflictingCopyOverloads.kt") + public void testConflictingCopyOverloads() throws Exception { + doTest("compiler/testData/diagnostics/tests/dataClasses/conflictingCopyOverloads.kt"); + } + @TestMetadata("conflictingOverloads.kt") - public void testConflictingOverloads() throws Exception { + public void + testConflictingOverloads() throws Exception { doTest("compiler/testData/diagnostics/tests/dataClasses/conflictingOverloads.kt"); } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java index 2e782890d3b..96012ffe920 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java @@ -62,6 +62,10 @@ public final class JvmAbi { return isDelegated ? propertyName.asString() + DELEGATED_PROPERTY_NAME_SUFFIX : propertyName.asString(); } + public static boolean isAccessorName(String name) { + return name.startsWith(JvmAbi.GETTER_PREFIX) || name.startsWith(JvmAbi.SETTER_PREFIX); + } + private JvmAbi() { } } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/name/NameUtil.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/name/NameUtil.kt new file mode 100644 index 00000000000..47f2e1518b8 --- /dev/null +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/name/NameUtil.kt @@ -0,0 +1,8 @@ +package org.jetbrains.jet.lang.resolve.name + +import java.util.regex.Pattern + +public val COMPONENT_FUNCTION_PATTERN: Pattern = Pattern.compile("^component(\\d+)$") + +public fun String.isComponentFunctionName(): Boolean = COMPONENT_FUNCTION_PATTERN.matcher(this).matches() +public fun Name.isComponentFunctionName(): Boolean = asString().isComponentFunctionName() \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledTextFactory.kt b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledTextFactory.kt index 06fc59968e9..a4477608f52 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledTextFactory.kt +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledTextFactory.kt @@ -29,6 +29,8 @@ import java.util.* import org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumEntry import org.jetbrains.jet.lang.resolve.DescriptorUtils.isSyntheticClassObject import org.jetbrains.jet.lang.types.error.MissingDependencyErrorClass +import org.jetbrains.jet.lang.resolve.DescriptorResolver +import org.jetbrains.jet.lang.resolve.name.isComponentFunctionName public fun buildDecompiledText( classFile: VirtualFile, @@ -125,7 +127,9 @@ private fun buildDecompiledText(packageFqName: FqName, descriptors: List(element) { override fun getTargetDescriptors(context: BindingContext): Collection { return expression.getEntries().map { entry -> - //TODO: remove getOriginal - context.get(BindingContext.COMPONENT_RESOLVED_CALL, entry)?.getCandidateDescriptor()?.getOriginal() + context.get(BindingContext.COMPONENT_RESOLVED_CALL, entry)?.getCandidateDescriptor() }.filterNotNull() } diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetReference.kt b/idea/src/org/jetbrains/jet/plugin/references/JetReference.kt index 7e7a95b5978..180a5479f83 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetReference.kt +++ b/idea/src/org/jetbrains/jet/plugin/references/JetReference.kt @@ -115,12 +115,14 @@ abstract class AbstractJetReference(element: T) private fun resolveToPsiElements(targetDescriptor: DeclarationDescriptor): Collection { val result = HashSet() val project = expression.getProject() - result.addAll(DescriptorToSourceUtils.descriptorToDeclarations(targetDescriptor)) - result.addAll(DescriptorToDeclarationUtil.findDecompiledAndBuiltInDeclarations(project, targetDescriptor)) + // todo: remove getOriginal() + val originalDescriptor = targetDescriptor.getOriginal() + result.addAll(DescriptorToSourceUtils.descriptorToDeclarations(originalDescriptor)) + result.addAll(DescriptorToDeclarationUtil.findDecompiledAndBuiltInDeclarations(project, originalDescriptor)) - if (targetDescriptor is PackageViewDescriptor) { + if (originalDescriptor is PackageViewDescriptor) { val psiFacade = JavaPsiFacade.getInstance(project) - val fqName = (targetDescriptor as PackageViewDescriptor).getFqName().asString() + val fqName = (originalDescriptor as PackageViewDescriptor).getFqName().asString() ContainerUtil.addIfNotNull(result, psiFacade.findPackage(fqName)) ContainerUtil.addIfNotNull(result, psiFacade.findClass(fqName, project.allScope())) }