From c472cb682ff54ac8b8c03993d0100b3bfd5866d3 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 28 Nov 2013 19:16:29 +0400 Subject: [PATCH] Minor. Moved method. --- .../lang/resolve/java/JavaVisibilities.java | 5 +- .../resolver/DescriptorResolverUtils.java | 76 +++++++++++++++++++ .../java/resolver/JavaFunctionResolver.java | 76 +------------------ .../jet/plugin/completion/SmartCompletion.kt | 4 +- 4 files changed, 82 insertions(+), 79 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java index 02b61e54b81..7ecd3dced73 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java @@ -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; diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java index 8383fcde797..b7fa7d7e7b5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java @@ -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()); + } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index 4b8e40e0a33..aa25d8ee037 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -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); } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt index f0067a9c9ca..b621623e123 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt @@ -21,11 +21,11 @@ import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPropertyDescriptor import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor +import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils import com.intellij.psi.PsiElement import com.intellij.psi.PsiClass import com.intellij.psi.PsiModifier import com.intellij.psi.util.PsiTreeUtil -import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver trait SmartCompletionData{ fun accepts(descriptor: DeclarationDescriptor): Boolean @@ -257,7 +257,7 @@ private fun staticMembers(context: JetExpression, expectedType: JetType, resolve } if (classDescriptor is JavaClassDescriptor) { - val pseudoPackage = JavaFunctionResolver.getPackageForCorrespondingJavaClass(classDescriptor) + val pseudoPackage = DescriptorResolverUtils.getPackageForCorrespondingJavaClass(classDescriptor) if (pseudoPackage != null) { pseudoPackage.getMemberScope().getAllDescriptors().filterTo(descriptors, isSuitableCallable) }