JavaPackageScope refactoring
* store PsiClass and PsiPackage inside * do not create if there's no PsiClass or PsiPackage
This commit is contained in:
+5
-1
@@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
|
|||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.FqName;
|
import org.jetbrains.jet.lang.resolve.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.ImportPath;
|
import org.jetbrains.jet.lang.resolve.ImportPath;
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
@@ -84,7 +85,10 @@ public class JavaBridgeConfiguration implements ModuleConfiguration {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope) {
|
public void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope) {
|
||||||
namespaceMemberScope.importScope(javaSemanticServices.getDescriptorResolver().createJavaPackageScope(DescriptorUtils.getFQName(namespaceDescriptor).toSafe(), namespaceDescriptor));
|
JetScope javaPackageScope = javaSemanticServices.getDescriptorResolver().createJavaPackageScope(DescriptorUtils.getFQName(namespaceDescriptor).toSafe(), namespaceDescriptor);
|
||||||
|
if (javaPackageScope != null) {
|
||||||
|
namespaceMemberScope.importScope(javaPackageScope);
|
||||||
|
}
|
||||||
delegateConfiguration.extendNamespaceScope(trace, namespaceDescriptor, namespaceMemberScope);
|
delegateConfiguration.extendNamespaceScope(trace, namespaceDescriptor, namespaceMemberScope);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+20
-1
@@ -841,8 +841,27 @@ public class JavaDescriptorResolver {
|
|||||||
return namespaceData;
|
return namespaceData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
public JavaPackageScope createJavaPackageScope(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
|
public JavaPackageScope createJavaPackageScope(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
|
||||||
return new JavaPackageScope(fqName, ns, semanticServices);
|
PsiPackage psiPackage = semanticServices.getPsiClassFinder().findPsiPackage(fqName);
|
||||||
|
PsiClass psiClass = getPsiClassForJavaPackageScope(fqName);
|
||||||
|
if (psiClass == null && psiPackage == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new JavaPackageScope(fqName, ns, semanticServices, psiPackage, psiClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
|
||||||
|
// TODO: move this check outside
|
||||||
|
// If this package is actually a Kotlin namespace, then we access it through a namespace descriptor, and
|
||||||
|
// Kotlin functions are already there
|
||||||
|
NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(packageFQN);
|
||||||
|
if (kotlinNamespaceDescriptor != null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
// TODO: what is GlobalSearchScope
|
||||||
|
return semanticServices.getPsiClassFinder().findPsiClass(JavaPackageScope.getQualifiedName(packageFQN, JvmAbi.PACKAGE_CLASS));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
+15
-20
@@ -22,6 +22,7 @@ import com.intellij.psi.PsiClass;
|
|||||||
import com.intellij.psi.PsiModifier;
|
import com.intellij.psi.PsiModifier;
|
||||||
import com.intellij.psi.PsiPackage;
|
import com.intellij.psi.PsiPackage;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
@@ -38,27 +39,23 @@ public class JavaPackageScope extends JavaClassOrPackageScope {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final FqName packageFQN;
|
private final FqName packageFQN;
|
||||||
|
@Nullable
|
||||||
|
private final PsiPackage psiPackage;
|
||||||
|
|
||||||
private Collection<DeclarationDescriptor> allDescriptors;
|
private Collection<DeclarationDescriptor> allDescriptors;
|
||||||
|
|
||||||
public JavaPackageScope(
|
public JavaPackageScope(
|
||||||
@NotNull FqName packageFQN,
|
@NotNull FqName packageFQN,
|
||||||
@NotNull NamespaceDescriptor containingDescriptor,
|
@NotNull NamespaceDescriptor containingDescriptor,
|
||||||
@NotNull JavaSemanticServices semanticServices) {
|
@NotNull JavaSemanticServices semanticServices,
|
||||||
super(containingDescriptor, semanticServices, getPiClass(packageFQN, semanticServices));
|
@Nullable PsiPackage psiPackage,
|
||||||
|
@Nullable PsiClass psiClass) {
|
||||||
|
super(containingDescriptor, semanticServices, psiClass);
|
||||||
this.packageFQN = packageFQN;
|
this.packageFQN = packageFQN;
|
||||||
}
|
this.psiPackage = psiPackage;
|
||||||
|
|
||||||
private static PsiClass getPiClass(FqName packageFQN, JavaSemanticServices semanticServices) {
|
if (psiClass == null && psiPackage == null) {
|
||||||
// TODO: move this check outside
|
throw new IllegalStateException("both class and package cannot be null for " + packageFQN);
|
||||||
// If this package is actually a Kotlin namespace, then we access it through a namespace descriptor, and
|
|
||||||
// Kotlin functions are already there
|
|
||||||
NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(packageFQN);
|
|
||||||
if (kotlinNamespaceDescriptor != null) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
// TODO: what is GlobalSearchScope
|
|
||||||
return semanticServices.getPsiClassFinder().findPsiClass(getQualifiedName(packageFQN, JvmAbi.PACKAGE_CLASS));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,20 +102,18 @@ public class JavaPackageScope extends JavaClassOrPackageScope {
|
|||||||
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(descriptor, psiClass, staticMembers()));
|
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(descriptor, psiClass, staticMembers()));
|
||||||
}
|
}
|
||||||
|
|
||||||
final PsiPackage javaPackage = semanticServices.getPsiClassFinder().findPsiPackage(packageFQN);
|
if (psiPackage != null) {
|
||||||
|
boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(packageFQN) != null;
|
||||||
if (javaPackage != null) {
|
|
||||||
boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(new FqName(javaPackage.getQualifiedName())) != null;
|
|
||||||
final JavaDescriptorResolver descriptorResolver = semanticServices.getDescriptorResolver();
|
final JavaDescriptorResolver descriptorResolver = semanticServices.getDescriptorResolver();
|
||||||
|
|
||||||
for (PsiPackage psiSubPackage : javaPackage.getSubPackages()) {
|
for (PsiPackage psiSubPackage : psiPackage.getSubPackages()) {
|
||||||
NamespaceDescriptor childNs = descriptorResolver.resolveNamespace(new FqName(psiSubPackage.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
|
NamespaceDescriptor childNs = descriptorResolver.resolveNamespace(new FqName(psiSubPackage.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
|
||||||
if (childNs != null) {
|
if (childNs != null) {
|
||||||
allDescriptors.add(childNs);
|
allDescriptors.add(childNs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PsiClass psiClass : javaPackage.getClasses()) {
|
for (PsiClass psiClass : psiPackage.getClasses()) {
|
||||||
if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) {
|
if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -147,7 +142,7 @@ public class JavaPackageScope extends JavaClassOrPackageScope {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static FqName getQualifiedName(@NotNull FqName packageFQN, @NotNull String name) {
|
static FqName getQualifiedName(@NotNull FqName packageFQN, @NotNull String name) {
|
||||||
return packageFQN.child(name);
|
return packageFQN.child(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user