test case and fixes for object and classes inner for enum entry

This commit is contained in:
Alex Tkachman
2012-09-12 20:48:12 +03:00
parent 2c17cb7aa7
commit 0a2f808ec0
3 changed files with 40 additions and 21 deletions
@@ -23,6 +23,7 @@ import org.jetbrains.asm4.Label;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.asm4.commons.Method; import org.jetbrains.asm4.commons.Method;
import org.jetbrains.jet.codegen.binding.CodegenBinding;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod; import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.codegen.state.JetTypeMapper;
@@ -355,8 +356,21 @@ public abstract class StackValue {
return receiver; return receiver;
} }
public static StackValue singleton(ClassDescriptor aClass, JetTypeMapper typeMapper) { public static StackValue singleton(ClassDescriptor classDescriptor, JetTypeMapper typeMapper) {
return new Singleton(aClass, typeMapper.mapType(aClass.getDefaultType(), JetTypeMapperMode.VALUE)); final Type type = typeMapper.mapType(classDescriptor.getDefaultType(), JetTypeMapperMode.VALUE);
final ClassKind kind = classDescriptor.getKind();
if (kind == ClassKind.CLASS_OBJECT || kind == ClassKind.OBJECT) {
return field(type, JvmClassName.byInternalName(type.getInternalName()), "$instance", true);
}
else if (kind == ClassKind.ENUM_ENTRY) {
final JvmClassName owner = typeMapper.getBindingContext()
.get(CodegenBinding.FQN, classDescriptor.getContainingDeclaration().getContainingDeclaration());
return field(type, owner, classDescriptor.getName().getName(), true);
}
else {
throw new UnsupportedOperationException();
}
} }
private static class None extends StackValue { private static class None extends StackValue {
@@ -1322,22 +1336,4 @@ public abstract class StackValue {
} }
} }
} }
public static class Singleton extends StackValue {
private final ClassDescriptor classDescriptor;
protected Singleton(ClassDescriptor classDescriptor, @NotNull Type type) {
super(type);
this.classDescriptor = classDescriptor;
}
@Override
public void put(Type type, InstructionAdapter v) {
final ClassKind kind = classDescriptor.getKind();
if (kind == ClassKind.CLASS_OBJECT || kind == ClassKind.OBJECT) {
v.getstatic(this.type.getInternalName(), "$instance", this.type.getDescriptor());
coerce(type, v);
}
}
}
} }
@@ -0,0 +1,20 @@
package test
fun box() = IssueState.DEFAULT.ToString() + IssueState.FIXED.ToString()
enum class IssueState {
DEFAULT {
class D {
val k = ToString()
}
}
FIXED {
override fun ToString() = "K"
object D {
val k = ToString()
}
}
open fun ToString() : String = "O"
}
@@ -150,6 +150,9 @@ public class EnumGenTest extends CodegenTestCase {
public void testKt2350() { public void testKt2350() {
blackBoxFile("regressions/kt2350.kt"); blackBoxFile("regressions/kt2350.kt");
System.out.println(generateToText()); }
public void testEntryWithInner() {
blackBoxFile("enum/entrywithinner.kt");
} }
} }