KT-1051 Java interoperability completion (class and subpackages completion)

This commit is contained in:
Nikolay Krasko
2012-02-02 14:28:32 +04:00
parent fd3ae3923a
commit 38817014d5
9 changed files with 262 additions and 116 deletions
@@ -146,7 +146,7 @@ public class JavaElementFinder extends PsiElementFinder {
final List<JetFile> psiFiles = collectProjectJetFiles(project, GlobalSearchScope.allScope(project));
for (JetFile psiFile : psiFiles) {
if (qualifiedName.equals(JetPsiUtil.getFQName(psiFile))) {
if (JetPsiUtil.getFQName(psiFile).startsWith(qualifiedName)) {
return new PsiPackageImpl(psiFile.getManager(), qualifiedName);
}
}
@@ -154,6 +154,23 @@ public class JavaElementFinder extends PsiElementFinder {
return null;
}
@NotNull
@Override
public PsiPackage[] getSubPackages(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) {
final List<JetFile> psiFiles = collectProjectJetFiles(project, GlobalSearchScope.allScope(project));
Set<PsiPackage> answer = new HashSet<PsiPackage>();
for (JetFile psiFile : psiFiles) {
String jetRootNamespace = JetPsiUtil.getFQName(psiFile);
if (isInPackage(psiPackage.getQualifiedName(), jetRootNamespace)) {
answer.add(new JetLightPackage(psiFile.getManager(), jetRootNamespace));
}
}
return answer.toArray(new PsiPackage[answer.size()]);
}
@NotNull
@Override
public PsiClass[] getClasses(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) {
@@ -174,6 +191,24 @@ public class JavaElementFinder extends PsiElementFinder {
return answer.toArray(new PsiClass[answer.size()]);
}
private static boolean isInPackage(String packageName, String fqn) {
return fqn.startsWith(packageName + ".");
}
private static String subPackageName(String packageName, String packageFQN) {
if (!isInPackage(packageName, packageFQN)) {
return null;
}
int nextDotIndex = packageFQN.indexOf('.', (packageName + ".").length());
if (nextDotIndex != -1) {
return packageFQN.substring((packageName + ".").length(), nextDotIndex);
}
return packageFQN.substring((packageName + ".").length());
}
private synchronized void invalidateJetFilesCache() {
jetFiles.clear();
}
@@ -0,0 +1,18 @@
package org.jetbrains.jet.asJava;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.file.PsiPackageImpl;
/**
* @author Nikolay Krasko
*/
public class JetLightPackage extends PsiPackageImpl {
public JetLightPackage(PsiManager manager, String qualifiedName) {
super(manager, qualifiedName);
}
@Override
public boolean isValid() {
return true;
}
}