From c9c3a1c9247632de3447b5b7a07cec7ee3e2fb76 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 3 Feb 2015 16:42:59 +0300 Subject: [PATCH] Get containing with deferred stub evaluation Tested in org.jetbrains.kotlin.idea.quickfix.QuickFixMultiFileTestGenerated.CreateFromUsage.CreateVariable.Parameter#testPlatformType Resolve of Java element triggers resolve for all classes in package in IDE. One of them is Kotlin light class for package. In case when some declarations in that packages has references to Java class from current package, compiler goes to recursion. --- .../asJava/KotlinJavaFileStubProvider.java | 28 +++++++++---------- .../asJava/KotlinLightClassForPackage.java | 25 +++++++++++++++++ 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.java index e7246c4844c..18e92eaaa83 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.java @@ -26,7 +26,6 @@ import com.intellij.psi.ClassFileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.compiled.ClsFileImpl; import com.intellij.psi.impl.java.stubs.PsiJavaFileStub; import com.intellij.psi.impl.java.stubs.impl.PsiJavaFileStubImpl; @@ -359,20 +358,19 @@ public class KotlinJavaFileStubProvider files) { + public static VirtualFile getRepresentativeVirtualFile(@NotNull Collection files) { JetFile firstFile = files.iterator().next(); VirtualFile virtualFile = files.size() == 1 ? firstFile.getVirtualFile() : new LightVirtualFile(); assert virtualFile != null : "No virtual file for " + firstFile; diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForPackage.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForPackage.java index 04616850c72..94b7dc58e9a 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForPackage.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForPackage.java @@ -20,11 +20,14 @@ import com.google.common.collect.Sets; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.impl.compiled.ClsFileImpl; import com.intellij.psi.impl.light.LightEmptyImplementsList; import com.intellij.psi.impl.light.LightModifierList; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.stubs.PsiClassHolderFileStub; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; @@ -137,6 +140,7 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme private final CachedValue lightClassDataCache; private final PsiModifierList modifierList; private final LightEmptyImplementsList implementsList; + private final ClsFileImpl packageClsFile; private KotlinLightClassForPackage( @NotNull PsiManager manager, @@ -154,6 +158,22 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme this.files = Sets.newHashSet(files); // needed for hashCode this.hashCode = computeHashCode(); this.lightClassDataCache = FileStubCache.getInstance(getProject()).get(packageFqName, searchScope); + + VirtualFile virtualFile = KotlinJavaFileStubProvider.getRepresentativeVirtualFile(files); + packageClsFile = new ClsFileImpl(new ClassFileViewProvider(PsiManager.getInstance(getProject()), virtualFile)) { + @NotNull + @Override + public PsiClassHolderFileStub getStub() { + return ((ClsFileImpl) getDelegate().getContainingFile()).getStub(); + } + + @NotNull + @Override + public String getPackageName() { + return KotlinLightClassForPackage.this.packageFqName.asString(); + } + }; + packageClsFile.setPhysical(false); } @Nullable @@ -219,6 +239,11 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme return null; } + @Override + public PsiFile getContainingFile() { + return packageClsFile; + } + @Override public boolean hasTypeParameters() { return false;