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.
This commit is contained in:
+13
-15
@@ -26,7 +26,6 @@ import com.intellij.psi.ClassFileViewProvider;
|
|||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
import com.intellij.psi.PsiManager;
|
import com.intellij.psi.PsiManager;
|
||||||
import com.intellij.psi.impl.PsiManagerImpl;
|
|
||||||
import com.intellij.psi.impl.compiled.ClsFileImpl;
|
import com.intellij.psi.impl.compiled.ClsFileImpl;
|
||||||
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub;
|
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub;
|
||||||
import com.intellij.psi.impl.java.stubs.impl.PsiJavaFileStubImpl;
|
import com.intellij.psi.impl.java.stubs.impl.PsiJavaFileStubImpl;
|
||||||
@@ -359,20 +358,19 @@ public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostic
|
|||||||
final PsiJavaFileStubImpl javaFileStub = new PsiJavaFileStubImpl(packageFqName.asString(), true);
|
final PsiJavaFileStubImpl javaFileStub = new PsiJavaFileStubImpl(packageFqName.asString(), true);
|
||||||
javaFileStub.setPsiFactory(new ClsWrapperStubPsiFactory());
|
javaFileStub.setPsiFactory(new ClsWrapperStubPsiFactory());
|
||||||
|
|
||||||
ClsFileImpl fakeFile =
|
ClsFileImpl fakeFile = new ClsFileImpl(new ClassFileViewProvider(manager, virtualFile)) {
|
||||||
new ClsFileImpl((PsiManagerImpl) manager, new ClassFileViewProvider(manager, virtualFile)) {
|
@NotNull
|
||||||
@NotNull
|
@Override
|
||||||
@Override
|
public PsiClassHolderFileStub getStub() {
|
||||||
public PsiClassHolderFileStub getStub() {
|
return javaFileStub;
|
||||||
return javaFileStub;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public String getPackageName() {
|
public String getPackageName() {
|
||||||
return packageFqName.asString();
|
return packageFqName.asString();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fakeFile.setPhysical(false);
|
fakeFile.setPhysical(false);
|
||||||
javaFileStub.setPsi(fakeFile);
|
javaFileStub.setPsi(fakeFile);
|
||||||
@@ -380,7 +378,7 @@ public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostic
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static VirtualFile getRepresentativeVirtualFile(@NotNull Collection<JetFile> files) {
|
public static VirtualFile getRepresentativeVirtualFile(@NotNull Collection<JetFile> files) {
|
||||||
JetFile firstFile = files.iterator().next();
|
JetFile firstFile = files.iterator().next();
|
||||||
VirtualFile virtualFile = files.size() == 1 ? firstFile.getVirtualFile() : new LightVirtualFile();
|
VirtualFile virtualFile = files.size() == 1 ? firstFile.getVirtualFile() : new LightVirtualFile();
|
||||||
assert virtualFile != null : "No virtual file for " + firstFile;
|
assert virtualFile != null : "No virtual file for " + firstFile;
|
||||||
|
|||||||
+25
@@ -20,11 +20,14 @@ import com.google.common.collect.Sets;
|
|||||||
import com.intellij.openapi.components.ServiceManager;
|
import com.intellij.openapi.components.ServiceManager;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.openapi.util.Comparing;
|
import com.intellij.openapi.util.Comparing;
|
||||||
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
import com.intellij.psi.*;
|
import com.intellij.psi.*;
|
||||||
|
import com.intellij.psi.impl.compiled.ClsFileImpl;
|
||||||
import com.intellij.psi.impl.light.LightEmptyImplementsList;
|
import com.intellij.psi.impl.light.LightEmptyImplementsList;
|
||||||
import com.intellij.psi.impl.light.LightModifierList;
|
import com.intellij.psi.impl.light.LightModifierList;
|
||||||
import com.intellij.psi.javadoc.PsiDocComment;
|
import com.intellij.psi.javadoc.PsiDocComment;
|
||||||
import com.intellij.psi.search.GlobalSearchScope;
|
import com.intellij.psi.search.GlobalSearchScope;
|
||||||
|
import com.intellij.psi.stubs.PsiClassHolderFileStub;
|
||||||
import com.intellij.psi.util.CachedValue;
|
import com.intellij.psi.util.CachedValue;
|
||||||
import com.intellij.psi.util.CachedValueProvider;
|
import com.intellij.psi.util.CachedValueProvider;
|
||||||
import com.intellij.psi.util.CachedValuesManager;
|
import com.intellij.psi.util.CachedValuesManager;
|
||||||
@@ -137,6 +140,7 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme
|
|||||||
private final CachedValue<KotlinPackageLightClassData> lightClassDataCache;
|
private final CachedValue<KotlinPackageLightClassData> lightClassDataCache;
|
||||||
private final PsiModifierList modifierList;
|
private final PsiModifierList modifierList;
|
||||||
private final LightEmptyImplementsList implementsList;
|
private final LightEmptyImplementsList implementsList;
|
||||||
|
private final ClsFileImpl packageClsFile;
|
||||||
|
|
||||||
private KotlinLightClassForPackage(
|
private KotlinLightClassForPackage(
|
||||||
@NotNull PsiManager manager,
|
@NotNull PsiManager manager,
|
||||||
@@ -154,6 +158,22 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme
|
|||||||
this.files = Sets.newHashSet(files); // needed for hashCode
|
this.files = Sets.newHashSet(files); // needed for hashCode
|
||||||
this.hashCode = computeHashCode();
|
this.hashCode = computeHashCode();
|
||||||
this.lightClassDataCache = FileStubCache.getInstance(getProject()).get(packageFqName, searchScope);
|
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
|
@Nullable
|
||||||
@@ -219,6 +239,11 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PsiFile getContainingFile() {
|
||||||
|
return packageClsFile;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasTypeParameters() {
|
public boolean hasTypeParameters() {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user