Fix for KT-3546: Exception when delegating to ArrayList
#KT-3546 Fixed
This commit is contained in:
@@ -817,7 +817,8 @@ public class FunctionCodegen extends GenerationStateAware {
|
|||||||
StackValue.onStack(overriddenMethod.getReturnType()).put(delegateMethod.getReturnType(), iv);
|
StackValue.onStack(overriddenMethod.getReturnType()).put(delegateMethod.getReturnType(), iv);
|
||||||
|
|
||||||
iv.areturn(delegateMethod.getReturnType());
|
iv.areturn(delegateMethod.getReturnType());
|
||||||
endVisit(mv, "delegate method", descriptorToDeclaration(bindingContext, functionDescriptor));
|
endVisit(mv, "Delegate method " + functionDescriptor + " to " + jvmOverriddenMethodSignature,
|
||||||
|
descriptorToDeclaration(bindingContext, functionDescriptor.getContainingDeclaration()));
|
||||||
|
|
||||||
generateBridgeIfNeeded(owner, state, v, jvmDelegateMethodSignature.getAsmMethod(), functionDescriptor);
|
generateBridgeIfNeeded(owner, state, v, jvmDelegateMethodSignature.getAsmMethod(), functionDescriptor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.jet.lang.resolve;
|
package org.jetbrains.jet.lang.resolve;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
@@ -25,8 +26,6 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.ResolutionContext;
|
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.ResolutionResultsCache;
|
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall;
|
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
@@ -34,7 +33,6 @@ import org.jetbrains.jet.lang.types.JetType;
|
|||||||
import org.jetbrains.jet.lang.types.JetTypeInfo;
|
import org.jetbrains.jet.lang.types.JetTypeInfo;
|
||||||
import org.jetbrains.jet.util.slicedmap.ReadOnlySlice;
|
import org.jetbrains.jet.util.slicedmap.ReadOnlySlice;
|
||||||
import org.jetbrains.jet.util.slicedmap.Slices;
|
import org.jetbrains.jet.util.slicedmap.Slices;
|
||||||
import org.jetbrains.jet.util.slicedmap.WritableSlice;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -188,7 +186,8 @@ public class BindingContextUtils {
|
|||||||
Set<? extends CallableMemberDescriptor> overriddenDescriptors = callable.getOverriddenDescriptors();
|
Set<? extends CallableMemberDescriptor> overriddenDescriptors = callable.getOverriddenDescriptors();
|
||||||
if (overriddenDescriptors.size() != 1) {
|
if (overriddenDescriptors.size() != 1) {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"cannot find declaration: fake descriptor has more than one overridden descriptor: " + callable);
|
"Cannot find declaration: fake descriptor " + callable + " has more than one overridden descriptor:\n" +
|
||||||
|
StringUtil.join(overriddenDescriptors, ",\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return callableDescriptorToDeclaration(context, overriddenDescriptors.iterator().next());
|
return callableDescriptorToDeclaration(context, overriddenDescriptors.iterator().next());
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
trait A {
|
||||||
|
fun test(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
trait B {
|
||||||
|
fun test(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
trait C: A, B
|
||||||
|
|
||||||
|
class Z(val param: String): C {
|
||||||
|
|
||||||
|
override fun test(): String {
|
||||||
|
return param
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MyClass(val value : C) : C by value {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val s = MyClass(Z("OK"))
|
||||||
|
return s.test()
|
||||||
|
}
|
||||||
@@ -970,6 +970,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest("compiler/testData/codegen/box/classes/kt343.kt");
|
doTest("compiler/testData/codegen/box/classes/kt343.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt3546.kt")
|
||||||
|
public void testKt3546() throws Exception {
|
||||||
|
doTest("compiler/testData/codegen/box/classes/kt3546.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt454.kt")
|
@TestMetadata("kt454.kt")
|
||||||
public void testKt454() throws Exception {
|
public void testKt454() throws Exception {
|
||||||
doTest("compiler/testData/codegen/box/classes/kt454.kt");
|
doTest("compiler/testData/codegen/box/classes/kt454.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user