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.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor;
|
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 {
|
public class JavaVisibilities {
|
||||||
private JavaVisibilities() {
|
private JavaVisibilities() {
|
||||||
@@ -68,7 +68,8 @@ public class JavaVisibilities {
|
|||||||
else {
|
else {
|
||||||
DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration();
|
DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration();
|
||||||
assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptor : "Only static declarations can have protected_static visibility";
|
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;
|
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.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl;
|
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.OverridingUtil;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
|
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
|
||||||
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
|
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.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;
|
||||||
@@ -33,6 +37,7 @@ import org.jetbrains.jet.lang.types.TypeSubstitutor;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFQName;
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClassObject;
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClassObject;
|
||||||
|
|
||||||
public final class DescriptorResolverUtils {
|
public final class DescriptorResolverUtils {
|
||||||
@@ -265,4 +270,75 @@ 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 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.scope.NamedMembers;
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod;
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod;
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaType;
|
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.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.lang.types.TypeUtils;
|
import org.jetbrains.jet.lang.types.TypeUtils;
|
||||||
|
|
||||||
@@ -229,82 +227,10 @@ public final class JavaFunctionResolver {
|
|||||||
return functions;
|
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
|
@Nullable
|
||||||
public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptor owner, @NotNull NamedMembers namedMembers) {
|
public static SamConstructorDescriptor resolveSamConstructor(@NotNull JavaPackageFragmentDescriptor owner, @NotNull NamedMembers namedMembers) {
|
||||||
if (namedMembers.getSamInterface() != null) {
|
if (namedMembers.getSamInterface() != null) {
|
||||||
JavaClassDescriptor klass = findClassInPackage(owner, namedMembers.getName());
|
JavaClassDescriptor klass = DescriptorResolverUtils.findClassInPackage(owner, namedMembers.getName());
|
||||||
if (klass != null) {
|
if (klass != null) {
|
||||||
return createSamConstructorFunction(owner, klass);
|
return createSamConstructorFunction(owner, klass);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.name.Name
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPropertyDescriptor
|
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.descriptor.JavaClassDescriptor
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiClass
|
import com.intellij.psi.PsiClass
|
||||||
import com.intellij.psi.PsiModifier
|
import com.intellij.psi.PsiModifier
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver
|
|
||||||
|
|
||||||
trait SmartCompletionData{
|
trait SmartCompletionData{
|
||||||
fun accepts(descriptor: DeclarationDescriptor): Boolean
|
fun accepts(descriptor: DeclarationDescriptor): Boolean
|
||||||
@@ -257,7 +257,7 @@ private fun staticMembers(context: JetExpression, expectedType: JetType, resolve
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (classDescriptor is JavaClassDescriptor) {
|
if (classDescriptor is JavaClassDescriptor) {
|
||||||
val pseudoPackage = JavaFunctionResolver.getPackageForCorrespondingJavaClass(classDescriptor)
|
val pseudoPackage = DescriptorResolverUtils.getPackageForCorrespondingJavaClass(classDescriptor)
|
||||||
if (pseudoPackage != null) {
|
if (pseudoPackage != null) {
|
||||||
pseudoPackage.getMemberScope().getAllDescriptors().filterTo(descriptors, isSuitableCallable)
|
pseudoPackage.getMemberScope().getAllDescriptors().filterTo(descriptors, isSuitableCallable)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user