merging ResolverScopeData subclasses and Java*Scope classes
This commit is contained in:
+9
-23
@@ -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()) {
|
||||
|
||||
+64
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+32
-14
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user