merging ResolverScopeData subclasses and Java*Scope classes

This commit is contained in:
Stepan Koltsov
2012-04-08 05:52:01 +04:00
parent 7be3d247f9
commit 41fb628004
4 changed files with 105 additions and 103 deletions
@@ -17,15 +17,21 @@
package org.jetbrains.jet.lang.resolve.java;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiModifier;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.FqName;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Class static of instance members.
@@ -34,7 +40,6 @@ import java.util.*;
*/
public class JavaClassMembersScope extends JavaClassOrPackageScope {
private final Map<String, ClassifierDescriptor> classifiers = Maps.newHashMap();
private Collection<DeclarationDescriptor> allDescriptors;
public JavaClassMembersScope(
@NotNull JavaSemanticServices semanticServices,
@@ -73,25 +78,6 @@ public class JavaClassMembersScope extends JavaClassOrPackageScope {
return Collections.emptySet();
}
/**
* @see JavaPackageScope#getAllDescriptors()
*/
@NotNull
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
if (allDescriptors == null) {
allDescriptors = Sets.newHashSet();
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData));
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(resolverScopeData));
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveInnerClasses(
resolverScopeData.classOrNamespaceDescriptor, resolverScopeData.psiClass, resolverScopeData.staticMembers));
}
return allDescriptors;
}
private ClassifierDescriptor doGetClassifierDescriptor(String name) {
// TODO : suboptimal, walk the list only once
for (PsiClass innerClass : resolverScopeData.psiClass.getAllInnerClasses()) {
@@ -16,15 +16,22 @@
package org.jetbrains.jet.lang.resolve.java;
import com.google.common.collect.Sets;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.resolve.FqName;
import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl;
import java.util.Collection;
import java.util.Set;
/**
@@ -37,6 +44,9 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl {
@NotNull
protected final JavaDescriptorResolver.ResolverScopeData resolverScopeData;
// cache
private Collection<DeclarationDescriptor> allDescriptors;
protected JavaClassOrPackageScope(
@NotNull JavaSemanticServices semanticServices,
@NotNull JavaDescriptorResolver.ResolverScopeData resolverScopeData) {
@@ -62,4 +72,58 @@ public abstract class JavaClassOrPackageScope extends JetScopeImpl {
return semanticServices.getDescriptorResolver().resolveFunctionGroup(name, resolverScopeData);
}
@NotNull
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
if (allDescriptors == null) {
allDescriptors = Sets.newHashSet();
if (resolverScopeData.psiClass != null) {
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData));
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(resolverScopeData));
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveInnerClasses(
resolverScopeData.classOrNamespaceDescriptor, resolverScopeData.psiClass, resolverScopeData.staticMembers));
}
if (resolverScopeData.psiPackage != null) {
boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(resolverScopeData.fqName) != null;
final JavaDescriptorResolver descriptorResolver = semanticServices.getDescriptorResolver();
for (PsiPackage psiSubPackage : resolverScopeData.psiPackage.getSubPackages()) {
NamespaceDescriptor childNs = descriptorResolver.resolveNamespace(
new FqName(psiSubPackage.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
if (childNs != null) {
allDescriptors.add(childNs);
}
}
for (PsiClass psiClass : resolverScopeData.psiPackage.getClasses()) {
if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) {
continue;
}
if (psiClass instanceof JetJavaMirrorMarker) {
continue;
}
// TODO: Temp hack for collection function descriptors from java
if (JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) {
continue;
}
if (psiClass.hasModifierProperty(PsiModifier.PUBLIC)) {
ClassDescriptor classDescriptor = descriptorResolver
.resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
if (classDescriptor != null) {
allDescriptors.add(classDescriptor);
}
}
}
}
}
return allDescriptors;
}
}
@@ -204,14 +204,29 @@ public class JavaDescriptorResolver {
@Nullable
final PsiClass psiClass;
@Nullable
final PsiPackage psiPackage;
@NotNull
final FqName fqName;
final boolean staticMembers;
@NotNull
final ClassOrNamespaceDescriptor classOrNamespaceDescriptor;
protected ResolverScopeData(@Nullable PsiClass psiClass, boolean staticMembers, @NotNull ClassOrNamespaceDescriptor descriptor) {
protected ResolverScopeData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, boolean staticMembers, @NotNull ClassOrNamespaceDescriptor descriptor) {
checkPsiClassIsNotJet(psiClass);
this.psiClass = psiClass;
this.psiPackage = psiPackage;
this.fqName = fqName;
if (psiClass == null && psiPackage == null) {
throw new IllegalStateException("both psiClass and psiPackage cannot be null");
}
if (fqName.lastSegmentIs(JvmAbi.PACKAGE_CLASS)) {
throw new IllegalStateException("identified cannot have last segment " + JvmAbi.PACKAGE_CLASS + ": " + fqName);
}
this.staticMembers = staticMembers;
classOrNamespaceDescriptor = descriptor;
}
@@ -226,8 +241,8 @@ public class JavaDescriptorResolver {
static class ResolverBinaryClassData extends ResolverScopeData {
private final MutableClassDescriptorLite classDescriptor;
ResolverBinaryClassData(@NotNull PsiClass psiClass, @NotNull MutableClassDescriptorLite classDescriptor) {
super(psiClass, false, classDescriptor);
ResolverBinaryClassData(@NotNull PsiClass psiClass, @NotNull FqName fqName, @NotNull MutableClassDescriptorLite classDescriptor) {
super(psiClass, null, fqName, false, classDescriptor);
this.classDescriptor = classDescriptor;
}
@@ -250,8 +265,8 @@ public class JavaDescriptorResolver {
static class ResolverNamespaceData extends ResolverScopeData {
private final NamespaceDescriptor namespaceDescriptor;
ResolverNamespaceData(@Nullable PsiClass psiClass, @NotNull NamespaceDescriptor namespaceDescriptor) {
super(psiClass, true, namespaceDescriptor);
ResolverNamespaceData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, @NotNull NamespaceDescriptor namespaceDescriptor) {
super(psiClass, psiPackage, fqName, true, namespaceDescriptor);
this.namespaceDescriptor = namespaceDescriptor;
}
@@ -340,7 +355,8 @@ public class JavaDescriptorResolver {
}
private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
if (classDescriptorCache.containsKey(new FqName(psiClass.getQualifiedName()))) {
FqName fqName = new FqName(psiClass.getQualifiedName());
if (classDescriptorCache.containsKey(fqName)) {
throw new IllegalStateException(psiClass.getQualifiedName());
}
@@ -349,8 +365,8 @@ public class JavaDescriptorResolver {
String name = psiClass.getName();
ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
ResolverBinaryClassData classData = new ResolverBinaryClassData(psiClass, new MutableClassDescriptorLite(containingDeclaration, kind));
classDescriptorCache.put(new FqName(psiClass.getQualifiedName()), classData);
ResolverBinaryClassData classData = new ResolverBinaryClassData(psiClass, fqName, new MutableClassDescriptorLite(containingDeclaration, kind));
classDescriptorCache.put(fqName, classData);
classData.classDescriptor.setName(name);
classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass));
@@ -518,9 +534,10 @@ public class JavaDescriptorResolver {
checkPsiClassIsNotJet(psiClass);
ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, new MutableClassDescriptorLite(containing, ClassKind.OBJECT));
FqName fqName = new FqName(classObjectPsiClass.getQualifiedName());
ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, fqName, new MutableClassDescriptorLite(containing, ClassKind.OBJECT));
classDescriptorCache.put(new FqName(classObjectPsiClass.getQualifiedName()), classData);
classDescriptorCache.put(fqName, classData);
classData.kotlin = true;
classData.classDescriptor.setSupertypes(getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData.classDescriptor, new ArrayList<TypeParameterDescriptor>(0)));
@@ -913,9 +930,9 @@ public class JavaDescriptorResolver {
trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, ns, false);
}
ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, ns);
ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, psiPackage, fqName, ns);
JavaPackageScope scope = new JavaPackageScope(fqName, semanticServices, psiPackage, psiClass, namespaceData);
JavaPackageScope scope = new JavaPackageScope(fqName, semanticServices, namespaceData);
// TODO: hack
namespaceData.kotlin = true;
@@ -973,14 +990,15 @@ public class JavaDescriptorResolver {
checkPsiClassIsNotJet(psiClass);
FqName fqName = new FqName(psiClass.getQualifiedName());
JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor(
(NamespaceDescriptorParent) resolveParentDescriptor(psiClass),
Collections.<AnnotationDescriptor>emptyList(), // TODO
psiClass.getName(),
new FqName(psiClass.getQualifiedName()),
fqName,
false
);
ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, ns);
ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, null, fqName, ns);
trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, namespaceData.namespaceDescriptor, true);
ns.setMemberScope(new JavaClassMembersScope(semanticServices, namespaceData));
@@ -38,24 +38,13 @@ public class JavaPackageScope extends JavaClassOrPackageScope {
@NotNull
private final FqName packageFQN;
@Nullable
private final PsiPackage psiPackage;
private Collection<DeclarationDescriptor> allDescriptors;
public JavaPackageScope(
@NotNull FqName packageFQN,
@NotNull JavaSemanticServices semanticServices,
@Nullable PsiPackage psiPackage,
@Nullable PsiClass psiClass,
@NotNull JavaDescriptorResolver.ResolverScopeData resolverNamespaceData) {
super(semanticServices, resolverNamespaceData);
this.packageFQN = packageFQN;
this.psiPackage = psiPackage;
if (psiClass == null && psiPackage == null) {
throw new IllegalStateException("both class and package cannot be null for " + packageFQN);
}
}
@Override
@@ -80,59 +69,4 @@ public class JavaPackageScope extends JavaClassOrPackageScope {
public NamespaceDescriptor getNamespace(@NotNull String name) {
return semanticServices.getDescriptorResolver().resolveNamespace(packageFQN.child(name), DescriptorSearchRule.INCLUDE_KOTLIN);
}
/**
* @see JavaClassMembersScope#getAllDescriptors()
*/
@NotNull
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
if (allDescriptors == null) {
allDescriptors = Sets.newHashSet();
if (resolverScopeData.psiClass != null) {
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveMethods(resolverScopeData));
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(resolverScopeData));
}
if (psiPackage != null) {
boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(packageFQN) != null;
final JavaDescriptorResolver descriptorResolver = semanticServices.getDescriptorResolver();
for (PsiPackage psiSubPackage : psiPackage.getSubPackages()) {
NamespaceDescriptor childNs = descriptorResolver.resolveNamespace(
new FqName(psiSubPackage.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
if (childNs != null) {
allDescriptors.add(childNs);
}
}
for (PsiClass psiClass : psiPackage.getClasses()) {
if (isKotlinNamespace && JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) {
continue;
}
if (psiClass instanceof JetJavaMirrorMarker) {
continue;
}
// TODO: Temp hack for collection function descriptors from java
if (JvmAbi.PACKAGE_CLASS.equals(psiClass.getName())) {
continue;
}
if (psiClass.hasModifierProperty(PsiModifier.PUBLIC)) {
ClassDescriptor classDescriptor = descriptorResolver
.resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
if (classDescriptor != null) {
allDescriptors.add(classDescriptor);
}
}
}
}
}
return allDescriptors;
}
}