Do not report CONFLICTING_JVM_DECLARATIONS on delegated origin element

This commit is contained in:
Nikolay Krasko
2015-02-24 21:33:55 +03:00
parent c6f8a1cfcc
commit 377209f0c3
9 changed files with 37 additions and 19 deletions
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.resolve.calls.CallResolverUtil;
import org.jetbrains.kotlin.resolve.constants.ArrayValue; import org.jetbrains.kotlin.resolve.constants.ArrayValue;
import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant; import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant;
import org.jetbrains.kotlin.resolve.constants.JavaClassValue; import org.jetbrains.kotlin.resolve.constants.JavaClassValue;
import org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage;
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind;
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature;
@@ -75,8 +76,7 @@ import static org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.callableDescr
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isFunctionLiteral; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isFunctionLiteral;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isTrait; 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.AsmTypes.OBJECT_TYPE;
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.OtherOrigin; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.*;
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.Synthetic;
import static org.jetbrains.org.objectweb.asm.Opcodes.*; import static org.jetbrains.org.objectweb.asm.Opcodes.*;
public class FunctionCodegen { public class FunctionCodegen {
@@ -799,7 +799,7 @@ public class FunctionCodegen {
) { ) {
int flags = ACC_PUBLIC | ACC_BRIDGE | ACC_SYNTHETIC; // TODO. int flags = ACC_PUBLIC | ACC_BRIDGE | ACC_SYNTHETIC; // TODO.
MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), flags, delegateTo.getName(), bridge.getDescriptor(), null, null); MethodVisitor mv = v.newMethod(DiagnosticsPackage.Bridge(descriptor, origin), flags, delegateTo.getName(), bridge.getDescriptor(), null, null);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
mv.visitCode(); mv.visitCode();
@@ -836,7 +836,7 @@ public class FunctionCodegen {
final StackValue field final StackValue field
) { ) {
generateMethod( generateMethod(
OtherOrigin(delegateFunction), delegateFunction, Delegation(null, delegateFunction), delegateFunction,
new FunctionGenerationStrategy() { new FunctionGenerationStrategy() {
@Override @Override
public void generateBody( public void generateBody(
@@ -32,6 +32,11 @@ import org.jetbrains.kotlin.load.java.descriptors.SamAdapterDescriptor
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.DiagnosticSink
private val EXTERNAL_SOURCES_KINDS = array(
JvmDeclarationOriginKind.DELEGATION_TO_TRAIT_IMPL,
JvmDeclarationOriginKind.DELEGATION,
JvmDeclarationOriginKind.BRIDGE)
class BuilderFactoryForDuplicateSignatureDiagnostics( class BuilderFactoryForDuplicateSignatureDiagnostics(
builderFactory: ClassBuilderFactory, builderFactory: ClassBuilderFactory,
bindingContext: BindingContext, bindingContext: BindingContext,
@@ -42,15 +47,20 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
private val typeMapper = JetTypeMapper(bindingContext, ClassBuilderMode.LIGHT_CLASSES) private val typeMapper = JetTypeMapper(bindingContext, ClassBuilderMode.LIGHT_CLASSES)
override fun handleClashingSignatures(data: ConflictingJvmDeclarationsData) { override fun handleClashingSignatures(data: ConflictingJvmDeclarationsData) {
val allDelegatedToTraitImpls = data.signatureOrigins.all { it.originKind == JvmDeclarationOriginKind.DELEGATION_TO_TRAIT_IMPL } val noOwnImplementations = data.signatureOrigins.all { it.originKind in EXTERNAL_SOURCES_KINDS }
val elements = LinkedHashSet<PsiElement>() val elements = LinkedHashSet<PsiElement>()
for (origin in data.signatureOrigins) { if (noOwnImplementations) {
var element = origin.element elements.addIfNotNull(data.classOrigin.element)
if (element == null || allDelegatedToTraitImpls) { }
element = data.classOrigin.element else {
for (origin in data.signatureOrigins) {
var element = origin.element
if (element == null || origin.originKind in EXTERNAL_SOURCES_KINDS) {
element = data.classOrigin.element
}
elements.addIfNotNull(element)
} }
elements.addIfNotNull(element)
} }
for (element in elements) { for (element in elements) {
@@ -141,4 +151,4 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
return descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE return descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE
&& descriptor.getOverriddenDescriptors().all { isOrOverridesSamAdapter(it) } && descriptor.getOverriddenDescriptors().all { isOrOverridesSamAdapter(it) }
} }
} }
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.psi.JetClassOrObject
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind.* import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
public enum class MemberKind { FIELD METHOD } public enum class MemberKind { FIELD METHOD }
@@ -36,6 +37,8 @@ public enum class JvmDeclarationOriginKind {
PACKAGE_PART PACKAGE_PART
TRAIT_IMPL TRAIT_IMPL
DELEGATION_TO_TRAIT_IMPL DELEGATION_TO_TRAIT_IMPL
DELEGATION
BRIDGE
SYNTHETIC // this means that there's no proper descriptor for this jvm declaration SYNTHETIC // this means that there's no proper descriptor for this jvm declaration
} }
@@ -58,11 +61,16 @@ public fun OtherOrigin(element: PsiElement): JvmDeclarationOrigin = OtherOrigin(
public fun OtherOrigin(descriptor: DeclarationDescriptor): JvmDeclarationOrigin = OtherOrigin(null, descriptor) public fun OtherOrigin(descriptor: DeclarationDescriptor): JvmDeclarationOrigin = OtherOrigin(null, descriptor)
public fun Bridge(descriptor: DeclarationDescriptor, element: PsiElement? = DescriptorToSourceUtils.descriptorToDeclaration(descriptor)): JvmDeclarationOrigin =
JvmDeclarationOrigin(BRIDGE, element, descriptor)
public fun PackageFacade(descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(PACKAGE_FACADE, null, descriptor) public fun PackageFacade(descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(PACKAGE_FACADE, null, descriptor)
public fun PackagePart(file: JetFile, descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(PACKAGE_PART, file, descriptor) public fun PackagePart(file: JetFile, descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(PACKAGE_PART, file, descriptor)
public fun TraitImpl(element: JetClassOrObject, descriptor: ClassDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(TRAIT_IMPL, element, descriptor) public fun TraitImpl(element: JetClassOrObject, descriptor: ClassDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(TRAIT_IMPL, element, descriptor)
public fun DelegationToTraitImpl(element: PsiElement?, descriptor: FunctionDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(DELEGATION_TO_TRAIT_IMPL, element, descriptor) public fun DelegationToTraitImpl(element: PsiElement?, descriptor: FunctionDescriptor): JvmDeclarationOrigin =
JvmDeclarationOrigin(DELEGATION_TO_TRAIT_IMPL, element, descriptor)
public fun Synthetic(element: PsiElement?, descriptor: CallableMemberDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(SYNTHETIC, element, descriptor) public fun Delegation(element: PsiElement?, descriptor: FunctionDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(DELEGATION, element, descriptor)
public fun Synthetic(element: PsiElement?, descriptor: CallableMemberDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(SYNTHETIC, element, descriptor)
+1 -1
View File
@@ -14,7 +14,7 @@ ERROR: compiler/testData/cli/jvm/signatureClash.kt: (12, 1) Platform declaration
ERROR: compiler/testData/cli/jvm/signatureClash.kt: (13, 1) Platform declaration clash: The following declarations have the same JVM signature (getB()I): ERROR: compiler/testData/cli/jvm/signatureClash.kt: (13, 1) Platform declaration clash: The following declarations have the same JVM signature (getB()I):
fun <get-b>(): kotlin.Int fun <get-b>(): kotlin.Int
fun getB(): kotlin.Int fun getB(): kotlin.Int
ERROR: compiler/testData/cli/jvm/signatureClash.kt: (16, 5) Platform declaration clash: The following declarations have the same JVM signature (getTr()I): ERROR: compiler/testData/cli/jvm/signatureClash.kt: (19, 7) Platform declaration clash: The following declarations have the same JVM signature (getTr()I):
fun <get-tr>(): kotlin.Int fun <get-tr>(): kotlin.Int
fun getTr(): kotlin.Int fun getTr(): kotlin.Int
ERROR: compiler/testData/cli/jvm/signatureClash.kt: (20, 5) Platform declaration clash: The following declarations have the same JVM signature (getTr()I): ERROR: compiler/testData/cli/jvm/signatureClash.kt: (20, 5) Platform declaration clash: The following declarations have the same JVM signature (getTr()I):
@@ -2,6 +2,6 @@ trait B {
fun getX() = 1 fun getX() = 1
} }
class C : B { class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : B {
<!NOTHING_TO_OVERRIDE!>override<!> val x = 1 <!NOTHING_TO_OVERRIDE!>override<!> val x = 1
} }
@@ -2,7 +2,7 @@ trait T {
fun getX() = 1 fun getX() = 1
} }
class C : T { class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : T {
val x: Int val x: Int
<!CONFLICTING_JVM_DECLARATIONS!>get()<!> = 1 <!CONFLICTING_JVM_DECLARATIONS!>get()<!> = 1
} }
@@ -3,6 +3,6 @@ trait T {
get() = 1 get() = 1
} }
class C : T { class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : T {
<!CONFLICTING_JVM_DECLARATIONS!>fun getX()<!> = 1 <!CONFLICTING_JVM_DECLARATIONS!>fun getX()<!> = 1
} }
@@ -8,6 +8,6 @@ trait Bar<T> {
fun foo(l: List<T>) {} fun foo(l: List<T>) {}
} }
class Baz(): Foo<String>, Bar<Int> { class <!CONFLICTING_JVM_DECLARATIONS!>Baz()<!>: Foo<String>, Bar<Int> {
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(l: List<Long>)<!> {} <!CONFLICTING_JVM_DECLARATIONS!>fun foo(l: List<Long>)<!> {}
} }
@@ -2,6 +2,6 @@ trait T {
fun getX() = 1 fun getX() = 1
} }
class C : T { class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : T {
<!CONFLICTING_JVM_DECLARATIONS!>val x<!> = 1 <!CONFLICTING_JVM_DECLARATIONS!>val x<!> = 1
} }