Fix resolution of Kotlin enums' values() and valueOf() from Java

Use the code from PsiClassImpl / ClsClassImpl, which for some reason is absent
in AbstractLightClass

 #KT-5591 Fixed
This commit is contained in:
Alexander Udalov
2014-09-10 14:37:31 +04:00
parent d4b1797646
commit 70561cc539
4 changed files with 32 additions and 7 deletions
@@ -17,16 +17,14 @@
package org.jetbrains.jet.asJava;
import com.intellij.lang.Language;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiClassImplUtil;
import com.intellij.psi.impl.light.AbstractLightClass;
import com.intellij.psi.impl.light.LightField;
import com.intellij.psi.impl.light.LightMethod;
import com.intellij.psi.impl.source.ClassInnerStuffCache;
import com.intellij.psi.impl.source.PsiExtensibleClass;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -114,8 +112,8 @@ public abstract class KotlinWrappingLightClass extends AbstractLightClass implem
public PsiField fun(PsiField field) {
JetDeclaration declaration = ClsWrapperStubPsiFactory.getOriginalDeclaration(field);
return declaration instanceof JetProperty
? new KotlinLightField(myManager, (JetProperty) declaration, field, KotlinWrappingLightClass.this)
: new LightField(myManager, field, KotlinWrappingLightClass.this);
? new KotlinLightField(myManager, (JetProperty) declaration, field, KotlinWrappingLightClass.this)
: new LightField(myManager, field, KotlinWrappingLightClass.this);
}
});
}
@@ -134,6 +132,17 @@ public abstract class KotlinWrappingLightClass extends AbstractLightClass implem
});
}
@Override
public boolean processDeclarations(
@NotNull PsiScopeProcessor processor, @NotNull ResolveState state, PsiElement lastParent, @NotNull PsiElement place
) {
if (isEnum()) {
if (!PsiClassImplUtil.processDeclarationsInEnum(processor, state, myInnersCache)) return false;
}
return super.processDeclarations(processor, state, lastParent, place);
}
@Override
public String getText() {
JetClassOrObject origin = getOrigin();
@@ -0,0 +1,8 @@
package test;
class EnumAutoGeneratedMethods {
void foo() {
TestEnum.values();
assert TestEnum.valueOf("first") == TestEnum.first;
}
}
@@ -0,0 +1,5 @@
package test
enum class TestEnum {
first second third
}
@@ -19,7 +19,6 @@ package org.jetbrains.jet.checkers;
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.nullable.NullableStuffInspection;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl;
import com.siyeh.ig.bugs.StaticCallOnSubclassInspection;
import com.siyeh.ig.bugs.StaticFieldReferenceOnSubclassInspection;
import org.jetbrains.jet.JetTestCaseBuilder;
@@ -73,4 +72,8 @@ public class KotlinAndJavaCheckerTest extends KotlinDaemonAnalyzerTestCase {
public void testImplementedMethodsFromTraits() throws Exception {
doTest(true, true, "ImplementedMethodsFromTraits.java", "ImplementedMethodsFromTraits.kt");
}
public void testEnumAutoGeneratedMethods() throws Exception {
doTest(true, true, "EnumAutoGeneratedMethods.java", "EnumAutoGeneratedMethods.kt");
}
}