Looking up classes by fqName instead of complex package traversal

This commit is contained in:
Andrey Breslav
2013-12-23 19:01:53 +04:00
parent da4245b712
commit 3eadd1403d
4 changed files with 19 additions and 76 deletions
@@ -19,8 +19,7 @@ package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptorImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
public class JavaVisibilities {
private JavaVisibilities() {
@@ -67,9 +66,12 @@ public class JavaVisibilities {
// protected static function or property
else {
DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration();
assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptorImpl : "Only static declarations can have protected_static visibility";
whatClass = DescriptorResolverUtils
.getClassForCorrespondingJavaPackage((JavaPackageFragmentDescriptorImpl) whatDeclarationDescriptor);
assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptor : "Only static declarations can have protected_static visibility";
JavaPackageFragmentDescriptor javaPackageFragmentDescriptor = (JavaPackageFragmentDescriptor) whatDeclarationDescriptor;
whatClass = javaPackageFragmentDescriptor.getJavaDescriptorResolver().resolveClass(
javaPackageFragmentDescriptor.getFqName());
}
assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what;
@@ -30,7 +30,6 @@ import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.java.structure.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.TypeConstructor;
import org.jetbrains.jet.lang.types.TypeProjection;
import org.jetbrains.jet.lang.types.TypeProjectionImpl;
@@ -270,67 +269,6 @@ public final class DescriptorResolverUtils {
return TypeSubstitutor.create(typeSubstitutionContext);
}
@Nullable
private static JavaClassDescriptor findClassInScope(@NotNull JetScope memberScope, @NotNull Name name) {
ClassifierDescriptor classifier = memberScope.getClassifier(name);
if (classifier instanceof JavaClassDescriptor) {
return (JavaClassDescriptor) classifier;
}
return null;
}
// E.g. we have foo.Bar.Baz class declared in Java. It will produce the following descriptors structure:
// package fragment foo
// +-- class Bar
// | +-- class Baz
// +-- package fragment Bar
// We need to find class 'Baz' in fragment 'foo.Bar'.
@Nullable
static JavaClassDescriptor findClassInPackage(@NotNull JavaPackageFragmentDescriptorImpl fragment, @NotNull Name name) {
// First, try to find in fragment directly
JavaClassDescriptor found = findClassInScope(fragment.getMemberScope(), name);
if (found != null) {
return found;
}
// If unsuccessful, try to find class of the same name as current (class 'foo.Bar')
JavaPackageFragmentDescriptorImpl parentPackage = getParentPackage(fragment);
if (parentPackage == null) {
return null;
}
// Calling recursively, looking for 'Bar' in 'foo'
ClassDescriptor classForCurrentPackage = findClassInPackage(parentPackage, fragment.getName());
if (classForCurrentPackage != null) {
// Try to find nested class 'Baz' in class 'foo.Bar'
return findClassInScope(DescriptorUtils.getStaticNestedClassesScope(classForCurrentPackage), name);
}
return null;
}
@Nullable
private static JavaPackageFragmentDescriptorImpl getParentPackage(@NotNull JavaPackageFragmentDescriptorImpl fragment) {
FqName fqName = fragment.getFqName();
if (fqName.isRoot()) {
return null;
}
JavaPackageFragmentDescriptorImpl parentPackage = fragment.getProvider().getOrCreatePackage(fqName.parent());
assert parentPackage != null : " couldn't find parent package for " + fragment;
return parentPackage;
}
@Nullable
public static JavaClassDescriptor getClassForCorrespondingJavaPackage(@NotNull JavaPackageFragmentDescriptorImpl fragment) {
JavaPackageFragmentDescriptorImpl parentPackage = getParentPackage(fragment);
if (parentPackage == null) {
return null;
}
return findClassInPackage(parentPackage, fragment.getFqName().shortName());
}
@Nullable
public static JavaPackageFragmentDescriptor getPackageForCorrespondingJavaClass(@NotNull JavaClassDescriptor javaClass) {
PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(javaClass, PackageFragmentDescriptor.class);
@@ -194,8 +194,8 @@ public final class JavaFunctionResolver {
}
}
if (owner instanceof JavaPackageFragmentDescriptorImpl) {
SamConstructorDescriptor samConstructor = resolveSamConstructor((JavaPackageFragmentDescriptorImpl) owner, members);
if (owner instanceof JavaPackageFragmentDescriptor) {
SamConstructorDescriptor samConstructor = resolveSamConstructor((JavaPackageFragmentDescriptor) owner, members);
if (samConstructor != null) {
functionsFromCurrent.add(samConstructor);
}
@@ -225,11 +225,11 @@ public final class JavaFunctionResolver {
}
@Nullable
public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptorImpl owner, @NotNull NamedMembers namedMembers) {
public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptor owner, @NotNull NamedMembers namedMembers) {
if (namedMembers.getSamInterface() != null) {
JavaClassDescriptor klass = DescriptorResolverUtils.findClassInPackage(owner, namedMembers.getName());
if (klass != null) {
return createSamConstructorFunction(owner, klass);
ClassDescriptor klass = owner.getJavaDescriptorResolver().resolveClass(owner.getFqName().child(namedMembers.getName()));
if (klass instanceof JavaClassDescriptor) {
return createSamConstructorFunction(owner, (JavaClassDescriptor) klass);
}
}
return null;
@@ -19,9 +19,12 @@ package org.jetbrains.jet.lang.resolve.java.scope;
import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptorImpl;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.java.resolver.*;
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.ProgressChecker;
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -97,7 +100,7 @@ public final class JavaPurePackageScope extends JavaBaseScope implements JavaPac
if (members == null) {
return Collections.emptySet();
}
SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((JavaPackageFragmentDescriptorImpl) descriptor, members);
SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((JavaPackageFragmentDescriptor) descriptor, members);
if (samConstructor == null) {
return Collections.emptySet();
}