Refactoring: extract method createFakeClsFile
This commit is contained in:
+26
-7
@@ -38,6 +38,7 @@ import com.intellij.psi.util.PsiTreeUtil;
|
|||||||
import com.intellij.testFramework.LightVirtualFile;
|
import com.intellij.testFramework.LightVirtualFile;
|
||||||
import com.intellij.util.containers.ContainerUtil;
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import com.intellij.util.containers.Stack;
|
import com.intellij.util.containers.Stack;
|
||||||
|
import kotlin.Function0;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.codegen.CompilationErrorHandler;
|
import org.jetbrains.kotlin.codegen.CompilationErrorHandler;
|
||||||
@@ -302,7 +303,7 @@ public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostic
|
|||||||
|
|
||||||
LightClassConstructionContext context = stubGenerationStrategy.getContext(files);
|
LightClassConstructionContext context = stubGenerationStrategy.getContext(files);
|
||||||
|
|
||||||
PsiJavaFileStub javaFileStub = createJavaFileStub(packageFqName, getRepresentativeVirtualFile(files));
|
PsiJavaFileStub javaFileStub = createJavaFileStub(packageFqName, files);
|
||||||
BindingContext bindingContext;
|
BindingContext bindingContext;
|
||||||
BindingTraceContext forExtraDiagnostics = new BindingTraceContext();
|
BindingTraceContext forExtraDiagnostics = new BindingTraceContext();
|
||||||
try {
|
try {
|
||||||
@@ -352,17 +353,20 @@ public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostic
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private PsiJavaFileStub createJavaFileStub(@NotNull final FqName packageFqName, @NotNull VirtualFile virtualFile) {
|
public static ClsFileImpl createFakeClsFile(
|
||||||
|
@NotNull Project project,
|
||||||
|
@NotNull final FqName packageFqName,
|
||||||
|
@NotNull Collection<JetFile> files,
|
||||||
|
@NotNull final Function0<? extends PsiClassHolderFileStub> fileStubProvider
|
||||||
|
) {
|
||||||
PsiManager manager = PsiManager.getInstance(project);
|
PsiManager manager = PsiManager.getInstance(project);
|
||||||
|
|
||||||
final PsiJavaFileStubImpl javaFileStub = new PsiJavaFileStubImpl(packageFqName.asString(), true);
|
VirtualFile virtualFile = getRepresentativeVirtualFile(files);
|
||||||
javaFileStub.setPsiFactory(new ClsWrapperStubPsiFactory());
|
|
||||||
|
|
||||||
ClsFileImpl fakeFile = new ClsFileImpl(new ClassFileViewProvider(manager, virtualFile)) {
|
ClsFileImpl fakeFile = new ClsFileImpl(new ClassFileViewProvider(manager, virtualFile)) {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public PsiClassHolderFileStub getStub() {
|
public PsiClassHolderFileStub getStub() {
|
||||||
return javaFileStub;
|
return fileStubProvider.invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -373,12 +377,27 @@ public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostic
|
|||||||
};
|
};
|
||||||
|
|
||||||
fakeFile.setPhysical(false);
|
fakeFile.setPhysical(false);
|
||||||
|
return fakeFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private PsiJavaFileStub createJavaFileStub(@NotNull FqName packageFqName, @NotNull Collection<JetFile> files) {
|
||||||
|
final PsiJavaFileStubImpl javaFileStub = new PsiJavaFileStubImpl(packageFqName.asString(), true);
|
||||||
|
javaFileStub.setPsiFactory(new ClsWrapperStubPsiFactory());
|
||||||
|
|
||||||
|
ClsFileImpl fakeFile = createFakeClsFile(project, packageFqName, files, new Function0<PsiClassHolderFileStub>() {
|
||||||
|
@Override
|
||||||
|
public PsiClassHolderFileStub invoke() {
|
||||||
|
return javaFileStub;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
javaFileStub.setPsi(fakeFile);
|
javaFileStub.setPsi(fakeFile);
|
||||||
return javaFileStub;
|
return javaFileStub;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static VirtualFile getRepresentativeVirtualFile(@NotNull Collection<JetFile> files) {
|
private 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;
|
||||||
|
|||||||
+2
-10
@@ -96,16 +96,8 @@ public class KotlinLightClassForPackage private(
|
|||||||
private val implementsList: LightEmptyImplementsList =
|
private val implementsList: LightEmptyImplementsList =
|
||||||
LightEmptyImplementsList(manager)
|
LightEmptyImplementsList(manager)
|
||||||
|
|
||||||
private val packageClsFile: ClsFileImpl
|
private val packageClsFile: ClsFileImpl = KotlinJavaFileStubProvider.createFakeClsFile(manager.getProject(), packageClassFqName, files) {
|
||||||
|
(getDelegate().getContainingFile() as ClsFileImpl).getStub()
|
||||||
{
|
|
||||||
val virtualFile = KotlinJavaFileStubProvider.getRepresentativeVirtualFile(files)
|
|
||||||
packageClsFile = object : ClsFileImpl(ClassFileViewProvider(PsiManager.getInstance(getProject()), virtualFile)) {
|
|
||||||
override fun getStub() = (getDelegate().getContainingFile() as ClsFileImpl).getStub()
|
|
||||||
override fun getPackageName() = this@KotlinLightClassForPackage.packageFqName.asString()
|
|
||||||
}
|
|
||||||
|
|
||||||
packageClsFile.setPhysical(false)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getOrigin(): JetClassOrObject? = null
|
override fun getOrigin(): JetClassOrObject? = null
|
||||||
|
|||||||
Reference in New Issue
Block a user