Skip to content

Commit

Permalink
When resolving dependencies by name, use scopes, not PSI
Browse files Browse the repository at this point in the history
  • Loading branch information
abreslav committed Mar 28, 2013
1 parent 630ea70 commit c1b069b
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 40 deletions.
Expand Up @@ -86,10 +86,10 @@ public InjectorForJavaDescriptorResolver(
this.subModuleDescriptor = subModuleDescriptor;
this.globalSearchScope = globalSearchScope;
this.javaBridgeConfiguration = new JavaBridgeConfiguration();
this.psiClassFinder = new PsiClassFinderImpl(getProject(), globalSearchScope);
this.javaDependencyByQualifiedNameResolver = new JavaDependencyByQualifiedNameResolver(getPsiClassFinder(), javaClassResolutionFacade);
this.javaDependencyByQualifiedNameResolver = new JavaDependencyByQualifiedNameResolver(subModuleDescriptor);
this.javaDescriptorResolver = new JavaDescriptorResolver();
this.javaClassResolver = new JavaClassResolver();
this.psiClassFinder = new PsiClassFinderImpl(getProject(), globalSearchScope);
this.javaConstructorResolver = new JavaConstructorResolver();
this.javaTypeTransformer = new JavaTypeTransformer();
this.javaValueParameterResolver = new JavaValueParameterResolver();
Expand Down Expand Up @@ -127,6 +127,7 @@ public InjectorForJavaDescriptorResolver(

javaTypeTransformer.setClassResolutionFacade(javaClassResolutionFacade);
javaTypeTransformer.setProject(project);
javaTypeTransformer.setSubModule(subModuleDescriptor);

javaValueParameterResolver.setTypeTransformer(javaTypeTransformer);

Expand Down Expand Up @@ -159,7 +160,7 @@ public InjectorForJavaDescriptorResolver(

javaSupertypeResolver.setClassResolver(javaClassResolver);
javaSupertypeResolver.setProject(project);
javaSupertypeResolver.setSemanticServices(javaClassResolutionFacade);
javaSupertypeResolver.setSubModule(subModuleDescriptor);
javaSupertypeResolver.setTrace(bindingTrace);
javaSupertypeResolver.setTypeTransformer(javaTypeTransformer);

Expand Down
Expand Up @@ -83,14 +83,14 @@ public InjectorForJavaSemanticServices(
this.javaDescriptorResolver = new JavaDescriptorResolver();
this.bindingTrace = new org.jetbrains.jet.lang.resolve.BindingTraceContext();
this.javaBridgeConfiguration = new JavaBridgeConfiguration();
this.subModuleDescriptor = subModuleDescriptor;
this.javaDependencyByQualifiedNameResolver = new JavaDependencyByQualifiedNameResolver(subModuleDescriptor);
this.project = project;
this.globalSearchScope = globalSearchScope;
this.psiClassFinder = new PsiClassFinderImpl(getProject(), globalSearchScope);
this.javaClassResolutionFacade = javaClassResolutionFacade;
this.javaDependencyByQualifiedNameResolver = new JavaDependencyByQualifiedNameResolver(getPsiClassFinder(), javaClassResolutionFacade);
this.moduleDescriptor = new org.jetbrains.jet.lang.descriptors.impl.MutableModuleDescriptor(org.jetbrains.jet.lang.resolve.name.Name.special("<dummy>"), org.jetbrains.jet.lang.resolve.java.JavaToKotlinClassMap.getInstance());
this.javaClassResolutionFacade = javaClassResolutionFacade;
this.storageManager = storageManager;
this.subModuleDescriptor = subModuleDescriptor;
this.javaClassResolver = new JavaClassResolver();
this.javaAnnotationResolver = new JavaAnnotationResolver();
this.javaCompileTimeConstResolver = new JavaCompileTimeConstResolver();
Expand Down Expand Up @@ -136,12 +136,13 @@ public InjectorForJavaSemanticServices(

javaSupertypeResolver.setClassResolver(javaClassResolver);
javaSupertypeResolver.setProject(project);
javaSupertypeResolver.setSemanticServices(javaClassResolutionFacade);
javaSupertypeResolver.setSubModule(subModuleDescriptor);
javaSupertypeResolver.setTrace(bindingTrace);
javaSupertypeResolver.setTypeTransformer(javaTypeTransformer);

javaTypeTransformer.setClassResolutionFacade(javaClassResolutionFacade);
javaTypeTransformer.setProject(project);
javaTypeTransformer.setSubModule(subModuleDescriptor);

javaSignatureResolver.setDependencyClassByQualifiedNameResolver(javaDependencyByQualifiedNameResolver);
javaSignatureResolver.setTypeTransformer(javaTypeTransformer);
Expand Down
Expand Up @@ -16,44 +16,71 @@

package org.jetbrains.jet.lang.resolve.java;

import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.SubModuleDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.ChainedScope;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver;

public class JavaDependencyByQualifiedNameResolver implements DependencyClassByQualifiedNameResolver {
import java.util.Iterator;

@NotNull
public static JavaDependencyByQualifiedNameResolver createFromSearchScope(
@NotNull Project project,
@NotNull GlobalSearchScope searchScope,
@NotNull JavaClassResolutionFacade classResolutionFacade
) {
return new JavaDependencyByQualifiedNameResolver(new PsiClassFinderImpl(project, searchScope), classResolutionFacade);
}
public class JavaDependencyByQualifiedNameResolver implements DependencyClassByQualifiedNameResolver {

private final PsiClassFinder psiClassFinder;
private final JavaClassResolutionFacade classResolutionFacade;
private final JetScope rootScope;

public JavaDependencyByQualifiedNameResolver(
@NotNull PsiClassFinder psiClassFinder,
@NotNull JavaClassResolutionFacade classResolutionFacade
) {
this.psiClassFinder = psiClassFinder;
this.classResolutionFacade = classResolutionFacade;
public JavaDependencyByQualifiedNameResolver(@NotNull SubModuleDescriptor subModule) {
this.rootScope = DescriptorUtils.getRootPackage(subModule).getMemberScope();
}

@Nullable
@Override
public ClassDescriptor resolveClass(@NotNull FqName fqName) {
PsiClass psiClass = psiClassFinder.findPsiClass(fqName);
if (psiClass == null) {
return null;
assert !fqName.isRoot() : "A class can not have an empty fqName";

if (fqName.parent().isRoot()) {
return getClass(rootScope, fqName.shortName());
}

JetScope currentScope = rootScope;
for (Iterator<Name> iterator = fqName.pathSegments().iterator(); iterator.hasNext(); ) {
Name name = iterator.next();

ClassDescriptor classDescriptor = getClass(currentScope, name);
if (!iterator.hasNext()) return classDescriptor;

PackageViewDescriptor packageView = currentScope.getPackage(name);


if (packageView == null && classDescriptor == null) {
return null;
}
if (packageView != null && classDescriptor != null) {
currentScope = new ChainedScope(null, packageView.getMemberScope(), classDescriptor.getUnsubstitutedInnerClassesScope());
}
else if (packageView != null) {
currentScope = packageView.getMemberScope();
}
else {
currentScope = classDescriptor.getUnsubstitutedInnerClassesScope();
}
}

return null;
}

@Nullable
private static ClassDescriptor getClass(@NotNull JetScope scope, @NotNull Name name) {
ClassifierDescriptor classifier = scope.getClassifier(name);
if (classifier != null) {
assert classifier instanceof ClassDescriptor : "Only classes should appear as classifiers in this context: " + classifier;
}
return classResolutionFacade.getClassDescriptor(psiClass);
return (ClassDescriptor) classifier;
}
}
Expand Up @@ -24,6 +24,7 @@
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.SubModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
Expand All @@ -46,6 +47,7 @@ public class JavaTypeTransformer {

private JavaClassResolutionFacade classResolutionFacade;
private Project project;
private SubModuleDescriptor subModule;

@Inject
public void setClassResolutionFacade(JavaClassResolutionFacade classResolutionFacade) {
Expand All @@ -57,6 +59,11 @@ public void setProject(@NotNull Project project) {
this.project = project;
}

@Inject
public void setSubModule(SubModuleDescriptor subModule) {
this.subModule = subModule;
}

@NotNull
private TypeProjection transformToTypeProjection(@NotNull final PsiType javaType,
@NotNull final TypeParameterDescriptor typeParameterDescriptor,
Expand Down Expand Up @@ -92,7 +99,7 @@ public TypeProjection visitType(PsiType type) {

@NotNull
public JetType transformToType(@NotNull GlobalSearchScope searchScope, @NotNull String kotlinSignature, TypeVariableResolver typeVariableResolver) {
JavaDependencyByQualifiedNameResolver resolver = JavaDependencyByQualifiedNameResolver.createFromSearchScope(project, searchScope, classResolutionFacade);
JavaDependencyByQualifiedNameResolver resolver = new JavaDependencyByQualifiedNameResolver(subModule);
final JetType[] r = new JetType[1];
JetTypeJetSignatureReader reader = new JetTypeJetSignatureReader(resolver, KotlinBuiltIns.getInstance(), typeVariableResolver) {
@Override
Expand Down
Expand Up @@ -26,6 +26,7 @@
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.SubModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
Expand All @@ -51,21 +52,16 @@
public final class JavaSupertypeResolver {

private BindingTrace trace;
private JavaClassResolutionFacade classResolutionFacade;
private JavaTypeTransformer typeTransformer;
private JavaClassResolver classResolver;
private Project project;
private SubModuleDescriptor subModule;

@Inject
public void setTrace(BindingTrace trace) {
this.trace = trace;
}

@Inject
public void setSemanticServices(JavaClassResolutionFacade classResolutionFacade) {
this.classResolutionFacade = classResolutionFacade;
}

@Inject
public void setTypeTransformer(JavaTypeTransformer typeTransformer) {
this.typeTransformer = typeTransformer;
Expand All @@ -81,6 +77,11 @@ public void setProject(Project project) {
this.project = project;
}

@Inject
public void setSubModule(@NotNull SubModuleDescriptor subModule) {
this.subModule = subModule;
}

public Collection<JetType> getSupertypes(
@NotNull ClassDescriptor classDescriptor,
@NotNull PsiClassWrapper psiClass,
Expand Down Expand Up @@ -129,8 +130,7 @@ public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVarianc

@Override
public JetSignatureVisitor visitSuperclass() {
JavaDependencyByQualifiedNameResolver resolver = JavaDependencyByQualifiedNameResolver
.createFromSearchScope(project, psiClass.getPsiClass().getResolveScope(), classResolutionFacade);
JavaDependencyByQualifiedNameResolver resolver = new JavaDependencyByQualifiedNameResolver(subModule);
return new JetTypeJetSignatureReader(resolver, KotlinBuiltIns.getInstance(), typeVariableResolver) {
@Override
protected void done(@NotNull JetType jetType) {
Expand Down

0 comments on commit c1b069b

Please sign in to comment.