Minor. Moved method.

This commit is contained in:
Evgeny Gerashchenko
2013-11-28 19:16:29 +04:00
parent 1cb13fce12
commit c472cb682f
4 changed files with 82 additions and 79 deletions
@@ -20,7 +20,7 @@ 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.JavaPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils;
public class JavaVisibilities {
private JavaVisibilities() {
@@ -68,7 +68,8 @@ public class JavaVisibilities {
else {
DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration();
assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptor : "Only static declarations can have protected_static visibility";
whatClass = JavaFunctionResolver.getClassForCorrespondingJavaPackage((JavaPackageFragmentDescriptor) whatDeclarationDescriptor);
whatClass = DescriptorResolverUtils
.getClassForCorrespondingJavaPackage((JavaPackageFragmentDescriptor) whatDeclarationDescriptor);
}
assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what;
@@ -20,12 +20,16 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.OverridingUtil;
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
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;
@@ -33,6 +37,7 @@ import org.jetbrains.jet.lang.types.TypeSubstitutor;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFQName;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClassObject;
public final class DescriptorResolverUtils {
@@ -265,4 +270,75 @@ 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 JavaPackageFragmentDescriptor 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')
JavaPackageFragmentDescriptor 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 JavaPackageFragmentDescriptor getParentPackage(@NotNull JavaPackageFragmentDescriptor fragment) {
FqName fqName = fragment.getFqName();
if (fqName.isRoot()) {
return null;
}
JavaPackageFragmentDescriptor parentPackage = fragment.getProvider().getOrCreatePackage(fqName.parent());
assert parentPackage != null : " couldn't find parent package for " + fragment;
return parentPackage;
}
@Nullable
public static JavaClassDescriptor getClassForCorrespondingJavaPackage(@NotNull JavaPackageFragmentDescriptor fragment) {
JavaPackageFragmentDescriptor 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);
assert packageFragment instanceof JavaPackageFragmentDescriptor :
"java class " + javaClass + " is under non-java fragment: " + packageFragment;
JavaPackageFragmentProvider provider = ((JavaPackageFragmentDescriptor) packageFragment).getProvider();
return provider.getOrCreatePackage(getFQName(javaClass).toSafe());
}
}
@@ -28,9 +28,7 @@ import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.java.scope.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod;
import org.jetbrains.jet.lang.resolve.java.structure.JavaType;
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.JetType;
import org.jetbrains.jet.lang.types.TypeUtils;
@@ -229,82 +227,10 @@ public final class JavaFunctionResolver {
return functions;
}
@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;
}
// TODO 2 move to proper place
// 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
private static JavaClassDescriptor findClassInPackage(@NotNull JavaPackageFragmentDescriptor 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')
JavaPackageFragmentDescriptor 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 JavaPackageFragmentDescriptor getParentPackage(JavaPackageFragmentDescriptor fragment) {
FqName fqName = fragment.getFqName();
if (fqName.isRoot()) {
return null;
}
JavaPackageFragmentDescriptor parentPackage = fragment.getProvider().getOrCreatePackage(fqName.parent());
assert parentPackage != null : " couldn't find parent package for " + fragment;
return parentPackage;
}
@Nullable
public static JavaClassDescriptor getClassForCorrespondingJavaPackage(@NotNull JavaPackageFragmentDescriptor fragment) {
JavaPackageFragmentDescriptor 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);
assert packageFragment instanceof JavaPackageFragmentDescriptor :
"java class " + javaClass + " is under non-java fragment: " + packageFragment;
JavaPackageFragmentProvider provider = ((JavaPackageFragmentDescriptor) packageFragment).getProvider();
return provider.getOrCreatePackage(getFQName(javaClass).toSafe());
}
@Nullable
public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptor owner, @NotNull NamedMembers namedMembers) {
if (namedMembers.getSamInterface() != null) {
JavaClassDescriptor klass = findClassInPackage(owner, namedMembers.getName());
JavaClassDescriptor klass = DescriptorResolverUtils.findClassInPackage(owner, namedMembers.getName());
if (klass != null) {
return createSamConstructorFunction(owner, klass);
}