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.CompileTimeConstant;
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.jvmSignature.JvmMethodParameterKind;
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.isTrait;
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.Synthetic;
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.*;
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
public class FunctionCodegen {
@@ -799,7 +799,7 @@ public class FunctionCodegen {
) {
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;
mv.visitCode();
@@ -836,7 +836,7 @@ public class FunctionCodegen {
final StackValue field
) {
generateMethod(
OtherOrigin(delegateFunction), delegateFunction,
Delegation(null, delegateFunction), delegateFunction,
new FunctionGenerationStrategy() {
@Override
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.diagnostics.DiagnosticSink
private val EXTERNAL_SOURCES_KINDS = array(
JvmDeclarationOriginKind.DELEGATION_TO_TRAIT_IMPL,
JvmDeclarationOriginKind.DELEGATION,
JvmDeclarationOriginKind.BRIDGE)
class BuilderFactoryForDuplicateSignatureDiagnostics(
builderFactory: ClassBuilderFactory,
bindingContext: BindingContext,
@@ -42,15 +47,20 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
private val typeMapper = JetTypeMapper(bindingContext, ClassBuilderMode.LIGHT_CLASSES)
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>()
for (origin in data.signatureOrigins) {
var element = origin.element
if (element == null || allDelegatedToTraitImpls) {
element = data.classOrigin.element
if (noOwnImplementations) {
elements.addIfNotNull(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) {
@@ -141,4 +151,4 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
return descriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE
&& 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.resolve.jvm.diagnostics.JvmDeclarationOriginKind.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
public enum class MemberKind { FIELD METHOD }
@@ -36,6 +37,8 @@ public enum class JvmDeclarationOriginKind {
PACKAGE_PART
TRAIT_IMPL
DELEGATION_TO_TRAIT_IMPL
DELEGATION
BRIDGE
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 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 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 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):
fun <get-b>(): 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 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):
@@ -2,6 +2,6 @@ trait B {
fun getX() = 1
}
class C : B {
class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : B {
<!NOTHING_TO_OVERRIDE!>override<!> val x = 1
}
@@ -2,7 +2,7 @@ trait T {
fun getX() = 1
}
class C : T {
class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : T {
val x: Int
<!CONFLICTING_JVM_DECLARATIONS!>get()<!> = 1
}
@@ -3,6 +3,6 @@ trait T {
get() = 1
}
class C : T {
class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : T {
<!CONFLICTING_JVM_DECLARATIONS!>fun getX()<!> = 1
}
@@ -8,6 +8,6 @@ trait Bar<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>)<!> {}
}
@@ -2,6 +2,6 @@ trait T {
fun getX() = 1
}
class C : T {
class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : T {
<!CONFLICTING_JVM_DECLARATIONS!>val x<!> = 1
}