KT-4348: Array access operator overloading doesn't work with vararg's
#KT-4348 Fixed
This commit is contained in:
@@ -2288,17 +2288,28 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
}
|
||||
|
||||
private int pushMethodArguments(@NotNull ResolvedCall resolvedCall, List<Type> valueParameterTypes) {
|
||||
return pushMethodArguments(resolvedCall, valueParameterTypes, false);
|
||||
}
|
||||
|
||||
private int pushMethodArguments(@NotNull ResolvedCall resolvedCall, List<Type> valueParameterTypes, boolean skipLast) {
|
||||
@SuppressWarnings("unchecked")
|
||||
List<ResolvedValueArgument> valueArguments = resolvedCall.getValueArgumentsByIndex();
|
||||
CallableDescriptor fd = resolvedCall.getResultingDescriptor();
|
||||
List<ValueParameterDescriptor> valueParameters = fd.getValueParameters();
|
||||
|
||||
if (fd.getValueParameters().size() != valueArguments.size()) {
|
||||
if (valueParameters.size() != valueArguments.size()) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
int mask = 0;
|
||||
|
||||
for (ValueParameterDescriptor valueParameter : fd.getValueParameters()) {
|
||||
|
||||
for (Iterator<ValueParameterDescriptor> iterator = valueParameters.iterator(); iterator.hasNext(); ) {
|
||||
ValueParameterDescriptor valueParameter = iterator.next();
|
||||
if (skipLast && !iterator.hasNext()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ResolvedValueArgument resolvedValueArgument = valueArguments.get(valueParameter.getIndex());
|
||||
Type parameterType = valueParameterTypes.get(valueParameter.getIndex());
|
||||
if (resolvedValueArgument instanceof ExpressionValueArgument) {
|
||||
@@ -3380,20 +3391,22 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
assert resolvedCall != null : "couldn't find resolved call: " + expression.getText();
|
||||
|
||||
Callable callable = resolveToCallable(operationDescriptor, false);
|
||||
Method asmMethod = resolveToCallableMethod(operationDescriptor, false, context).getSignature().getAsmMethod();
|
||||
Type[] argumentTypes = asmMethod.getArgumentTypes();
|
||||
|
||||
if (callable instanceof CallableMethod) {
|
||||
genThisAndReceiverFromResolvedCall(receiver, resolvedCall, (CallableMethod) callable);
|
||||
pushMethodArguments(resolvedCall, ((CallableMethod) callable).getValueParameterTypes(), !isGetter);
|
||||
}
|
||||
else {
|
||||
gen(array, arrayType); // intrinsic method
|
||||
}
|
||||
|
||||
int index = operationDescriptor.getReceiverParameter() != null ? 1 : 0;
|
||||
int index = operationDescriptor.getReceiverParameter() != null ? 1 : 0;
|
||||
|
||||
Method asmMethod = resolveToCallableMethod(operationDescriptor, false, context).getSignature().getAsmMethod();
|
||||
Type[] argumentTypes = asmMethod.getArgumentTypes();
|
||||
for (JetExpression jetExpression : expression.getIndexExpressions()) {
|
||||
gen(jetExpression, argumentTypes[index]);
|
||||
index++;
|
||||
for (JetExpression jetExpression : expression.getIndexExpressions()) {
|
||||
gen(jetExpression, argumentTypes[index]);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
Type elementType = isGetter ? asmMethod.getReturnType() : ArrayUtil.getLastElement(argumentTypes);
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
fun String.get(vararg value: Any) : String {
|
||||
return if (value[0] == 44 && value[1] == "example") "OK" else "fail"
|
||||
}
|
||||
|
||||
fun Int.get(vararg value: Any) : Int {
|
||||
return if (value[0] == 44 && value[1] == "example") 1 else 0
|
||||
}
|
||||
fun main(args: Array<String>) {
|
||||
12 [44, "example"]
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
if ("foo" [44, "example"] != "OK") return "fail1"
|
||||
if (11 [44, "example"] != 1) return "fail2"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -193,6 +193,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
doTest("compiler/testData/codegen/box/arrays/kt33.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt4348.kt")
|
||||
public void testKt4348() throws Exception {
|
||||
doTest("compiler/testData/codegen/box/arrays/kt4348.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt503.kt")
|
||||
public void testKt503() throws Exception {
|
||||
doTest("compiler/testData/codegen/box/arrays/kt503.kt");
|
||||
|
||||
Reference in New Issue
Block a user