JavaClass, JavaPackage, JavaAnnotation
Create dumb wrappers over PSI elements, will be used for loading descriptors from JVM reflection later (instead of PSI)
This commit is contained in:
+7
-2
@@ -18,6 +18,7 @@ package org.jetbrains.jet.di;
|
||||
|
||||
import com.intellij.openapi.project.Project;
|
||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl;
|
||||
import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder;
|
||||
@@ -42,6 +43,7 @@ public class InjectorForJavaDescriptorResolver {
|
||||
|
||||
private final Project project;
|
||||
private final BindingTrace bindingTrace;
|
||||
private final JavaClassFinderImpl javaClassFinder;
|
||||
private final JavaDescriptorResolver javaDescriptorResolver;
|
||||
private final PsiClassFinderImpl psiClassFinder;
|
||||
private final VirtualFileFinder virtualFileFinder;
|
||||
@@ -65,6 +67,7 @@ public class InjectorForJavaDescriptorResolver {
|
||||
) {
|
||||
this.project = project;
|
||||
this.bindingTrace = bindingTrace;
|
||||
this.javaClassFinder = new JavaClassFinderImpl();
|
||||
this.javaDescriptorResolver = new JavaDescriptorResolver();
|
||||
this.psiClassFinder = new PsiClassFinderImpl();
|
||||
this.virtualFileFinder = com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class);
|
||||
@@ -82,6 +85,8 @@ public class InjectorForJavaDescriptorResolver {
|
||||
this.javaConstructorResolver = new JavaConstructorResolver();
|
||||
this.javaPropertyResolver = new JavaPropertyResolver();
|
||||
|
||||
javaClassFinder.setPsiClassFinder(psiClassFinder);
|
||||
|
||||
this.javaDescriptorResolver.setClassResolver(javaClassResolver);
|
||||
this.javaDescriptorResolver.setConstructorResolver(javaConstructorResolver);
|
||||
this.javaDescriptorResolver.setFunctionResolver(javaFunctionResolver);
|
||||
@@ -92,10 +97,10 @@ public class InjectorForJavaDescriptorResolver {
|
||||
|
||||
javaClassResolver.setAnnotationResolver(javaAnnotationResolver);
|
||||
javaClassResolver.setFunctionResolver(javaFunctionResolver);
|
||||
javaClassResolver.setJavaClassFinder(javaClassFinder);
|
||||
javaClassResolver.setJavaDescriptorResolver(javaDescriptorResolver);
|
||||
javaClassResolver.setKotlinDescriptorResolver(deserializedDescriptorResolver);
|
||||
javaClassResolver.setNamespaceResolver(javaNamespaceResolver);
|
||||
javaClassResolver.setPsiClassFinder(psiClassFinder);
|
||||
javaClassResolver.setSignatureResolver(javaSignatureResolver);
|
||||
javaClassResolver.setSupertypesResolver(javaSupertypeResolver);
|
||||
javaClassResolver.setTrace(bindingTrace);
|
||||
@@ -128,8 +133,8 @@ public class InjectorForJavaDescriptorResolver {
|
||||
annotationDescriptorDeserializer.setVirtualFileFinder(virtualFileFinder);
|
||||
|
||||
javaNamespaceResolver.setDeserializedDescriptorResolver(deserializedDescriptorResolver);
|
||||
javaNamespaceResolver.setJavaClassFinder(javaClassFinder);
|
||||
javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver);
|
||||
javaNamespaceResolver.setPsiClassFinder(psiClassFinder);
|
||||
javaNamespaceResolver.setTrace(bindingTrace);
|
||||
javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder);
|
||||
|
||||
|
||||
+7
-2
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
|
||||
import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl;
|
||||
import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder;
|
||||
import org.jetbrains.jet.lang.resolve.DeclarationResolver;
|
||||
@@ -81,6 +82,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
||||
private final JavaBridgeConfiguration javaBridgeConfiguration;
|
||||
private final JavaDescriptorResolver javaDescriptorResolver;
|
||||
private final PsiClassFinderImpl psiClassFinder;
|
||||
private final JavaClassFinderImpl javaClassFinder;
|
||||
private final NamespaceFactoryImpl namespaceFactory;
|
||||
private final VirtualFileFinder virtualFileFinder;
|
||||
private final DeclarationResolver declarationResolver;
|
||||
@@ -133,6 +135,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
||||
this.javaBridgeConfiguration = new JavaBridgeConfiguration();
|
||||
this.javaDescriptorResolver = new JavaDescriptorResolver();
|
||||
this.psiClassFinder = new PsiClassFinderImpl();
|
||||
this.javaClassFinder = new JavaClassFinderImpl();
|
||||
this.namespaceFactory = new NamespaceFactoryImpl();
|
||||
this.virtualFileFinder = com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class);
|
||||
this.declarationResolver = new DeclarationResolver();
|
||||
@@ -208,6 +211,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
||||
|
||||
psiClassFinder.setProject(project);
|
||||
|
||||
javaClassFinder.setPsiClassFinder(psiClassFinder);
|
||||
|
||||
this.namespaceFactory.setModuleDescriptor(moduleDescriptor);
|
||||
this.namespaceFactory.setTrace(bindingTrace);
|
||||
|
||||
@@ -279,10 +284,10 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
||||
|
||||
javaClassResolver.setAnnotationResolver(javaAnnotationResolver);
|
||||
javaClassResolver.setFunctionResolver(javaFunctionResolver);
|
||||
javaClassResolver.setJavaClassFinder(javaClassFinder);
|
||||
javaClassResolver.setJavaDescriptorResolver(javaDescriptorResolver);
|
||||
javaClassResolver.setKotlinDescriptorResolver(deserializedDescriptorResolver);
|
||||
javaClassResolver.setNamespaceResolver(javaNamespaceResolver);
|
||||
javaClassResolver.setPsiClassFinder(psiClassFinder);
|
||||
javaClassResolver.setSignatureResolver(javaSignatureResolver);
|
||||
javaClassResolver.setSupertypesResolver(javaSupertypeResolver);
|
||||
javaClassResolver.setTrace(bindingTrace);
|
||||
@@ -315,8 +320,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
||||
annotationDescriptorDeserializer.setVirtualFileFinder(virtualFileFinder);
|
||||
|
||||
javaNamespaceResolver.setDeserializedDescriptorResolver(deserializedDescriptorResolver);
|
||||
javaNamespaceResolver.setJavaClassFinder(javaClassFinder);
|
||||
javaNamespaceResolver.setJavaDescriptorResolver(javaDescriptorResolver);
|
||||
javaNamespaceResolver.setPsiClassFinder(psiClassFinder);
|
||||
javaNamespaceResolver.setTrace(bindingTrace);
|
||||
javaNamespaceResolver.setVirtualFileFinder(virtualFileFinder);
|
||||
|
||||
|
||||
+20
-24
@@ -23,6 +23,7 @@ import com.intellij.psi.util.PsiFormatUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
@@ -38,33 +39,29 @@ public final class DescriptorResolverUtils {
|
||||
private DescriptorResolverUtils() {
|
||||
}
|
||||
|
||||
public static boolean isCompiledKotlinPackageClass(@NotNull PsiClass psiClass) {
|
||||
if (psiClass instanceof ClsClassImpl) {
|
||||
String qualifiedName = psiClass.getQualifiedName();
|
||||
if (qualifiedName != null && PackageClassUtils.isPackageClassFqName(new FqName(qualifiedName))) {
|
||||
return hasAnnotation(psiClass, JvmAnnotationNames.KOTLIN_PACKAGE.getFqName());
|
||||
public static boolean isCompiledKotlinPackageClass(@NotNull JavaClass javaClass) {
|
||||
if (javaClass.getPsiClass() instanceof ClsClassImpl) {
|
||||
String fqName = javaClass.getFqName();
|
||||
if (fqName != null && PackageClassUtils.isPackageClassFqName(new FqName(fqName))) {
|
||||
return hasAnnotation(javaClass, JvmAnnotationNames.KOTLIN_PACKAGE.getFqName());
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isCompiledKotlinClass(@NotNull PsiClass psiClass) {
|
||||
if (psiClass instanceof ClsClassImpl) {
|
||||
return hasAnnotation(psiClass, JvmAnnotationNames.KOTLIN_CLASS.getFqName());
|
||||
public static boolean isCompiledKotlinClass(@NotNull JavaClass javaClass) {
|
||||
if (javaClass.getPsiClass() instanceof ClsClassImpl) {
|
||||
return hasAnnotation(javaClass, JvmAnnotationNames.KOTLIN_CLASS.getFqName());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean hasAnnotation(@NotNull PsiClass psiClass, @NotNull FqName annotationFqName) {
|
||||
PsiModifierList list = psiClass.getModifierList();
|
||||
if (list != null) {
|
||||
return list.findAnnotation(annotationFqName.asString()) != null;
|
||||
}
|
||||
return false;
|
||||
public static boolean hasAnnotation(@NotNull JavaClass javaClass, @NotNull FqName annotationFqName) {
|
||||
return javaClass.findAnnotation(annotationFqName.asString()) != null;
|
||||
}
|
||||
|
||||
public static boolean isCompiledKotlinClassOrPackageClass(@NotNull PsiClass psiClass) {
|
||||
return isCompiledKotlinClass(psiClass) || isCompiledKotlinPackageClass(psiClass);
|
||||
public static boolean isCompiledKotlinClassOrPackageClass(@NotNull JavaClass javaClass) {
|
||||
return isCompiledKotlinClass(javaClass) || isCompiledKotlinPackageClass(javaClass);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -155,15 +152,14 @@ public final class DescriptorResolverUtils {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static Collection<PsiClass> filterDuplicateClasses(@NotNull PsiClass[] classes) {
|
||||
Set<String> addedQualifiedNames = new HashSet<String>(classes.length);
|
||||
List<PsiClass> result = new ArrayList<PsiClass>(classes.length);
|
||||
public static Collection<JavaClass> filterDuplicateClasses(@NotNull Collection<JavaClass> classes) {
|
||||
Set<String> addedQualifiedNames = new HashSet<String>(classes.size());
|
||||
List<JavaClass> result = new ArrayList<JavaClass>(classes.size());
|
||||
|
||||
for (PsiClass psiClass : classes) {
|
||||
String qualifiedName = psiClass.getQualifiedName();
|
||||
|
||||
if (qualifiedName != null && addedQualifiedNames.add(qualifiedName)) {
|
||||
result.add(psiClass);
|
||||
for (JavaClass javaClass : classes) {
|
||||
String fqName = javaClass.getFqName();
|
||||
if (fqName != null && addedQualifiedNames.add(fqName)) {
|
||||
result.add(javaClass);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2010-2013 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
|
||||
public interface JavaClassFinder {
|
||||
// TODO: scope
|
||||
@Nullable
|
||||
JavaClass findClass(@NotNull FqName fqName);
|
||||
|
||||
@Nullable
|
||||
JavaPackage findPackage(@NotNull FqName fqName);
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright 2010-2013 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java;
|
||||
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class JavaClassFinderImpl implements JavaClassFinder {
|
||||
private PsiClassFinder psiClassFinder;
|
||||
|
||||
@Inject
|
||||
public void setPsiClassFinder(@NotNull PsiClassFinder psiClassFinder) {
|
||||
this.psiClassFinder = psiClassFinder;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public JavaClass findClass(@NotNull FqName fqName) {
|
||||
PsiClass psiClass = psiClassFinder.findPsiClass(fqName);
|
||||
return psiClass == null ? null : new JavaClass(psiClass);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public JavaPackage findPackage(@NotNull FqName fqName) {
|
||||
PsiPackage psiPackage = psiClassFinder.findPsiPackage(fqName);
|
||||
return psiPackage == null ? null : new JavaPackage(psiPackage);
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -16,12 +16,12 @@
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java;
|
||||
|
||||
import com.intellij.psi.PsiClass;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.*;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||
@@ -81,8 +81,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Collection<ConstructorDescriptor> resolveConstructors(@NotNull PsiClass psiClass, @NotNull ClassDescriptor classDescriptor) {
|
||||
return constructorResolver.resolveConstructors(psiClass, classDescriptor);
|
||||
public Collection<ConstructorDescriptor> resolveConstructors(@NotNull JavaClass javaClass, @NotNull ClassDescriptor classDescriptor) {
|
||||
return constructorResolver.resolveConstructors(javaClass, classDescriptor);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
+21
-14
@@ -18,12 +18,17 @@ package org.jetbrains.jet.lang.resolve.java.provider;
|
||||
|
||||
import com.google.common.collect.HashMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiMember;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
|
||||
import org.jetbrains.jet.lang.resolve.java.JetJavaMirrorMarker;
|
||||
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
|
||||
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.wrapper.PsiFieldWrapper;
|
||||
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMemberWrapper;
|
||||
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
|
||||
@@ -89,19 +94,19 @@ public final class MembersCache {
|
||||
|
||||
@NotNull
|
||||
public static MembersCache buildMembersByNameCache(
|
||||
@Nullable PsiClass psiClass,
|
||||
@Nullable PsiPackage psiPackage,
|
||||
@Nullable JavaClass javaClass,
|
||||
@Nullable JavaPackage javaPackage,
|
||||
boolean staticMembers
|
||||
) {
|
||||
MembersCache membersCache = new MembersCache();
|
||||
|
||||
if (psiClass != null) {
|
||||
membersCache.new ClassMemberProcessor(psiClass, staticMembers).process();
|
||||
Collection<PsiClass> innerClasses = DescriptorResolverUtils.filterDuplicateClasses(psiClass.getInnerClasses());
|
||||
if (javaClass != null) {
|
||||
membersCache.new ClassMemberProcessor(javaClass, staticMembers).process();
|
||||
Collection<JavaClass> innerClasses = javaClass.getInnerClasses();
|
||||
membersCache.new ExtraPackageMembersProcessor(innerClasses).process();
|
||||
}
|
||||
else if (psiPackage != null) {
|
||||
Collection<PsiClass> classes = DescriptorResolverUtils.filterDuplicateClasses(psiPackage.getClasses());
|
||||
else if (javaPackage != null) {
|
||||
Collection<JavaClass> classes = DescriptorResolverUtils.filterDuplicateClasses(javaPackage.getClasses());
|
||||
membersCache.new ExtraPackageMembersProcessor(classes).process();
|
||||
}
|
||||
|
||||
@@ -110,14 +115,16 @@ public final class MembersCache {
|
||||
|
||||
private class ExtraPackageMembersProcessor { // 'extra' means that PSI elements for these members are not just top-level classes
|
||||
@NotNull
|
||||
private final Collection<PsiClass> psiClasses;
|
||||
private final Collection<JavaClass> javaClasses;
|
||||
|
||||
private ExtraPackageMembersProcessor(@NotNull Collection<PsiClass> psiClasses) {
|
||||
this.psiClasses = psiClasses;
|
||||
private ExtraPackageMembersProcessor(@NotNull Collection<JavaClass> javaClasses) {
|
||||
this.javaClasses = javaClasses;
|
||||
}
|
||||
|
||||
private void process() {
|
||||
for (PsiClass psiClass : psiClasses) {
|
||||
for (JavaClass javaClass : javaClasses) {
|
||||
PsiClass psiClass = javaClass.getPsiClass();
|
||||
|
||||
if (!(psiClass instanceof JetJavaMirrorMarker)) { // to filter out JetLightClasses
|
||||
if (SingleAbstractMethodUtils.isSamInterface(psiClass)) {
|
||||
processSamInterface(psiClass);
|
||||
@@ -137,8 +144,8 @@ public final class MembersCache {
|
||||
private final PsiClass psiClass;
|
||||
private final boolean staticMembers;
|
||||
|
||||
private ClassMemberProcessor(@NotNull PsiClass psiClass, boolean staticMembers) {
|
||||
this.psiClass = psiClass;
|
||||
private ClassMemberProcessor(@NotNull JavaClass javaClass, boolean staticMembers) {
|
||||
this.psiClass = javaClass.getPsiClass();
|
||||
this.staticMembers = staticMembers;
|
||||
}
|
||||
|
||||
|
||||
+20
-22
@@ -22,7 +22,6 @@ import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
@@ -39,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.java.*;
|
||||
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
|
||||
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
|
||||
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder;
|
||||
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
@@ -91,7 +91,7 @@ public final class JavaClassResolver {
|
||||
private JavaSignatureResolver signatureResolver;
|
||||
private JavaDescriptorResolver javaDescriptorResolver;
|
||||
private JavaAnnotationResolver annotationResolver;
|
||||
private PsiClassFinder psiClassFinder;
|
||||
private JavaClassFinder javaClassFinder;
|
||||
private JavaNamespaceResolver namespaceResolver;
|
||||
private JavaSupertypeResolver supertypesResolver;
|
||||
private JavaFunctionResolver functionResolver;
|
||||
@@ -132,8 +132,8 @@ public final class JavaClassResolver {
|
||||
}
|
||||
|
||||
@Inject
|
||||
public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
|
||||
this.psiClassFinder = psiClassFinder;
|
||||
public void setJavaClassFinder(JavaClassFinder javaClassFinder) {
|
||||
this.javaClassFinder = javaClassFinder;
|
||||
}
|
||||
|
||||
@Inject
|
||||
@@ -237,17 +237,14 @@ public final class JavaClassResolver {
|
||||
}
|
||||
}
|
||||
|
||||
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName);
|
||||
if (psiClass == null) {
|
||||
JavaClass javaClass = javaClassFinder.findClass(qualifiedName);
|
||||
if (javaClass == null) {
|
||||
cacheNegativeValue(javaClassToKotlinFqName(qualifiedName));
|
||||
return null;
|
||||
}
|
||||
|
||||
if (KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.equals(qualifiedName.parent())) {
|
||||
PsiAnnotation assertInvisibleAnnotation = JavaAnnotationResolver.findOwnAnnotation(
|
||||
psiClass, JvmAnnotationNames.ASSERT_INVISIBLE_IN_RESOLVER.getFqName().asString());
|
||||
|
||||
if (assertInvisibleAnnotation != null) {
|
||||
if (javaClass.findAnnotation(JvmAnnotationNames.ASSERT_INVISIBLE_IN_RESOLVER.getFqName().asString()) != null) {
|
||||
if (ApplicationManager.getApplication().isInternal()) {
|
||||
LOG.error("classpath is configured incorrectly:" +
|
||||
" class " + qualifiedName + " from runtime must not be loaded by compiler");
|
||||
@@ -257,10 +254,12 @@ public final class JavaClassResolver {
|
||||
}
|
||||
|
||||
// Class may have been resolved previously by different Java resolver instance, and we are reusing its trace
|
||||
ClassDescriptor alreadyResolved = trace.get(BindingContext.CLASS, psiClass);
|
||||
ClassDescriptor alreadyResolved = trace.get(BindingContext.CLASS, javaClass.getPsiClass());
|
||||
if (alreadyResolved != null) {
|
||||
return alreadyResolved;
|
||||
}
|
||||
|
||||
PsiClass psiClass = javaClass.getPsiClass();
|
||||
//TODO: code duplication
|
||||
ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(qualifiedName, isContainedInClass(psiClass));
|
||||
// class may be resolved during resolution of parent
|
||||
@@ -275,7 +274,7 @@ public final class JavaClassResolver {
|
||||
checkPsiClassIsNotJet(psiClass);
|
||||
|
||||
|
||||
return doCreateClassDescriptor(qualifiedName, psiClass, tasks, containingDeclaration);
|
||||
return doCreateClassDescriptor(qualifiedName, javaClass, tasks, containingDeclaration);
|
||||
}
|
||||
|
||||
private void cacheNegativeValue(@NotNull FqNameBase qualifiedName) {
|
||||
@@ -293,10 +292,12 @@ public final class JavaClassResolver {
|
||||
@NotNull
|
||||
private ClassDescriptorFromJvmBytecode doCreateClassDescriptor(
|
||||
@NotNull FqName fqName,
|
||||
@NotNull PsiClass psiClass,
|
||||
@NotNull JavaClass javaClass,
|
||||
@NotNull PostponedTasks taskList,
|
||||
@NotNull ClassOrNamespaceDescriptor containingDeclaration
|
||||
) {
|
||||
PsiClass psiClass = javaClass.getPsiClass();
|
||||
|
||||
ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, getClassKind(psiClass),
|
||||
isInnerClass(psiClass));
|
||||
|
||||
@@ -314,7 +315,7 @@ public final class JavaClassResolver {
|
||||
classDescriptor.setModality(resolveModality(psiClass, classDescriptor));
|
||||
classDescriptor.createTypeConstructor();
|
||||
|
||||
JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classDescriptor, psiClass, false, javaDescriptorResolver);
|
||||
JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classDescriptor, javaClass, false, javaDescriptorResolver);
|
||||
classDescriptor.setScopeForMemberLookup(scope);
|
||||
classDescriptor.setScopeForConstructorResolve(scope);
|
||||
|
||||
@@ -326,7 +327,7 @@ public final class JavaClassResolver {
|
||||
supertypes.addAll(supertypesResolver.getSupertypes(classDescriptor, psiClass, classTypeParameters));
|
||||
|
||||
if (psiClass.isEnum()) {
|
||||
ClassDescriptorFromJvmBytecode classObjectDescriptor = createClassObjectDescriptorForEnum(classDescriptor, psiClass);
|
||||
ClassDescriptorFromJvmBytecode classObjectDescriptor = createClassObjectDescriptorForEnum(classDescriptor, javaClass);
|
||||
cache(getFqNameForClassObject(psiClass), classObjectDescriptor);
|
||||
classDescriptor.getBuilder().setClassObjectDescriptor(classObjectDescriptor);
|
||||
}
|
||||
@@ -497,11 +498,8 @@ public final class JavaClassResolver {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private ClassDescriptorFromJvmBytecode createClassObjectDescriptorForEnum(
|
||||
@NotNull ClassDescriptor containing,
|
||||
@NotNull PsiClass psiClass
|
||||
) {
|
||||
ClassDescriptorFromJvmBytecode classObjectDescriptor = createSyntheticClassObject(containing, psiClass);
|
||||
private ClassDescriptorFromJvmBytecode createClassObjectDescriptorForEnum(@NotNull ClassDescriptor containing, @NotNull JavaClass javaClass) {
|
||||
ClassDescriptorFromJvmBytecode classObjectDescriptor = createSyntheticClassObject(containing, javaClass);
|
||||
|
||||
classObjectDescriptor.getBuilder().addFunctionDescriptor(createEnumClassObjectValuesMethod(classObjectDescriptor, trace));
|
||||
classObjectDescriptor.getBuilder().addFunctionDescriptor(createEnumClassObjectValueOfMethod(classObjectDescriptor, trace));
|
||||
@@ -510,7 +508,7 @@ public final class JavaClassResolver {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private ClassDescriptorFromJvmBytecode createSyntheticClassObject(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
|
||||
private ClassDescriptorFromJvmBytecode createSyntheticClassObject(@NotNull ClassDescriptor containing, @NotNull JavaClass javaClass) {
|
||||
ClassDescriptorFromJvmBytecode classObjectDescriptor =
|
||||
new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT, false);
|
||||
|
||||
@@ -520,7 +518,7 @@ public final class JavaClassResolver {
|
||||
classObjectDescriptor.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList());
|
||||
classObjectDescriptor.createTypeConstructor();
|
||||
|
||||
JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classObjectDescriptor, psiClass, true,
|
||||
JavaClassNonStaticMembersScope scope = new JavaClassNonStaticMembersScope(classObjectDescriptor, javaClass, true,
|
||||
javaDescriptorResolver);
|
||||
WritableScopeImpl writableScope =
|
||||
new WritableScopeImpl(scope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, "Member lookup scope");
|
||||
|
||||
+4
-1
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.java.*;
|
||||
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
@@ -67,7 +68,9 @@ public final class JavaConstructorResolver {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Collection<ConstructorDescriptor> resolveConstructors(@NotNull PsiClass psiClass, @NotNull ClassDescriptor containingClass) {
|
||||
public Collection<ConstructorDescriptor> resolveConstructors(@NotNull JavaClass javaClass, @NotNull ClassDescriptor containingClass) {
|
||||
PsiClass psiClass = javaClass.getPsiClass();
|
||||
|
||||
Collection<ConstructorDescriptor> constructors = Lists.newArrayList();
|
||||
|
||||
List<TypeParameterDescriptor> typeParameters = containingClass.getTypeConstructor().getParameters();
|
||||
|
||||
+22
-19
@@ -22,7 +22,6 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiMember;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -40,6 +39,8 @@ import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap;
|
||||
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
|
||||
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope;
|
||||
import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope;
|
||||
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.vfilefinder.VirtualFileFinder;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
@@ -61,7 +62,7 @@ public final class JavaNamespaceResolver {
|
||||
@NotNull
|
||||
private final Set<FqName> unresolvedCache = Sets.newHashSet();
|
||||
|
||||
private PsiClassFinder psiClassFinder;
|
||||
private JavaClassFinder javaClassFinder;
|
||||
private BindingTrace trace;
|
||||
private JavaDescriptorResolver javaDescriptorResolver;
|
||||
|
||||
@@ -77,8 +78,8 @@ public final class JavaNamespaceResolver {
|
||||
}
|
||||
|
||||
@Inject
|
||||
public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
|
||||
this.psiClassFinder = psiClassFinder;
|
||||
public void setJavaClassFinder(JavaClassFinder javaClassFinder) {
|
||||
this.javaClassFinder = javaClassFinder;
|
||||
}
|
||||
|
||||
@Inject
|
||||
@@ -156,8 +157,8 @@ public final class JavaNamespaceResolver {
|
||||
@NotNull NamespaceDescriptor namespaceDescriptor,
|
||||
boolean record
|
||||
) {
|
||||
PsiPackage psiPackage = psiClassFinder.findPsiPackage(fqName);
|
||||
if (psiPackage != null) {
|
||||
JavaPackage javaPackage = javaClassFinder.findPackage(fqName);
|
||||
if (javaPackage != null) {
|
||||
FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(fqName);
|
||||
VirtualFile virtualFile = virtualFileFinder.find(packageClassFqName);
|
||||
|
||||
@@ -175,19 +176,21 @@ public final class JavaNamespaceResolver {
|
||||
|
||||
// Otherwise (if psiClass is null or doesn't have a supported Kotlin annotation), it's a Java class and the package is empty
|
||||
if (record) {
|
||||
trace.record(BindingContext.NAMESPACE, psiPackage, namespaceDescriptor);
|
||||
trace.record(BindingContext.NAMESPACE, javaPackage.getPsiPackage(), namespaceDescriptor);
|
||||
}
|
||||
|
||||
return new JavaPackageScope(namespaceDescriptor, psiPackage, fqName, javaDescriptorResolver);
|
||||
return new JavaPackageScope(namespaceDescriptor, javaPackage, fqName, javaDescriptorResolver);
|
||||
}
|
||||
|
||||
PsiClass psiClass = psiClassFinder.findPsiClass(fqName);
|
||||
if (psiClass == null) {
|
||||
JavaClass javaClass = javaClassFinder.findClass(fqName);
|
||||
if (javaClass == null) {
|
||||
return null;
|
||||
}
|
||||
if (DescriptorResolverUtils.isCompiledKotlinClassOrPackageClass(psiClass)) {
|
||||
|
||||
if (DescriptorResolverUtils.isCompiledKotlinClassOrPackageClass(javaClass)) {
|
||||
return null;
|
||||
}
|
||||
PsiClass psiClass = javaClass.getPsiClass();
|
||||
if (!hasStaticMembers(psiClass)) {
|
||||
return null;
|
||||
}
|
||||
@@ -198,7 +201,7 @@ public final class JavaNamespaceResolver {
|
||||
trace.record(BindingContext.NAMESPACE, psiClass, namespaceDescriptor);
|
||||
}
|
||||
|
||||
return new JavaClassStaticMembersScope(namespaceDescriptor, fqName, psiClass, javaDescriptorResolver);
|
||||
return new JavaClassStaticMembersScope(namespaceDescriptor, fqName, javaClass, javaDescriptorResolver);
|
||||
}
|
||||
|
||||
private void cache(@NotNull FqName fqName, @Nullable JetScope packageScope) {
|
||||
@@ -248,14 +251,14 @@ public final class JavaNamespaceResolver {
|
||||
|
||||
@NotNull
|
||||
public Collection<Name> getClassNamesInPackage(@NotNull FqName packageName) {
|
||||
PsiPackage psiPackage = psiClassFinder.findPsiPackage(packageName);
|
||||
if (psiPackage == null) return Collections.emptyList();
|
||||
JavaPackage javaPackage = javaClassFinder.findPackage(packageName);
|
||||
if (javaPackage == null) return Collections.emptyList();
|
||||
|
||||
PsiClass[] classes = psiPackage.getClasses();
|
||||
List<Name> result = new ArrayList<Name>(classes.length);
|
||||
for (PsiClass psiClass : classes) {
|
||||
if (DescriptorResolverUtils.isCompiledKotlinClass(psiClass)) {
|
||||
result.add(Name.identifier(psiClass.getName()));
|
||||
Collection<JavaClass> classes = DescriptorResolverUtils.filterDuplicateClasses(javaPackage.getClasses());
|
||||
List<Name> result = new ArrayList<Name>(classes.size());
|
||||
for (JavaClass javaClass : classes) {
|
||||
if (DescriptorResolverUtils.isCompiledKotlinClass(javaClass)) {
|
||||
result.add(Name.identifier(javaClass.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+13
-13
@@ -16,12 +16,12 @@
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java.scope;
|
||||
|
||||
import com.intellij.psi.PsiClass;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -37,18 +37,18 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
|
||||
@NotNull
|
||||
private final ClassDescriptor descriptor;
|
||||
@NotNull
|
||||
private final PsiClass psiClass;
|
||||
private final JavaClass javaClass;
|
||||
private final boolean staticMembersOfPsiClass;
|
||||
|
||||
public JavaClassNonStaticMembersScope(
|
||||
@NotNull ClassDescriptor descriptor,
|
||||
@NotNull PsiClass psiClass,
|
||||
@NotNull JavaClass javaClass,
|
||||
boolean staticMembersOfPsiClass,
|
||||
@NotNull JavaDescriptorResolver javaDescriptorResolver
|
||||
) {
|
||||
super(descriptor, MembersProvider.forClass(psiClass, staticMembersOfPsiClass), javaDescriptorResolver);
|
||||
super(descriptor, MembersProvider.forClass(javaClass, staticMembersOfPsiClass), javaDescriptorResolver);
|
||||
this.descriptor = descriptor;
|
||||
this.psiClass = psiClass;
|
||||
this.javaClass = javaClass;
|
||||
this.staticMembersOfPsiClass = staticMembersOfPsiClass;
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
|
||||
|
||||
private void initConstructorsIfNeeded() {
|
||||
if (constructors == null) {
|
||||
constructors = javaDescriptorResolver.resolveConstructors(psiClass, descriptor);
|
||||
constructors = javaDescriptorResolver.resolveConstructors(javaClass, descriptor);
|
||||
|
||||
for (ConstructorDescriptor constructor : constructors) {
|
||||
if (constructor.isPrimary()) {
|
||||
@@ -88,18 +88,18 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
|
||||
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
|
||||
for (PsiClass innerPsiClass : innerPsiClasses) {
|
||||
result.add(resolveInnerClass(innerPsiClass));
|
||||
Collection<JavaClass> innerClasses = javaClass.getInnerClasses();
|
||||
List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(innerClasses.size());
|
||||
for (JavaClass innerClass : innerClasses) {
|
||||
result.add(resolveInnerClass(innerClass));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private ClassDescriptor resolveInnerClass(@NotNull PsiClass innerPsiClass) {
|
||||
String name = innerPsiClass.getQualifiedName();
|
||||
assert name != null : "Inner class has no qualified name: " + innerPsiClass;
|
||||
private ClassDescriptor resolveInnerClass(@NotNull JavaClass innerClass) {
|
||||
String name = innerClass.getFqName();
|
||||
assert name != null : "Inner class has no qualified name: " + innerClass;
|
||||
ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(new FqName(name), IGNORE_KOTLIN_SOURCES);
|
||||
assert classDescriptor != null : "Couldn't resolve inner class " + name;
|
||||
return classDescriptor;
|
||||
|
||||
+6
-6
@@ -16,13 +16,13 @@
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java.scope;
|
||||
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
|
||||
@@ -35,17 +35,17 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
|
||||
@NotNull
|
||||
private final FqName packageFQN;
|
||||
@NotNull
|
||||
private final PsiClass psiClass;
|
||||
private final JavaClass javaClass;
|
||||
|
||||
public JavaClassStaticMembersScope(
|
||||
@NotNull NamespaceDescriptor descriptor,
|
||||
@NotNull FqName packageFQN,
|
||||
@NotNull PsiClass psiClass,
|
||||
@NotNull JavaClass javaClass,
|
||||
@NotNull JavaDescriptorResolver javaDescriptorResolver
|
||||
) {
|
||||
super(descriptor, MembersProvider.forClass(psiClass, true), javaDescriptorResolver);
|
||||
super(descriptor, MembersProvider.forClass(javaClass, true), javaDescriptorResolver);
|
||||
this.packageFQN = packageFQN;
|
||||
this.psiClass = psiClass;
|
||||
this.javaClass = javaClass;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -57,7 +57,7 @@ public final class JavaClassStaticMembersScope extends JavaClassMembersScope {
|
||||
@Override
|
||||
protected Collection<DeclarationDescriptor> computeAllDescriptors() {
|
||||
Collection<DeclarationDescriptor> result = super.computeAllDescriptors();
|
||||
for (PsiClass nested : psiClass.getInnerClasses()) {
|
||||
for (JavaClass nested : javaClass.getInnerClasses()) {
|
||||
ContainerUtil.addIfNotNull(result, getNamespace(Name.identifier(nested.getName())));
|
||||
}
|
||||
return result;
|
||||
|
||||
+17
-13
@@ -18,15 +18,15 @@ package org.jetbrains.jet.lang.resolve.java.scope;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.openapi.progress.ProgressIndicatorProvider;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.java.JetJavaMirrorMarker;
|
||||
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
|
||||
@@ -39,18 +39,18 @@ import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.INCLUDE_K
|
||||
|
||||
public final class JavaPackageScope extends JavaBaseScope {
|
||||
@NotNull
|
||||
private final PsiPackage psiPackage;
|
||||
private final JavaPackage javaPackage;
|
||||
@NotNull
|
||||
private final FqName packageFQN;
|
||||
|
||||
public JavaPackageScope(
|
||||
@NotNull NamespaceDescriptor descriptor,
|
||||
@NotNull PsiPackage psiPackage,
|
||||
@NotNull JavaPackage javaPackage,
|
||||
@NotNull FqName packageFQN,
|
||||
@NotNull JavaDescriptorResolver javaDescriptorResolver
|
||||
) {
|
||||
super(descriptor, javaDescriptorResolver, MembersProvider.forPackage(psiPackage));
|
||||
this.psiPackage = psiPackage;
|
||||
super(descriptor, javaDescriptorResolver, MembersProvider.forPackage(javaPackage));
|
||||
this.javaPackage = javaPackage;
|
||||
this.packageFQN = packageFQN;
|
||||
}
|
||||
|
||||
@@ -89,24 +89,24 @@ public final class JavaPackageScope extends JavaBaseScope {
|
||||
private Collection<DeclarationDescriptor> computeAllPackageDeclarations() {
|
||||
Collection<DeclarationDescriptor> result = Sets.newHashSet();
|
||||
|
||||
for (PsiPackage psiSubPackage : psiPackage.getSubPackages()) {
|
||||
FqName fqName = new FqName(psiSubPackage.getQualifiedName());
|
||||
for (JavaPackage subPackage : javaPackage.getSubPackages()) {
|
||||
FqName fqName = new FqName(subPackage.getFqName());
|
||||
NamespaceDescriptor childNs = javaDescriptorResolver.resolveNamespace(fqName, IGNORE_KOTLIN_SOURCES);
|
||||
if (childNs != null) {
|
||||
result.add(childNs);
|
||||
}
|
||||
}
|
||||
|
||||
for (PsiClass psiClass : DescriptorResolverUtils.filterDuplicateClasses(psiPackage.getClasses())) {
|
||||
if (DescriptorResolverUtils.isCompiledKotlinPackageClass(psiClass)) continue;
|
||||
for (JavaClass javaClass : DescriptorResolverUtils.filterDuplicateClasses(javaPackage.getClasses())) {
|
||||
if (DescriptorResolverUtils.isCompiledKotlinPackageClass(javaClass)) continue;
|
||||
|
||||
if (psiClass instanceof JetJavaMirrorMarker) continue;
|
||||
if (isKotlinLightClass(javaClass)) continue;
|
||||
|
||||
if (!psiClass.hasModifierProperty(PsiModifier.PUBLIC)) continue;
|
||||
if (!javaClass.getPsiClass().hasModifierProperty(PsiModifier.PUBLIC)) continue;
|
||||
|
||||
ProgressIndicatorProvider.checkCanceled();
|
||||
|
||||
String qualifiedName = psiClass.getQualifiedName();
|
||||
String qualifiedName = javaClass.getFqName();
|
||||
if (qualifiedName == null) continue;
|
||||
FqName fqName = new FqName(qualifiedName);
|
||||
|
||||
@@ -124,6 +124,10 @@ public final class JavaPackageScope extends JavaBaseScope {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static boolean isKotlinLightClass(@NotNull JavaClass javaClass) {
|
||||
return javaClass.getPsiClass() instanceof JetJavaMirrorMarker;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
protected Set<FunctionDescriptor> computeFunctionDescriptor(@NotNull Name name) {
|
||||
|
||||
+12
-12
@@ -16,37 +16,37 @@
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java.scope;
|
||||
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.resolve.java.provider.MembersCache;
|
||||
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/* package */ class MembersProvider {
|
||||
@Nullable
|
||||
private final PsiClass psiClass;
|
||||
private final JavaClass javaClass;
|
||||
@Nullable
|
||||
private final PsiPackage psiPackage;
|
||||
private final JavaPackage javaPackage;
|
||||
private final boolean staticMembers;
|
||||
|
||||
private MembersProvider(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, boolean staticMembers) {
|
||||
this.psiClass = psiClass;
|
||||
this.psiPackage = psiPackage;
|
||||
private MembersProvider(@Nullable JavaClass javaClass, @Nullable JavaPackage javaPackage, boolean staticMembers) {
|
||||
this.javaClass = javaClass;
|
||||
this.javaPackage = javaPackage;
|
||||
this.staticMembers = staticMembers;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static MembersProvider forPackage(@NotNull PsiPackage psiPackage) {
|
||||
return new MembersProvider(null, psiPackage, true);
|
||||
public static MembersProvider forPackage(@NotNull JavaPackage javaPackage) {
|
||||
return new MembersProvider(null, javaPackage, true);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static MembersProvider forClass(@NotNull PsiClass psiClass, boolean staticMembers) {
|
||||
return new MembersProvider(psiClass, null, staticMembers);
|
||||
public static MembersProvider forClass(@NotNull JavaClass javaClass, boolean staticMembers) {
|
||||
return new MembersProvider(javaClass, null, staticMembers);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -63,7 +63,7 @@ import java.util.Collection;
|
||||
@NotNull
|
||||
private MembersCache getMembersCache() {
|
||||
if (membersCache == null) {
|
||||
membersCache = MembersCache.buildMembersByNameCache(psiClass, psiPackage, staticMembers);
|
||||
membersCache = MembersCache.buildMembersByNameCache(javaClass, javaPackage, staticMembers);
|
||||
}
|
||||
return membersCache;
|
||||
}
|
||||
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2010-2013 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java.structure;
|
||||
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class JavaAnnotation {
|
||||
private final PsiAnnotation psiAnnotation;
|
||||
|
||||
public JavaAnnotation(@NotNull PsiAnnotation psiAnnotation) {
|
||||
this.psiAnnotation = psiAnnotation;
|
||||
}
|
||||
}
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright 2010-2013 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java.structure;
|
||||
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiModifierList;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public class JavaClass {
|
||||
private final PsiClass psiClass;
|
||||
|
||||
public JavaClass(@NotNull PsiClass psiClass) {
|
||||
this.psiClass = psiClass;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public PsiClass getPsiClass() {
|
||||
return psiClass;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
/* package */ static Collection<JavaClass> javaClassesFromPsi(@NotNull PsiClass[] classes) {
|
||||
List<JavaClass> result = new ArrayList<JavaClass>(classes.length);
|
||||
for (PsiClass psiClass : classes) {
|
||||
result.add(new JavaClass(psiClass));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Collection<JavaClass> getInnerClasses() {
|
||||
return javaClassesFromPsi(psiClass.getInnerClasses());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getFqName() {
|
||||
return psiClass.getQualifiedName();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public JavaAnnotation findAnnotation(@NotNull String fqName) {
|
||||
PsiModifierList modifierList = psiClass.getModifierList();
|
||||
if (modifierList != null) {
|
||||
PsiAnnotation annotation = modifierList.findAnnotation(fqName);
|
||||
if (annotation != null) {
|
||||
return new JavaAnnotation(annotation);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getName() {
|
||||
return psiClass.getName();
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright 2010-2013 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.jet.lang.resolve.java.structure;
|
||||
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public class JavaPackage {
|
||||
private final PsiPackage psiPackage;
|
||||
|
||||
public JavaPackage(@NotNull PsiPackage psiPackage) {
|
||||
this.psiPackage = psiPackage;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public PsiPackage getPsiPackage() {
|
||||
return psiPackage;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static Collection<JavaPackage> javaPackagesFromPsi(@NotNull PsiPackage[] packages) {
|
||||
List<JavaPackage> result = new ArrayList<JavaPackage>(packages.length);
|
||||
for (PsiPackage psiPackage : packages) {
|
||||
result.add(new JavaPackage(psiPackage));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Collection<JavaClass> getClasses() {
|
||||
return JavaClass.javaClassesFromPsi(psiPackage.getClasses());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Collection<JavaPackage> getSubPackages() {
|
||||
return javaPackagesFromPsi(psiPackage.getSubPackages());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getFqName() {
|
||||
return psiPackage.getQualifiedName();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getName() {
|
||||
String name = psiPackage.getName();
|
||||
return name == null ? "" : name;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user