Fix for KT-3546: Exception when delegating to ArrayList

#KT-3546 Fixed
This commit is contained in:
Mikhael Bogdanov
2013-06-18 12:59:48 +04:00
parent 8ac8798266
commit 79cf02ffb9
4 changed files with 35 additions and 5 deletions
@@ -817,7 +817,8 @@ public class FunctionCodegen extends GenerationStateAware {
StackValue.onStack(overriddenMethod.getReturnType()).put(delegateMethod.getReturnType(), iv);
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);
}
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
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.psi.*;
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.VariableAsFunctionResolvedCall;
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.util.slicedmap.ReadOnlySlice;
import org.jetbrains.jet.util.slicedmap.Slices;
import org.jetbrains.jet.util.slicedmap.WritableSlice;
import java.util.*;
@@ -188,7 +186,8 @@ public class BindingContextUtils {
Set<? extends CallableMemberDescriptor> overriddenDescriptors = callable.getOverriddenDescriptors();
if (overriddenDescriptors.size() != 1) {
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());
@@ -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");
}
@TestMetadata("kt3546.kt")
public void testKt3546() throws Exception {
doTest("compiler/testData/codegen/box/classes/kt3546.kt");
}
@TestMetadata("kt454.kt")
public void testKt454() throws Exception {
doTest("compiler/testData/codegen/box/classes/kt454.kt");