Do not report CONFLICTING_JVM_DECLARATIONS on delegated origin element
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
+17
-7
@@ -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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+10
-2
@@ -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)
|
||||||
@@ -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):
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
}
|
}
|
||||||
+1
-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
|
||||||
}
|
}
|
||||||
+1
-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
|
||||||
}
|
}
|
||||||
+1
-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
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user