Move properties of enum class object to the enum class

Similar to how it's done for usual classes
This commit is contained in:
Alexander Udalov
2014-09-11 16:01:03 +04:00
parent 81004889eb
commit e0ee890486
5 changed files with 60 additions and 9 deletions
@@ -667,14 +667,17 @@ public class AsmUtil {
public static boolean isPropertyWithBackingFieldCopyInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) { public static boolean isPropertyWithBackingFieldCopyInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) {
boolean isExtensionProperty = propertyDescriptor.getReceiverParameter() != null; boolean isExtensionProperty = propertyDescriptor.getReceiverParameter() != null;
return !propertyDescriptor.isVar() && !isExtensionProperty DeclarationDescriptor propertyContainer = propertyDescriptor.getContainingDeclaration();
&& isClassObjectOfClassWithKind(propertyDescriptor.getContainingDeclaration(), ClassKind.TRAIT) return !propertyDescriptor.isVar()
&& !isExtensionProperty
&& isClassObject(propertyContainer) && isTrait(propertyContainer.getContainingDeclaration())
&& areBothAccessorDefault(propertyDescriptor) && areBothAccessorDefault(propertyDescriptor)
&& getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false) == ACC_PUBLIC; && getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false) == ACC_PUBLIC;
} }
public static boolean isClassObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor classObject) { public static boolean isClassObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor classObject) {
return isClassObjectOfClassWithKind(classObject, ClassKind.CLASS); DeclarationDescriptor containingClass = classObject.getContainingDeclaration();
return isClassObject(classObject) && (isClass(containingClass) || isEnumClass(containingClass));
} }
private static boolean areBothAccessorDefault(@NotNull PropertyDescriptor propertyDescriptor) { private static boolean areBothAccessorDefault(@NotNull PropertyDescriptor propertyDescriptor) {
@@ -686,10 +689,6 @@ public class AsmUtil {
return accessorDescriptor == null || !accessorDescriptor.hasBody(); return accessorDescriptor == null || !accessorDescriptor.hasBody();
} }
private static boolean isClassObjectOfClassWithKind(@NotNull DeclarationDescriptor classObject, @NotNull ClassKind kind) {
return isClassObject(classObject) && isKindOf(classObject.getContainingDeclaration(), kind);
}
public static Type comparisonOperandType(Type left, Type right) { public static Type comparisonOperandType(Type left, Type right) {
if (left == Type.DOUBLE_TYPE || right == Type.DOUBLE_TYPE) return Type.DOUBLE_TYPE; if (left == Type.DOUBLE_TYPE || right == Type.DOUBLE_TYPE) return Type.DOUBLE_TYPE;
if (left == Type.FLOAT_TYPE || right == Type.FLOAT_TYPE) return Type.FLOAT_TYPE; if (left == Type.FLOAT_TYPE || right == Type.FLOAT_TYPE) return Type.FLOAT_TYPE;
@@ -11,7 +11,7 @@ enum class Game {
fun box(): String { fun box(): String {
if (Game.foo() != Game.ROCK) return "Fail 1" if (Game.foo() != Game.ROCK) return "Fail 1"
// TODO: fix initialization order and uncomment // TODO: fix initialization order and uncomment (KT-5761)
// if (Game.bar != Game.PAPER) return "Fail 2: ${Game.bar}" // if (Game.bar != Game.PAPER) return "Fail 2: ${Game.bar}"
if (Game.values().size != 3) return "Fail 3" if (Game.values().size != 3) return "Fail 3"
if (Game.valueOf("SCISSORS") != Game.SCISSORS) return "Fail 4" if (Game.valueOf("SCISSORS") != Game.SCISSORS) return "Fail 4"
@@ -0,0 +1,16 @@
class Test {
String test() {
String s;
s = Klass.NAME;
if (!s.equals("Klass")) throw new AssertionError("Fail class: " + s);
s = Trait.NAME;
if (!s.equals("Trait")) throw new AssertionError("Fail trait: " + s);
s = Enoom.NAME;
if (!s.equals("Enoom")) throw new AssertionError("Fail enum: " + s);
return "OK";
}
}
@@ -0,0 +1,19 @@
class Klass {
class object {
val NAME = "Klass"
}
}
trait Trait {
class object {
val NAME = "Trait"
}
}
enum class Enoom {
class object {
val NAME = "Enoom"
}
}
fun box() = Test().test()
@@ -32,7 +32,7 @@ import java.util.regex.Pattern;
@SuppressWarnings("all") @SuppressWarnings("all")
@TestMetadata("compiler/testData/codegen/boxWithJava") @TestMetadata("compiler/testData/codegen/boxWithJava")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("$PROJECT_ROOT")
@InnerTestClasses({BlackBoxWithJavaCodegenTestGenerated.PlatformStatic.class}) @InnerTestClasses({BlackBoxWithJavaCodegenTestGenerated.PlatformStatic.class, BlackBoxWithJavaCodegenTestGenerated.Properties.class})
@RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class)
public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
public void testAllFilesPresentInBoxWithJava() throws Exception { public void testAllFilesPresentInBoxWithJava() throws Exception {
@@ -74,4 +74,21 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege
} }
@TestMetadata("compiler/testData/codegen/boxWithJava/properties")
@TestDataPath("$PROJECT_ROOT")
@InnerTestClasses({})
@RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class)
public static class Properties extends AbstractBlackBoxCodegenTest {
public void testAllFilesPresentInProperties() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithJava/properties"), Pattern.compile("^([^\\.]+)$"), true);
}
@TestMetadata("classObjectProperties")
public void testClassObjectProperties() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/properties/classObjectProperties/");
doTestWithJava(fileName);
}
}
} }