Minor. Moved method.
This commit is contained in:
+3
-2
@@ -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;
|
||||
|
||||
+76
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+1
-75
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user