Fix broken isEnumClassObject methods
Out of three methods, two were incorrect
This commit is contained in:
@@ -19,7 +19,9 @@ package org.jetbrains.jet.codegen.intrinsics;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
|
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
@@ -35,7 +37,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.jetbrains.asm4.Opcodes.*;
|
import static org.jetbrains.asm4.Opcodes.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName;
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
|
||||||
|
|
||||||
public class IntrinsicMethods {
|
public class IntrinsicMethods {
|
||||||
private static final IntrinsicMethod UNARY_MINUS = new UnaryMinus();
|
private static final IntrinsicMethod UNARY_MINUS = new UnaryMinus();
|
||||||
@@ -229,10 +231,11 @@ public class IntrinsicMethods {
|
|||||||
SimpleFunctionDescriptor functionDescriptor = (SimpleFunctionDescriptor) descriptor;
|
SimpleFunctionDescriptor functionDescriptor = (SimpleFunctionDescriptor) descriptor;
|
||||||
|
|
||||||
if (isEnumClassObject(functionDescriptor.getContainingDeclaration())) {
|
if (isEnumClassObject(functionDescriptor.getContainingDeclaration())) {
|
||||||
if ("values".equals(functionDescriptor.getName().getName())) {
|
if (isEnumValuesMethod(functionDescriptor)) {
|
||||||
return ENUM_VALUES;
|
return ENUM_VALUES;
|
||||||
}
|
}
|
||||||
if ("valueOf".equals(functionDescriptor.getName().getName())) {
|
|
||||||
|
if (isEnumValueOfMethod(functionDescriptor)) {
|
||||||
return ENUM_VALUE_OF;
|
return ENUM_VALUE_OF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -254,20 +257,4 @@ public class IntrinsicMethods {
|
|||||||
}
|
}
|
||||||
return intrinsicMethod;
|
return intrinsicMethod;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isEnumClassObject(DeclarationDescriptor declaration) {
|
|
||||||
if (declaration instanceof ClassDescriptor) {
|
|
||||||
ClassDescriptor descriptor = (ClassDescriptor) declaration;
|
|
||||||
if (descriptor.getContainingDeclaration() instanceof ClassDescriptor) {
|
|
||||||
ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration();
|
|
||||||
//noinspection ConstantConditions
|
|
||||||
if (containingDeclaration != null &&
|
|
||||||
containingDeclaration.getClassObjectDescriptor() != null &&
|
|
||||||
containingDeclaration.getClassObjectDescriptor().equals(descriptor)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-14
@@ -40,7 +40,6 @@ import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
|
|||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
||||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -48,6 +47,7 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.OverridingUtil.*;
|
import static org.jetbrains.jet.lang.resolve.OverridingUtil.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA;
|
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA;
|
||||||
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
|
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
|
||||||
@@ -296,9 +296,9 @@ public final class JavaFunctionResolver {
|
|||||||
OverrideResolver.resolveUnknownVisibilities(functions, trace);
|
OverrideResolver.resolveUnknownVisibilities(functions, trace);
|
||||||
functions.addAll(functionsFromCurrent);
|
functions.addAll(functionsFromCurrent);
|
||||||
|
|
||||||
if (DescriptorUtils.isEnumClassObject(owner)) {
|
if (isEnumClassObject(owner)) {
|
||||||
for (FunctionDescriptor functionDescriptor : Lists.newArrayList(functions)) {
|
for (FunctionDescriptor functionDescriptor : Lists.newArrayList(functions)) {
|
||||||
if (isEnumSpecialMethod(functionDescriptor)) {
|
if (isEnumValueOfMethod(functionDescriptor) || isEnumValuesMethod(functionDescriptor)) {
|
||||||
functions.remove(functionDescriptor);
|
functions.remove(functionDescriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -361,17 +361,6 @@ public final class JavaFunctionResolver {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isEnumSpecialMethod(@NotNull FunctionDescriptor functionDescriptor) {
|
|
||||||
List<ValueParameterDescriptor> methodTypeParameters = functionDescriptor.getValueParameters();
|
|
||||||
String methodName = functionDescriptor.getName().getName();
|
|
||||||
JetType nullableString = TypeUtils.makeNullable(KotlinBuiltIns.getInstance().getStringType());
|
|
||||||
if (methodName.equals("valueOf") && methodTypeParameters.size() == 1
|
|
||||||
&& JetTypeChecker.INSTANCE.isSubtypeOf(methodTypeParameters.get(0).getType(), nullableString)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return (methodName.equals("values") && methodTypeParameters.isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean containsErrorType(@NotNull List<FunctionDescriptor> superFunctions, @NotNull FunctionDescriptor function) {
|
private static boolean containsErrorType(@NotNull List<FunctionDescriptor> superFunctions, @NotNull FunctionDescriptor function) {
|
||||||
if (containsErrorType(function)) {
|
if (containsErrorType(function)) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -354,10 +354,14 @@ public class DescriptorUtils {
|
|||||||
return Name.special("<class-object-for-" + className + ">");
|
return Name.special("<class-object-for-" + className + ">");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isEnumClassObject(@NotNull DeclarationDescriptor classObjectDescriptor) {
|
public static boolean isEnumClassObject(@NotNull DeclarationDescriptor descriptor) {
|
||||||
DeclarationDescriptor containingDeclaration = classObjectDescriptor.getContainingDeclaration();
|
if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == ClassKind.CLASS_OBJECT) {
|
||||||
return ((containingDeclaration instanceof ClassDescriptor) &&
|
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
|
||||||
((ClassDescriptor) containingDeclaration).getKind() == ClassKind.ENUM_CLASS);
|
if ((containing instanceof ClassDescriptor) && ((ClassDescriptor) containing).getKind() == ClassKind.ENUM_CLASS) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -512,4 +516,17 @@ public class DescriptorUtils {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isEnumValueOfMethod(@NotNull FunctionDescriptor functionDescriptor) {
|
||||||
|
List<ValueParameterDescriptor> methodTypeParameters = functionDescriptor.getValueParameters();
|
||||||
|
JetType nullableString = TypeUtils.makeNullable(KotlinBuiltIns.getInstance().getStringType());
|
||||||
|
return "valueOf".equals(functionDescriptor.getName().getName())
|
||||||
|
&& methodTypeParameters.size() == 1
|
||||||
|
&& JetTypeChecker.INSTANCE.isSubtypeOf(methodTypeParameters.get(0).getType(), nullableString);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isEnumValuesMethod(@NotNull FunctionDescriptor functionDescriptor) {
|
||||||
|
List<ValueParameterDescriptor> methodTypeParameters = functionDescriptor.getValueParameters();
|
||||||
|
return "values".equals(functionDescriptor.getName().getName())
|
||||||
|
&& methodTypeParameters.isEmpty();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-10
@@ -189,7 +189,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void generateEnumClassObjectMethods(@NotNull Collection<? super FunctionDescriptor> result, @NotNull Name name) {
|
private void generateEnumClassObjectMethods(@NotNull Collection<? super FunctionDescriptor> result, @NotNull Name name) {
|
||||||
if (!isEnumClassObject()) return;
|
if (!DescriptorUtils.isEnumClassObject(thisDescriptor)) return;
|
||||||
|
|
||||||
if (name.equals(DescriptorResolver.VALUES_METHOD_NAME)) {
|
if (name.equals(DescriptorResolver.VALUES_METHOD_NAME)) {
|
||||||
SimpleFunctionDescriptor valuesMethod = DescriptorResolver
|
SimpleFunctionDescriptor valuesMethod = DescriptorResolver
|
||||||
@@ -203,15 +203,6 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isEnumClassObject() {
|
|
||||||
DeclarationDescriptor containingDeclaration = thisDescriptor.getContainingDeclaration();
|
|
||||||
if (!(containingDeclaration instanceof ClassDescriptor)) return false;
|
|
||||||
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
|
|
||||||
if (classDescriptor.getKind() != ClassKind.ENUM_CLASS) return false;
|
|
||||||
if (classDescriptor.getClassObjectDescriptor() != thisDescriptor) return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Set<VariableDescriptor> getProperties(@NotNull Name name) {
|
public Set<VariableDescriptor> getProperties(@NotNull Name name) {
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
class A {
|
||||||
|
class object {
|
||||||
|
fun values() = "O"
|
||||||
|
fun valueOf() = "K"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = A.values() + A.valueOf()
|
||||||
@@ -7,9 +7,11 @@ public enum Enum {
|
|||||||
|
|
||||||
public static class Nested {
|
public static class Nested {
|
||||||
void foo() {}
|
void foo() {}
|
||||||
|
void values() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Inner {
|
public class Inner {
|
||||||
void bar() {}
|
void bar() {}
|
||||||
|
void valueOf(String s) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,10 +17,12 @@ public final enum class Enum : jet.Enum<test.Enum> {
|
|||||||
public open inner class Inner : java.lang.Object {
|
public open inner class Inner : java.lang.Object {
|
||||||
public constructor Inner()
|
public constructor Inner()
|
||||||
public/*package*/ open fun bar() : Unit
|
public/*package*/ open fun bar() : Unit
|
||||||
|
public/*package*/ open fun valueOf(/*0*/ p0 : jet.String?) : Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
public open class Nested : java.lang.Object {
|
public open class Nested : java.lang.Object {
|
||||||
public constructor Nested()
|
public constructor Nested()
|
||||||
public/*package*/ open fun foo() : Unit
|
public/*package*/ open fun foo() : Unit
|
||||||
|
public/*package*/ open fun values() : Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -477,6 +477,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest("compiler/testData/codegen/box/classes/classObjectInTrait.kt");
|
doTest("compiler/testData/codegen/box/classes/classObjectInTrait.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("classObjectNotOfEnum.kt")
|
||||||
|
public void testClassObjectNotOfEnum() throws Exception {
|
||||||
|
doTest("compiler/testData/codegen/box/classes/classObjectNotOfEnum.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("delegation2.kt")
|
@TestMetadata("delegation2.kt")
|
||||||
public void testDelegation2() throws Exception {
|
public void testDelegation2() throws Exception {
|
||||||
doTest("compiler/testData/codegen/box/classes/delegation2.kt");
|
doTest("compiler/testData/codegen/box/classes/delegation2.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user