improve diagnostic for KT-9484 Don't allow named arguments for inherited functions with parameter name conflicts
#KT-9484 Fixed
This commit is contained in:
+24
-3
@@ -84,6 +84,7 @@ public class ValueArgumentsToParametersMapper {
|
|||||||
private final MutableResolvedCall<D> candidateCall;
|
private final MutableResolvedCall<D> candidateCall;
|
||||||
|
|
||||||
private final Map<Name,ValueParameterDescriptor> parameterByName;
|
private final Map<Name,ValueParameterDescriptor> parameterByName;
|
||||||
|
private Map<Name,ValueParameterDescriptor> parameterByNameInOverriddenMethods;
|
||||||
|
|
||||||
private final Set<ValueArgument> unmappedArguments = Sets.newHashSet();
|
private final Set<ValueArgument> unmappedArguments = Sets.newHashSet();
|
||||||
private final Map<ValueParameterDescriptor, VarargValueArgument> varargs = Maps.newHashMap();
|
private final Map<ValueParameterDescriptor, VarargValueArgument> varargs = Maps.newHashMap();
|
||||||
@@ -101,6 +102,20 @@ public class ValueArgumentsToParametersMapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private ValueParameterDescriptor getParameterByNameInOverriddenMethods(Name name) {
|
||||||
|
if (parameterByNameInOverriddenMethods == null) {
|
||||||
|
parameterByNameInOverriddenMethods = Maps.newHashMap();
|
||||||
|
for (ValueParameterDescriptor valueParameter : candidateCall.getCandidateDescriptor().getValueParameters()) {
|
||||||
|
for (ValueParameterDescriptor parameterDescriptor : valueParameter.getOverriddenDescriptors()) {
|
||||||
|
parameterByNameInOverriddenMethods.put(parameterDescriptor.getName(), valueParameter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameterByNameInOverriddenMethods.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
// We saw only positioned arguments so far
|
// We saw only positioned arguments so far
|
||||||
private final ProcessorState positionedOnly = new ProcessorState() {
|
private final ProcessorState positionedOnly = new ProcessorState() {
|
||||||
|
|
||||||
@@ -163,11 +178,17 @@ public class ValueArgumentsToParametersMapper {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (candidate.hasStableParameterNames() && nameReference != null && valueParameterDescriptor != null &&
|
if (candidate.hasStableParameterNames() && nameReference != null &&
|
||||||
candidate instanceof CallableMemberDescriptor && ((CallableMemberDescriptor)candidate).getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
candidate instanceof CallableMemberDescriptor && ((CallableMemberDescriptor)candidate).getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||||
for (ValueParameterDescriptor parameterFromSuperclass : valueParameterDescriptor.getOverriddenDescriptors()) {
|
if (valueParameterDescriptor == null) {
|
||||||
if (OverrideResolver.shouldReportParameterNameOverrideWarning(valueParameterDescriptor, parameterFromSuperclass)) {
|
valueParameterDescriptor = getParameterByNameInOverriddenMethods(argumentName.getAsName());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valueParameterDescriptor != null) {
|
||||||
|
for (ValueParameterDescriptor parameterFromSuperclass : valueParameterDescriptor.getOverriddenDescriptors()) {
|
||||||
|
if (OverrideResolver.shouldReportParameterNameOverrideWarning(valueParameterDescriptor, parameterFromSuperclass)) {
|
||||||
report(NAME_FOR_AMBIGUOUS_PARAMETER.on(nameReference));
|
report(NAME_FOR_AMBIGUOUS_PARAMETER.on(nameReference));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+12
@@ -10,6 +10,18 @@ interface B {
|
|||||||
<!DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES!>interface D<!> : B, A
|
<!DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES!>interface D<!> : B, A
|
||||||
|
|
||||||
fun foo(x : C, y : D){
|
fun foo(x : C, y : D){
|
||||||
|
x.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>x<!> = 0)
|
||||||
x.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>y<!> = 0)
|
x.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>y<!> = 0)
|
||||||
y.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>x<!> = 0)
|
y.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>x<!> = 0)
|
||||||
|
y.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>y<!> = 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract <!DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES!>class C1<!> : A, B
|
||||||
|
abstract <!DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES!>class D1<!> : A, B
|
||||||
|
|
||||||
|
fun bar(x : C1, y : D1){
|
||||||
|
x.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>x<!> = 0)
|
||||||
|
x.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>y<!> = 0)
|
||||||
|
y.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>x<!> = 0)
|
||||||
|
y.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>y<!> = 0)
|
||||||
}
|
}
|
||||||
+17
@@ -1,5 +1,6 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
|
public fun bar(/*0*/ x: C1, /*1*/ y: D1): kotlin.Unit
|
||||||
public fun foo(/*0*/ x: C, /*1*/ y: D): kotlin.Unit
|
public fun foo(/*0*/ x: C, /*1*/ y: D): kotlin.Unit
|
||||||
|
|
||||||
public interface A {
|
public interface A {
|
||||||
@@ -23,9 +24,25 @@ public interface C : A, B {
|
|||||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract class C1 : A, B {
|
||||||
|
public constructor C1()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun foo(/*0*/ y: kotlin.Int): kotlin.Unit
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
public interface D : B, A {
|
public interface D : B, A {
|
||||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public abstract override /*2*/ /*fake_override*/ fun foo(/*0*/ x: kotlin.Int): kotlin.Unit
|
public abstract override /*2*/ /*fake_override*/ fun foo(/*0*/ x: kotlin.Int): kotlin.Unit
|
||||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract class D1 : A, B {
|
||||||
|
public constructor D1()
|
||||||
|
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public abstract override /*2*/ /*fake_override*/ fun foo(/*0*/ y: kotlin.Int): kotlin.Unit
|
||||||
|
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|||||||
+4
@@ -15,6 +15,10 @@ interface B {
|
|||||||
|
|
||||||
fun test(c: C) {
|
fun test(c: C) {
|
||||||
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>b1<!> = 1, <!NAME_FOR_AMBIGUOUS_PARAMETER!>b2<!> = 1.0)
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>b1<!> = 1, <!NAME_FOR_AMBIGUOUS_PARAMETER!>b2<!> = 1.0)
|
||||||
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>a1<!> = 1, <!NAME_FOR_AMBIGUOUS_PARAMETER!>b2<!> = 1.0)
|
||||||
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>a1<!> = 1, <!NAME_FOR_AMBIGUOUS_PARAMETER!>a2<!> = 1.0)
|
||||||
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>a1<!> = 1, <!NAME_FOR_AMBIGUOUS_PARAMETER!>a2<!> = 1.0)
|
||||||
c.bar(a1 = 1, a2 = 1.0, <!NAME_FOR_AMBIGUOUS_PARAMETER!>b3<!>= "")
|
c.bar(a1 = 1, a2 = 1.0, <!NAME_FOR_AMBIGUOUS_PARAMETER!>b3<!>= "")
|
||||||
c.baz(a1 = 1, <!NAME_FOR_AMBIGUOUS_PARAMETER!>b2<!> = 1.0, a3 = "", <!NAME_FOR_AMBIGUOUS_PARAMETER!>b4<!> = 2, a5 = "")
|
c.baz(a1 = 1, <!NAME_FOR_AMBIGUOUS_PARAMETER!>b2<!> = 1.0, a3 = "", <!NAME_FOR_AMBIGUOUS_PARAMETER!>b4<!> = 2, a5 = "")
|
||||||
|
c.baz(a1 = 1, <!NAME_FOR_AMBIGUOUS_PARAMETER!>a2<!> = 1.0, a3 = "", <!NAME_FOR_AMBIGUOUS_PARAMETER!>b4<!> = 2, a5 = "")
|
||||||
}
|
}
|
||||||
+1
@@ -10,5 +10,6 @@ interface B {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun test(c: C) {
|
fun test(c: C) {
|
||||||
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>a<!> = 1)
|
||||||
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>b<!> = 1)
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>b<!> = 1)
|
||||||
}
|
}
|
||||||
+1
@@ -10,5 +10,6 @@ interface B {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun test(c: C) {
|
fun test(c: C) {
|
||||||
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>a<!> = 1)
|
||||||
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>b<!> = 1)
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>b<!> = 1)
|
||||||
}
|
}
|
||||||
+1
@@ -10,5 +10,6 @@ interface B<E> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun test(c: C<Int>) {
|
fun test(c: C<Int>) {
|
||||||
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>a<!> = 1)
|
||||||
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>b<!> = 1)
|
c.foo(<!NAME_FOR_AMBIGUOUS_PARAMETER!>b<!> = 1)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user