Looking up classes by fqName instead of complex package traversal
This commit is contained in:
+7
-5
@@ -19,8 +19,7 @@ package org.jetbrains.jet.lang.resolve.java;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
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.resolver.DescriptorResolverUtils;
|
|
||||||
|
|
||||||
public class JavaVisibilities {
|
public class JavaVisibilities {
|
||||||
private JavaVisibilities() {
|
private JavaVisibilities() {
|
||||||
@@ -67,9 +66,12 @@ public class JavaVisibilities {
|
|||||||
// protected static function or property
|
// protected static function or property
|
||||||
else {
|
else {
|
||||||
DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration();
|
DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration();
|
||||||
assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptorImpl : "Only static declarations can have protected_static visibility";
|
|
||||||
whatClass = DescriptorResolverUtils
|
assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptor : "Only static declarations can have protected_static visibility";
|
||||||
.getClassForCorrespondingJavaPackage((JavaPackageFragmentDescriptorImpl) whatDeclarationDescriptor);
|
JavaPackageFragmentDescriptor javaPackageFragmentDescriptor = (JavaPackageFragmentDescriptor) whatDeclarationDescriptor;
|
||||||
|
|
||||||
|
whatClass = javaPackageFragmentDescriptor.getJavaDescriptorResolver().resolveClass(
|
||||||
|
javaPackageFragmentDescriptor.getFqName());
|
||||||
}
|
}
|
||||||
|
|
||||||
assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what;
|
assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what;
|
||||||
|
|||||||
-62
@@ -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.java.structure.*;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
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.TypeConstructor;
|
||||||
import org.jetbrains.jet.lang.types.TypeProjection;
|
import org.jetbrains.jet.lang.types.TypeProjection;
|
||||||
import org.jetbrains.jet.lang.types.TypeProjectionImpl;
|
import org.jetbrains.jet.lang.types.TypeProjectionImpl;
|
||||||
@@ -270,67 +269,6 @@ public final class DescriptorResolverUtils {
|
|||||||
return TypeSubstitutor.create(typeSubstitutionContext);
|
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
|
@Nullable
|
||||||
public static JavaPackageFragmentDescriptor getPackageForCorrespondingJavaClass(@NotNull JavaClassDescriptor javaClass) {
|
public static JavaPackageFragmentDescriptor getPackageForCorrespondingJavaClass(@NotNull JavaClassDescriptor javaClass) {
|
||||||
PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(javaClass, PackageFragmentDescriptor.class);
|
PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(javaClass, PackageFragmentDescriptor.class);
|
||||||
|
|||||||
+6
-6
@@ -194,8 +194,8 @@ public final class JavaFunctionResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (owner instanceof JavaPackageFragmentDescriptorImpl) {
|
if (owner instanceof JavaPackageFragmentDescriptor) {
|
||||||
SamConstructorDescriptor samConstructor = resolveSamConstructor((JavaPackageFragmentDescriptorImpl) owner, members);
|
SamConstructorDescriptor samConstructor = resolveSamConstructor((JavaPackageFragmentDescriptor) owner, members);
|
||||||
if (samConstructor != null) {
|
if (samConstructor != null) {
|
||||||
functionsFromCurrent.add(samConstructor);
|
functionsFromCurrent.add(samConstructor);
|
||||||
}
|
}
|
||||||
@@ -225,11 +225,11 @@ public final class JavaFunctionResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@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) {
|
if (namedMembers.getSamInterface() != null) {
|
||||||
JavaClassDescriptor klass = DescriptorResolverUtils.findClassInPackage(owner, namedMembers.getName());
|
ClassDescriptor klass = owner.getJavaDescriptorResolver().resolveClass(owner.getFqName().child(namedMembers.getName()));
|
||||||
if (klass != null) {
|
if (klass instanceof JavaClassDescriptor) {
|
||||||
return createSamConstructorFunction(owner, klass);
|
return createSamConstructorFunction(owner, (JavaClassDescriptor) klass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
+6
-3
@@ -19,9 +19,12 @@ package org.jetbrains.jet.lang.resolve.java.scope;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
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.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.JavaClass;
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
@@ -97,7 +100,7 @@ public final class JavaPurePackageScope extends JavaBaseScope implements JavaPac
|
|||||||
if (members == null) {
|
if (members == null) {
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((JavaPackageFragmentDescriptorImpl) descriptor, members);
|
SamConstructorDescriptor samConstructor = JavaFunctionResolver.resolveSamConstructor((JavaPackageFragmentDescriptor) descriptor, members);
|
||||||
if (samConstructor == null) {
|
if (samConstructor == null) {
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user