Direct call to lib/alt jars
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
<orderEntry type="module" module-name="frontend" />
|
||||
<orderEntry type="module" module-name="stdlib" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="intellij-core" level="project" />
|
||||
<orderEntry type="module" module-name="util" exported="" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
|
||||
+5
@@ -16,6 +16,7 @@ import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder;
|
||||
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
|
||||
import org.jetbrains.jet.lang.types.*;
|
||||
import org.jetbrains.jet.plugin.JetFileType;
|
||||
@@ -124,6 +125,7 @@ public class JavaDescriptorResolver {
|
||||
protected final JavaPsiFacade javaFacade;
|
||||
protected final GlobalSearchScope javaSearchScope;
|
||||
protected final JavaSemanticServices semanticServices;
|
||||
private final AltClassFinder altClassFinder;
|
||||
|
||||
public JavaDescriptorResolver(Project project, JavaSemanticServices semanticServices) {
|
||||
this.javaFacade = JavaPsiFacade.getInstance(project);
|
||||
@@ -141,6 +143,7 @@ public class JavaDescriptorResolver {
|
||||
}
|
||||
};
|
||||
this.semanticServices = semanticServices;
|
||||
altClassFinder = new AltClassFinder(project);
|
||||
}
|
||||
|
||||
public static boolean isInJdkHeaders(VirtualFile file) {
|
||||
@@ -656,6 +659,8 @@ public class JavaDescriptorResolver {
|
||||
}
|
||||
|
||||
private PsiClass findClass(String qualifiedName) {
|
||||
PsiClass altClass = altClassFinder.findClass(qualifiedName);
|
||||
if (altClass != null) return altClass;
|
||||
return javaFacade.findClass(qualifiedName, javaSearchScope);
|
||||
}
|
||||
|
||||
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* @author max
|
||||
*/
|
||||
package org.jetbrains.jet.lang.resolve.java.alt;
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiClassOwner;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.plugin.compiler.PathUtil;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AltClassFinder {
|
||||
private static final Logger LOG = Logger.getInstance("#org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder");
|
||||
|
||||
private final PsiManager psiManager;
|
||||
private final List<VirtualFile> roots = new ArrayList<VirtualFile>();
|
||||
|
||||
public AltClassFinder(Project project) {
|
||||
psiManager = PsiManager.getInstance(project);
|
||||
|
||||
File alts = PathUtil.getAltHeadersPath();
|
||||
|
||||
if (alts != null) {
|
||||
for (File root : alts.listFiles()) {
|
||||
VirtualFile jarRoot = VirtualFileManager.getInstance().findFileByUrl("jar://" + root.getPath() + "!/");
|
||||
roots.add(jarRoot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public PsiClass findClass(@NotNull String qualifiedName) {
|
||||
for (final VirtualFile classRoot : roots) {
|
||||
final VirtualFile classFile = classRoot.findFileByRelativePath(qualifiedName.replace('.', '/') + ".class");
|
||||
if (classFile != null) {
|
||||
if (!classFile.isValid()) {
|
||||
LOG.error("Invalid child of valid parent: " + classFile.getPath() + "; " + classRoot.isValid() + " path=" + classRoot.getPath());
|
||||
return null;
|
||||
}
|
||||
final PsiFile file = psiManager.findFile(classFile);
|
||||
if (file instanceof PsiClassOwner) {
|
||||
final PsiClass[] classes = ((PsiClassOwner) file).getClasses();
|
||||
if (classes.length == 1) {
|
||||
return classes[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user