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.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(
|
||||
|
||||
+17
-7
@@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
+10
-2
@@ -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)
|
||||
@@ -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):
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
+1
-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
|
||||
}
|
||||
+1
-1
@@ -3,6 +3,6 @@ trait T {
|
||||
get() = 1
|
||||
}
|
||||
|
||||
class C : T {
|
||||
class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : T {
|
||||
<!CONFLICTING_JVM_DECLARATIONS!>fun getX()<!> = 1
|
||||
}
|
||||
+1
-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
|
||||
}
|
||||
Reference in New Issue
Block a user