PsiClassFinder
This commit is contained in:
@@ -21,6 +21,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
|
|||||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm;
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
|
import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
|
||||||
@@ -34,6 +35,7 @@ public class InjectorForJavaSemanticServices {
|
|||||||
private JavaSemanticServices javaSemanticServices;
|
private JavaSemanticServices javaSemanticServices;
|
||||||
private JavaDescriptorResolver javaDescriptorResolver;
|
private JavaDescriptorResolver javaDescriptorResolver;
|
||||||
private BindingTrace bindingTrace;
|
private BindingTrace bindingTrace;
|
||||||
|
private PsiClassFinderForJvm psiClassFinderForJvm;
|
||||||
private final Project project;
|
private final Project project;
|
||||||
|
|
||||||
public InjectorForJavaSemanticServices(
|
public InjectorForJavaSemanticServices(
|
||||||
@@ -43,23 +45,28 @@ public class InjectorForJavaSemanticServices {
|
|||||||
this.javaDescriptorResolver = new JavaDescriptorResolver();
|
this.javaDescriptorResolver = new JavaDescriptorResolver();
|
||||||
this.bindingTrace = new org.jetbrains.jet.lang.resolve.BindingTraceContext();
|
this.bindingTrace = new org.jetbrains.jet.lang.resolve.BindingTraceContext();
|
||||||
JavaBridgeConfiguration javaBridgeConfiguration = new JavaBridgeConfiguration();
|
JavaBridgeConfiguration javaBridgeConfiguration = new JavaBridgeConfiguration();
|
||||||
|
this.psiClassFinderForJvm = new PsiClassFinderForJvm();
|
||||||
ModuleDescriptor moduleDescriptor = new org.jetbrains.jet.lang.descriptors.ModuleDescriptor("<dummy>");
|
ModuleDescriptor moduleDescriptor = new org.jetbrains.jet.lang.descriptors.ModuleDescriptor("<dummy>");
|
||||||
this.project = project;
|
this.project = project;
|
||||||
JavaTypeTransformer javaTypeTransformer = new JavaTypeTransformer();
|
JavaTypeTransformer javaTypeTransformer = new JavaTypeTransformer();
|
||||||
NamespaceFactoryImpl namespaceFactoryImpl = new NamespaceFactoryImpl();
|
NamespaceFactoryImpl namespaceFactoryImpl = new NamespaceFactoryImpl();
|
||||||
|
|
||||||
this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
||||||
|
this.javaSemanticServices.setPsiClassFinder(psiClassFinderForJvm);
|
||||||
this.javaSemanticServices.setTrace(bindingTrace);
|
this.javaSemanticServices.setTrace(bindingTrace);
|
||||||
this.javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
this.javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
||||||
|
|
||||||
this.javaDescriptorResolver.setNamespaceFactory(namespaceFactoryImpl);
|
this.javaDescriptorResolver.setNamespaceFactory(namespaceFactoryImpl);
|
||||||
this.javaDescriptorResolver.setProject(project);
|
this.javaDescriptorResolver.setProject(project);
|
||||||
|
this.javaDescriptorResolver.setPsiClassFinder(psiClassFinderForJvm);
|
||||||
this.javaDescriptorResolver.setSemanticServices(javaSemanticServices);
|
this.javaDescriptorResolver.setSemanticServices(javaSemanticServices);
|
||||||
this.javaDescriptorResolver.setTrace(bindingTrace);
|
this.javaDescriptorResolver.setTrace(bindingTrace);
|
||||||
|
|
||||||
javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices);
|
javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices);
|
||||||
javaBridgeConfiguration.setProject(project);
|
javaBridgeConfiguration.setProject(project);
|
||||||
|
|
||||||
|
this.psiClassFinderForJvm.setProject(project);
|
||||||
|
|
||||||
javaTypeTransformer.setJavaSemanticServices(javaSemanticServices);
|
javaTypeTransformer.setJavaSemanticServices(javaSemanticServices);
|
||||||
javaTypeTransformer.setResolver(javaDescriptorResolver);
|
javaTypeTransformer.setResolver(javaDescriptorResolver);
|
||||||
|
|
||||||
@@ -81,6 +88,10 @@ public class InjectorForJavaSemanticServices {
|
|||||||
return this.bindingTrace;
|
return this.bindingTrace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PsiClassFinderForJvm getPsiClassFinderForJvm() {
|
||||||
|
return this.psiClassFinderForJvm;
|
||||||
|
}
|
||||||
|
|
||||||
public Project getProject() {
|
public Project getProject() {
|
||||||
return this.project;
|
return this.project;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
|
|||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||||
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm;
|
||||||
import org.jetbrains.jet.lang.resolve.DeclarationResolver;
|
import org.jetbrains.jet.lang.resolve.DeclarationResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
|
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
||||||
@@ -82,6 +83,7 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
||||||
this.observableBindingTrace = observableBindingTrace;
|
this.observableBindingTrace = observableBindingTrace;
|
||||||
this.javaBridgeConfiguration = new JavaBridgeConfiguration();
|
this.javaBridgeConfiguration = new JavaBridgeConfiguration();
|
||||||
|
PsiClassFinderForJvm psiClassFinderForJvm = new PsiClassFinderForJvm();
|
||||||
DeclarationResolver declarationResolver = new DeclarationResolver();
|
DeclarationResolver declarationResolver = new DeclarationResolver();
|
||||||
AnnotationResolver annotationResolver = new AnnotationResolver();
|
AnnotationResolver annotationResolver = new AnnotationResolver();
|
||||||
CallResolver callResolver = new CallResolver();
|
CallResolver callResolver = new CallResolver();
|
||||||
@@ -136,6 +138,8 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
this.javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices);
|
this.javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices);
|
||||||
this.javaBridgeConfiguration.setProject(project);
|
this.javaBridgeConfiguration.setProject(project);
|
||||||
|
|
||||||
|
psiClassFinderForJvm.setProject(project);
|
||||||
|
|
||||||
declarationResolver.setAnnotationResolver(annotationResolver);
|
declarationResolver.setAnnotationResolver(annotationResolver);
|
||||||
declarationResolver.setContext(topDownAnalysisContext);
|
declarationResolver.setContext(topDownAnalysisContext);
|
||||||
declarationResolver.setDescriptorResolver(descriptorResolver);
|
declarationResolver.setDescriptorResolver(descriptorResolver);
|
||||||
@@ -183,11 +187,13 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
typeHierarchyResolver.setTrace(observableBindingTrace);
|
typeHierarchyResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
||||||
|
javaSemanticServices.setPsiClassFinder(psiClassFinderForJvm);
|
||||||
javaSemanticServices.setTrace(observableBindingTrace);
|
javaSemanticServices.setTrace(observableBindingTrace);
|
||||||
javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
||||||
|
|
||||||
javaDescriptorResolver.setNamespaceFactory(namespaceFactoryImpl);
|
javaDescriptorResolver.setNamespaceFactory(namespaceFactoryImpl);
|
||||||
javaDescriptorResolver.setProject(project);
|
javaDescriptorResolver.setProject(project);
|
||||||
|
javaDescriptorResolver.setPsiClassFinder(psiClassFinderForJvm);
|
||||||
javaDescriptorResolver.setSemanticServices(javaSemanticServices);
|
javaDescriptorResolver.setSemanticServices(javaSemanticServices);
|
||||||
javaDescriptorResolver.setTrace(observableBindingTrace);
|
javaDescriptorResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
|
|||||||
+10
-43
@@ -191,25 +191,15 @@ public class JavaDescriptorResolver {
|
|||||||
protected final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
|
protected final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
|
||||||
protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();
|
protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();
|
||||||
|
|
||||||
protected JavaPsiFacade javaFacade;
|
|
||||||
protected Project project;
|
protected Project project;
|
||||||
protected GlobalSearchScope javaSearchScope ;
|
|
||||||
protected JavaSemanticServices semanticServices;
|
protected JavaSemanticServices semanticServices;
|
||||||
private AltClassFinder altClassFinder;
|
|
||||||
private NamespaceFactory namespaceFactory;
|
private NamespaceFactory namespaceFactory;
|
||||||
private BindingTrace trace;
|
private BindingTrace trace;
|
||||||
|
private PsiClassFinder psiClassFinder;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setProject(Project project) {
|
public void setProject(Project project) {
|
||||||
this.project = project;
|
this.project = project;
|
||||||
this.altClassFinder = new AltClassFinder(project);
|
|
||||||
this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) {
|
|
||||||
@Override
|
|
||||||
public boolean contains(VirtualFile file) {
|
|
||||||
return myBaseScope.contains(file) && file.getFileType() != JetFileType.INSTANCE;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
this.javaFacade = JavaPsiFacade.getInstance(project);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -227,7 +217,10 @@ public class JavaDescriptorResolver {
|
|||||||
this.trace = trace;
|
this.trace = trace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
|
||||||
|
this.psiClassFinder = psiClassFinder;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
ResolverClassData resolveClassData(@NotNull PsiClass psiClass, @NotNull DescriptorSearchRule searchRule) {
|
ResolverClassData resolveClassData(@NotNull PsiClass psiClass, @NotNull DescriptorSearchRule searchRule) {
|
||||||
@@ -313,7 +306,7 @@ public class JavaDescriptorResolver {
|
|||||||
// Not let's take a descriptor of a Java class
|
// Not let's take a descriptor of a Java class
|
||||||
ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
|
ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
|
||||||
if (classData == null) {
|
if (classData == null) {
|
||||||
PsiClass psiClass = findClass(qualifiedName);
|
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName);
|
||||||
if (psiClass == null) {
|
if (psiClass == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -752,7 +745,8 @@ public class JavaDescriptorResolver {
|
|||||||
List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
|
List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
|
||||||
for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
|
for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
|
||||||
prevTypeParameters.add(psiTypeParameter.descriptor);
|
prevTypeParameters.add(psiTypeParameter.descriptor);
|
||||||
initializeTypeParameter(psiTypeParameter, TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
|
initializeTypeParameter(psiTypeParameter,
|
||||||
|
TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -839,42 +833,15 @@ public class JavaDescriptorResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PsiPackage psiPackage = findPackage(qualifiedName);
|
PsiPackage psiPackage = psiClassFinder.findPsiPackage(qualifiedName);
|
||||||
if (psiPackage == null) {
|
if (psiPackage == null) {
|
||||||
PsiClass psiClass = findClass(qualifiedName);
|
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName);
|
||||||
if (psiClass == null) return null;
|
if (psiClass == null) return null;
|
||||||
return resolveNamespace(psiClass);
|
return resolveNamespace(psiClass);
|
||||||
}
|
}
|
||||||
return resolveNamespace(psiPackage);
|
return resolveNamespace(psiPackage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public PsiClass findClass(@NotNull FqName qualifiedName) {
|
|
||||||
PsiClass original = javaFacade.findClass(qualifiedName.getFqName(), javaSearchScope);
|
|
||||||
PsiClass altClass = altClassFinder.findClass(qualifiedName);
|
|
||||||
PsiClass result = original;
|
|
||||||
if (altClass != null) {
|
|
||||||
if (altClass instanceof ClsClassImpl) {
|
|
||||||
altClass.putUserData(ClsClassImpl.DELEGATE_KEY, original);
|
|
||||||
}
|
|
||||||
|
|
||||||
result = altClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result != null) {
|
|
||||||
FqName actualQualifiedName = new FqName(result.getQualifiedName());
|
|
||||||
if (!actualQualifiedName.equals(qualifiedName)) {
|
|
||||||
// throw new IllegalStateException("requested " + qualifiedName + ", got " + actualQualifiedName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*package*/ PsiPackage findPackage(@NotNull FqName qualifiedName) {
|
|
||||||
return javaFacade.findPackage(qualifiedName.getFqName());
|
|
||||||
}
|
|
||||||
|
|
||||||
private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
|
private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
|
||||||
ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
|
ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
|
||||||
if (namespaceData == null) {
|
if (namespaceData == null) {
|
||||||
|
|||||||
+2
-2
@@ -60,7 +60,7 @@ public class JavaPackageScope extends JavaClassOrPackageScope {
|
|||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
// TODO: what is GlobalSearchScope
|
// TODO: what is GlobalSearchScope
|
||||||
return semanticServices.getDescriptorResolver().javaFacade.findClass(getQualifiedName(packageFQN, JvmAbi.PACKAGE_CLASS).getFqName());
|
return semanticServices.getPsiClassFinder().findPsiClass(getQualifiedName(packageFQN, JvmAbi.PACKAGE_CLASS));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ public class JavaPackageScope extends JavaClassOrPackageScope {
|
|||||||
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(descriptor, psiClass, staticMembers()));
|
allDescriptors.addAll(semanticServices.getDescriptorResolver().resolveFieldGroup(descriptor, psiClass, staticMembers()));
|
||||||
}
|
}
|
||||||
|
|
||||||
final PsiPackage javaPackage = semanticServices.getDescriptorResolver().findPackage(packageFQN);
|
final PsiPackage javaPackage = semanticServices.getPsiClassFinder().findPsiPackage(packageFQN);
|
||||||
|
|
||||||
if (javaPackage != null) {
|
if (javaPackage != null) {
|
||||||
boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(new FqName(javaPackage.getQualifiedName())) != null;
|
boolean isKotlinNamespace = semanticServices.getKotlinNamespaceDescriptor(new FqName(javaPackage.getQualifiedName())) != null;
|
||||||
|
|||||||
+14
@@ -37,6 +37,8 @@ public class JavaSemanticServices {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private JavaDescriptorResolver descriptorResolver;
|
private JavaDescriptorResolver descriptorResolver;
|
||||||
@NotNull
|
@NotNull
|
||||||
|
private PsiClassFinder psiClassFinder;
|
||||||
|
@NotNull
|
||||||
private BindingTrace trace;
|
private BindingTrace trace;
|
||||||
|
|
||||||
|
|
||||||
@@ -50,6 +52,11 @@ public class JavaSemanticServices {
|
|||||||
this.descriptorResolver = descriptorResolver;
|
this.descriptorResolver = descriptorResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setPsiClassFinder(@NotNull PsiClassFinder psiClassFinder) {
|
||||||
|
this.psiClassFinder = psiClassFinder;
|
||||||
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setTrace(@NotNull BindingTrace trace) {
|
public void setTrace(@NotNull BindingTrace trace) {
|
||||||
this.trace = trace;
|
this.trace = trace;
|
||||||
@@ -72,6 +79,13 @@ public class JavaSemanticServices {
|
|||||||
return trace.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, qualifiedName);
|
return trace.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, qualifiedName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public PsiClassFinder getPsiClassFinder() {
|
||||||
|
return psiClassFinder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public ClassDescriptor getKotlinBuiltinClassDescriptor(@NotNull FqName qualifiedName) {
|
public ClassDescriptor getKotlinBuiltinClassDescriptor(@NotNull FqName qualifiedName) {
|
||||||
if (qualifiedName.getFqName().startsWith("jet.")) {
|
if (qualifiedName.getFqName().startsWith("jet.")) {
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 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.FqName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Stepan Koltsov
|
||||||
|
*/
|
||||||
|
public interface PsiClassFinder {
|
||||||
|
@Nullable
|
||||||
|
PsiClass findPsiClass(@NotNull FqName fqName);
|
||||||
|
@Nullable
|
||||||
|
PsiPackage findPsiPackage(@NotNull FqName fqName);
|
||||||
|
}
|
||||||
+93
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 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.openapi.project.Project;
|
||||||
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
|
import com.intellij.psi.JavaPsiFacade;
|
||||||
|
import com.intellij.psi.PsiClass;
|
||||||
|
import com.intellij.psi.PsiPackage;
|
||||||
|
import com.intellij.psi.impl.compiled.ClsClassImpl;
|
||||||
|
import com.intellij.psi.search.DelegatingGlobalSearchScope;
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope;
|
||||||
|
import com.intellij.psi.search.SearchScope;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.lang.resolve.FqName;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder;
|
||||||
|
import org.jetbrains.jet.plugin.JetFileType;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Stepan Koltsov
|
||||||
|
*/
|
||||||
|
public class PsiClassFinderForJvm implements PsiClassFinder {
|
||||||
|
|
||||||
|
private Project project;
|
||||||
|
private AltClassFinder altClassFinder;
|
||||||
|
private GlobalSearchScope javaSearchScope;
|
||||||
|
private JavaPsiFacade javaFacade;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setProject(Project project) {
|
||||||
|
this.project = project;
|
||||||
|
this.altClassFinder = new AltClassFinder(project);
|
||||||
|
this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) {
|
||||||
|
@Override
|
||||||
|
public boolean contains(VirtualFile file) {
|
||||||
|
return myBaseScope.contains(file) && file.getFileType() != JetFileType.INSTANCE;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.javaFacade = JavaPsiFacade.getInstance(project);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Nullable
|
||||||
|
public PsiClass findPsiClass(@NotNull FqName qualifiedName) {
|
||||||
|
PsiClass original = javaFacade.findClass(qualifiedName.getFqName(), javaSearchScope);
|
||||||
|
PsiClass altClass = altClassFinder.findClass(qualifiedName);
|
||||||
|
PsiClass result = original;
|
||||||
|
if (altClass != null) {
|
||||||
|
if (altClass instanceof ClsClassImpl) {
|
||||||
|
altClass.putUserData(ClsClassImpl.DELEGATE_KEY, original);
|
||||||
|
}
|
||||||
|
|
||||||
|
result = altClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != null) {
|
||||||
|
FqName actualQualifiedName = new FqName(result.getQualifiedName());
|
||||||
|
if (!actualQualifiedName.equals(qualifiedName)) {
|
||||||
|
// throw new IllegalStateException("requested " + qualifiedName + ", got " + actualQualifiedName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Nullable
|
||||||
|
public PsiPackage findPsiPackage(@NotNull FqName qualifiedName) {
|
||||||
|
return javaFacade.findPackage(qualifiedName.getFqName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -123,8 +123,8 @@ public class JetResolveTest extends ExtensibleResolveTestCase {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private PsiClass findClass(String qualifiedName) {
|
private PsiClass findClass(String qualifiedName) {
|
||||||
Project project = getProject();
|
Project project = getProject();
|
||||||
JavaDescriptorResolver javaDescriptorResolver = new InjectorForJavaSemanticServices(project).getJavaDescriptorResolver();
|
InjectorForJavaSemanticServices injector = new InjectorForJavaSemanticServices(project);
|
||||||
return javaDescriptorResolver.findClass(new FqName(qualifiedName));
|
return injector.getPsiClassFinderForJvm().findPsiClass(new FqName(qualifiedName));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
|||||||
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
|
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm;
|
||||||
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
|
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
|
||||||
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||||
|
|
||||||
@@ -64,6 +65,7 @@ public class AllInjectorsGenerator {
|
|||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator(false);
|
DependencyInjectorGenerator generator = new DependencyInjectorGenerator(false);
|
||||||
generateInjectorForTopDownAnalyzerCommon(generator);
|
generateInjectorForTopDownAnalyzerCommon(generator);
|
||||||
generator.addPublicField(JavaBridgeConfiguration.class);
|
generator.addPublicField(JavaBridgeConfiguration.class);
|
||||||
|
generator.addField(PsiClassFinderForJvm.class);
|
||||||
generator.generate("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJvm");
|
generator.generate("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJvm");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,6 +123,7 @@ public class AllInjectorsGenerator {
|
|||||||
generator.addField(true, BindingTrace.class, null,
|
generator.addField(true, BindingTrace.class, null,
|
||||||
new GivenExpression("new org.jetbrains.jet.lang.resolve.BindingTraceContext()"));
|
new GivenExpression("new org.jetbrains.jet.lang.resolve.BindingTraceContext()"));
|
||||||
generator.addField(JavaBridgeConfiguration.class);
|
generator.addField(JavaBridgeConfiguration.class);
|
||||||
|
generator.addPublicField(PsiClassFinderForJvm.class);
|
||||||
generator.addField(false, ModuleDescriptor.class, null,
|
generator.addField(false, ModuleDescriptor.class, null,
|
||||||
new GivenExpression("new org.jetbrains.jet.lang.descriptors.ModuleDescriptor(\"<dummy>\")"));
|
new GivenExpression("new org.jetbrains.jet.lang.descriptors.ModuleDescriptor(\"<dummy>\")"));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user