From 4748befcfd33dcc5000f63041d7c7fff0c032041 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 25 Dec 2012 18:21:06 +0400 Subject: [PATCH] JavaElementFinder builds new light classes --- .../org/jetbrains/jet/asJava/JavaElementFinder.java | 11 +++-------- .../src/org/jetbrains/jet/asJava/JetLightClass.java | 1 + .../org/jetbrains/jet/asJava/KotlinLightClass.java | 11 ++++++++++- .../jet/asJava/KotlinLightClassForPackage.java | 9 ++++++++- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java index 79a9e2a87c4..4d39bb9a8d0 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java @@ -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 answer) { - FqName packageClassName = QualifiedNamesUtil.combine(qualifiedName, Name.identifier(JvmAbi.PACKAGE_CLASS)); Collection 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); } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java index c8ca5463897..d5411bf86bf 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java @@ -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; diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClass.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClass.java index 81aebda32ce..f4af4a6428b 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClass.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClass.java @@ -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> 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); diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java index e68eb17e870..60ba7e3e8ab 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java @@ -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 files) { + for (JetFile file : files) { + if (LightClassUtil.belongsToKotlinBuiltIns(file)) return null; + } + return new KotlinLightClassForPackage(manager, qualifiedName, files); + } private final FqName packageFqName; private final Collection files; private final int hashCode; private final CachedValue javaFileStub; - public KotlinLightClassForPackage(@NotNull PsiManager manager, @NotNull FqName packageFqName, @NotNull Collection files) { + private KotlinLightClassForPackage(@NotNull PsiManager manager, @NotNull FqName packageFqName, @NotNull Collection files) { super(manager); this.packageFqName = packageFqName; assert !files.isEmpty() : "No files for package " + packageFqName;