JavaElementFinder builds new light classes

This commit is contained in:
Andrey Breslav
2012-12-25 18:21:06 +04:00
parent fa96915a9c
commit 4748befcfd
4 changed files with 22 additions and 10 deletions
@@ -35,7 +35,6 @@ import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.util.QualifiedNamesUtil;
import java.util.Collection;
import java.util.List;
@@ -102,7 +101,7 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
for (JetClassOrObject declaration : classOrObjectDeclarations) {
if (!(declaration instanceof JetEnumEntry)) {
JetLightClass lightClass = JetLightClass.create(psiManager, (JetFile) declaration.getContainingFile(), qualifiedName);
KotlinLightClass lightClass = KotlinLightClass.create(psiManager, qualifiedName, declaration);
if (lightClass != null) {
answer.add(lightClass);
}
@@ -111,13 +110,10 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
}
private void findPackageClass(FqName qualifiedName, GlobalSearchScope scope, List<PsiClass> answer) {
FqName packageClassName = QualifiedNamesUtil.combine(qualifiedName, Name.identifier(JvmAbi.PACKAGE_CLASS));
Collection<JetFile> filesForPackage = lightClassGenerationSupport.findFilesForPackage(qualifiedName, scope);
if (!filesForPackage.isEmpty() && NamespaceCodegen.shouldGenerateNSClass(filesForPackage)) {
// TODO This is wrong, but mimics the previous behavior. Will fix
JetFile someFile = filesForPackage.iterator().next();
JetLightClass lightClass = JetLightClass.create(psiManager, someFile, packageClassName);
KotlinLightClassForPackage lightClass = KotlinLightClassForPackage.create(psiManager, qualifiedName, filesForPackage);
if (lightClass != null) {
answer.add(lightClass);
}
@@ -202,8 +198,7 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
for (JetClassOrObject declaration : declarations) {
String localName = getLocalName(declaration);
if (localName != null) {
JetLightClass aClass = JetLightClass.create(psiManager, (JetFile) declaration.getContainingFile(),
QualifiedNamesUtil.combine(packageFQN, Name.identifier(localName)));
KotlinLightClass aClass = KotlinLightClass.create(psiManager, packageFQN.child(Name.identifier(localName)), declaration);
if (aClass != null) {
answer.add(aClass);
}
@@ -46,6 +46,7 @@ import org.jetbrains.jet.plugin.JetLanguage;
import javax.swing.*;
import java.util.Collections;
@Deprecated
public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMarker {
static class JetBadWrapperException extends RuntimeException {
private final String context;
@@ -30,6 +30,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetClassBody;
import org.jetbrains.jet.lang.psi.JetClassObject;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.java.JetJavaMirrorMarker;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.JetLanguage;
@@ -37,11 +38,19 @@ import org.jetbrains.jet.plugin.JetLanguage;
public class KotlinLightClass extends AbstractLightClass implements JetJavaMirrorMarker {
private final static Key<CachedValue<PsiJavaFileStub>> JAVA_API_STUB = Key.create("JAVA_API_STUB");
@Nullable
public static KotlinLightClass create(@NotNull PsiManager manager, @NotNull FqName qualifiedName, @NotNull JetClassOrObject classOrObject) {
if (LightClassUtil.belongsToKotlinBuiltIns((JetFile) classOrObject.getContainingFile())) {
return null;
}
return new KotlinLightClass(manager, qualifiedName, classOrObject);
}
private final FqName classFqName; // FqName of (possibly inner) class
private final JetClassOrObject outermostClassOrObject; // outermost parent of this class (may be equal to this class itself)
private PsiClass delegate;
protected KotlinLightClass(@NotNull PsiManager manager, @NotNull FqName name, @NotNull JetClassOrObject classOrObject) {
private KotlinLightClass(@NotNull PsiManager manager, @NotNull FqName name, @NotNull JetClassOrObject classOrObject) {
super(manager, JetLanguage.INSTANCE);
this.classFqName = name;
this.outermostClassOrObject = getOutermostClassOrObject(classOrObject);
@@ -38,13 +38,20 @@ import javax.swing.*;
import java.util.Collection;
public class KotlinLightClassForPackage extends KotlinLightClassForPackageBase implements JetJavaMirrorMarker {
@Nullable
public static KotlinLightClassForPackage create(@NotNull PsiManager manager, @NotNull FqName qualifiedName, @NotNull Collection<JetFile> files) {
for (JetFile file : files) {
if (LightClassUtil.belongsToKotlinBuiltIns(file)) return null;
}
return new KotlinLightClassForPackage(manager, qualifiedName, files);
}
private final FqName packageFqName;
private final Collection<JetFile> files;
private final int hashCode;
private final CachedValue<PsiJavaFileStub> javaFileStub;
public KotlinLightClassForPackage(@NotNull PsiManager manager, @NotNull FqName packageFqName, @NotNull Collection<JetFile> files) {
private KotlinLightClassForPackage(@NotNull PsiManager manager, @NotNull FqName packageFqName, @NotNull Collection<JetFile> files) {
super(manager);
this.packageFqName = packageFqName;
assert !files.isEmpty() : "No files for package " + packageFqName;