Refactor JavaDescriptorResolver and *Resolver classes to use DI for dependency management

This commit is contained in:
Pavel V. Talanov
2012-10-10 17:42:00 +04:00
parent 0f3c2f9fca
commit 0aeb756f98
13 changed files with 527 additions and 202 deletions
@@ -26,7 +26,16 @@ 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.java.PsiClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl;
import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
import org.jetbrains.jet.lang.resolve.java.resolver.ClassResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.CompileTimeConstResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.NamespaceResolver;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorSignatureResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorSignatureResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.ConstructorResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.ValueParameterResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.FunctionResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.InnerClassResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.PropertiesResolver;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@@ -42,7 +51,16 @@ public class InjectorForJavaDescriptorResolver {
private JavaDescriptorResolver javaDescriptorResolver; private JavaDescriptorResolver javaDescriptorResolver;
private PsiClassFinderImpl psiClassFinder; private PsiClassFinderImpl psiClassFinder;
private JavaTypeTransformer javaTypeTransformer; private JavaTypeTransformer javaTypeTransformer;
private ClassResolver classResolver;
private JavaAnnotationResolver javaAnnotationResolver;
private CompileTimeConstResolver compileTimeConstResolver;
private NamespaceResolver namespaceResolver;
private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver; private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver;
private ConstructorResolver constructorResolver;
private ValueParameterResolver valueParameterResolver;
private FunctionResolver functionResolver;
private InnerClassResolver innerClassResolver;
private PropertiesResolver propertiesResolver;
public InjectorForJavaDescriptorResolver( public InjectorForJavaDescriptorResolver(
@NotNull Project project, @NotNull Project project,
@@ -59,7 +77,16 @@ public class InjectorForJavaDescriptorResolver {
this.javaDescriptorResolver = new JavaDescriptorResolver(); this.javaDescriptorResolver = new JavaDescriptorResolver();
this.psiClassFinder = new PsiClassFinderImpl(); this.psiClassFinder = new PsiClassFinderImpl();
this.javaTypeTransformer = new JavaTypeTransformer(); this.javaTypeTransformer = new JavaTypeTransformer();
this.classResolver = new ClassResolver();
this.javaAnnotationResolver = new JavaAnnotationResolver();
this.compileTimeConstResolver = new CompileTimeConstResolver();
this.namespaceResolver = new NamespaceResolver();
this.javaDescriptorSignatureResolver = new JavaDescriptorSignatureResolver(); this.javaDescriptorSignatureResolver = new JavaDescriptorSignatureResolver();
this.constructorResolver = new ConstructorResolver();
this.valueParameterResolver = new ValueParameterResolver();
this.functionResolver = new FunctionResolver();
this.innerClassResolver = new InnerClassResolver();
this.propertiesResolver = new PropertiesResolver();
javaBridgeConfiguration.setBuiltinsScopeExtensionMode(builtinsScopeExtensionMode); javaBridgeConfiguration.setBuiltinsScopeExtensionMode(builtinsScopeExtensionMode);
javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices); javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices);
@@ -70,9 +97,13 @@ public class InjectorForJavaDescriptorResolver {
this.javaSemanticServices.setTrace(bindingTrace); this.javaSemanticServices.setTrace(bindingTrace);
this.javaSemanticServices.setTypeTransformer(javaTypeTransformer); this.javaSemanticServices.setTypeTransformer(javaTypeTransformer);
this.javaDescriptorResolver.setJavaDescriptorSignatureResolver(javaDescriptorSignatureResolver); this.javaDescriptorResolver.setClassResolver(classResolver);
this.javaDescriptorResolver.setConstructorResolver(constructorResolver);
this.javaDescriptorResolver.setFunctionResolver(functionResolver);
this.javaDescriptorResolver.setInnerClassResolver(innerClassResolver);
this.javaDescriptorResolver.setNamespaceResolver(namespaceResolver);
this.javaDescriptorResolver.setProject(project); this.javaDescriptorResolver.setProject(project);
this.javaDescriptorResolver.setPsiClassFinder(psiClassFinder); this.javaDescriptorResolver.setPropertiesResolver(propertiesResolver);
this.javaDescriptorResolver.setSemanticServices(javaSemanticServices); this.javaDescriptorResolver.setSemanticServices(javaSemanticServices);
this.javaDescriptorResolver.setTrace(bindingTrace); this.javaDescriptorResolver.setTrace(bindingTrace);
@@ -81,8 +112,47 @@ public class InjectorForJavaDescriptorResolver {
javaTypeTransformer.setJavaSemanticServices(javaSemanticServices); javaTypeTransformer.setJavaSemanticServices(javaSemanticServices);
javaTypeTransformer.setResolver(javaDescriptorResolver); javaTypeTransformer.setResolver(javaDescriptorResolver);
classResolver.setAnnotationResolver(javaAnnotationResolver);
classResolver.setJavaDescriptorResolver(javaDescriptorResolver);
classResolver.setNamespaceResolver(namespaceResolver);
classResolver.setPsiClassFinder(psiClassFinder);
classResolver.setSemanticServices(javaSemanticServices);
classResolver.setSignatureResolver(javaDescriptorSignatureResolver);
classResolver.setTrace(bindingTrace);
classResolver.setTypeTransformer(javaTypeTransformer);
javaAnnotationResolver.setClassResolver(classResolver);
javaAnnotationResolver.setCompileTimeConstResolver(compileTimeConstResolver);
compileTimeConstResolver.setAnnotationResolver(javaAnnotationResolver);
compileTimeConstResolver.setClassResolver(classResolver);
namespaceResolver.setJavaSemanticServices(javaSemanticServices);
namespaceResolver.setPsiClassFinder(psiClassFinder);
namespaceResolver.setTrace(bindingTrace);
javaDescriptorSignatureResolver.setJavaSemanticServices(javaSemanticServices); javaDescriptorSignatureResolver.setJavaSemanticServices(javaSemanticServices);
constructorResolver.setTrace(bindingTrace);
constructorResolver.setTypeTransformer(javaTypeTransformer);
constructorResolver.setValueParameterResolver(valueParameterResolver);
valueParameterResolver.setTypeTransformer(javaTypeTransformer);
functionResolver.setAnnotationResolver(javaAnnotationResolver);
functionResolver.setParameterResolver(valueParameterResolver);
functionResolver.setSignatureResolver(javaDescriptorSignatureResolver);
functionResolver.setTrace(bindingTrace);
functionResolver.setTypeTransformer(javaTypeTransformer);
innerClassResolver.setClassResolver(classResolver);
propertiesResolver.setAnnotationResolver(javaAnnotationResolver);
propertiesResolver.setClassResolver(classResolver);
propertiesResolver.setJavaDescriptorSignatureResolver(javaDescriptorSignatureResolver);
propertiesResolver.setSemanticServices(javaSemanticServices);
propertiesResolver.setTrace(bindingTrace);
javaBridgeConfiguration.init(); javaBridgeConfiguration.init();
psiClassFinder.initialize(); psiClassFinder.initialize();
@@ -26,7 +26,16 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode; import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode;
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;
import org.jetbrains.jet.lang.resolve.java.resolver.ClassResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.CompileTimeConstResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.NamespaceResolver;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorSignatureResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorSignatureResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.ConstructorResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.ValueParameterResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.FunctionResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.InnerClassResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.PropertiesResolver;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@@ -42,7 +51,16 @@ public class InjectorForJavaSemanticServices {
private final BuiltinsScopeExtensionMode builtinsScopeExtensionMode; private final BuiltinsScopeExtensionMode builtinsScopeExtensionMode;
private final Project project; private final Project project;
private JavaTypeTransformer javaTypeTransformer; private JavaTypeTransformer javaTypeTransformer;
private ClassResolver classResolver;
private JavaAnnotationResolver javaAnnotationResolver;
private CompileTimeConstResolver compileTimeConstResolver;
private NamespaceResolver namespaceResolver;
private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver; private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver;
private ConstructorResolver constructorResolver;
private ValueParameterResolver valueParameterResolver;
private FunctionResolver functionResolver;
private InnerClassResolver innerClassResolver;
private PropertiesResolver propertiesResolver;
public InjectorForJavaSemanticServices( public InjectorForJavaSemanticServices(
@NotNull BuiltinsScopeExtensionMode builtinsScopeExtensionMode, @NotNull BuiltinsScopeExtensionMode builtinsScopeExtensionMode,
@@ -57,16 +75,29 @@ public class InjectorForJavaSemanticServices {
this.builtinsScopeExtensionMode = builtinsScopeExtensionMode; this.builtinsScopeExtensionMode = builtinsScopeExtensionMode;
this.project = project; this.project = project;
this.javaTypeTransformer = new JavaTypeTransformer(); this.javaTypeTransformer = new JavaTypeTransformer();
this.classResolver = new ClassResolver();
this.javaAnnotationResolver = new JavaAnnotationResolver();
this.compileTimeConstResolver = new CompileTimeConstResolver();
this.namespaceResolver = new NamespaceResolver();
this.javaDescriptorSignatureResolver = new JavaDescriptorSignatureResolver(); this.javaDescriptorSignatureResolver = new JavaDescriptorSignatureResolver();
this.constructorResolver = new ConstructorResolver();
this.valueParameterResolver = new ValueParameterResolver();
this.functionResolver = new FunctionResolver();
this.innerClassResolver = new InnerClassResolver();
this.propertiesResolver = new PropertiesResolver();
this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver); this.javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
this.javaSemanticServices.setPsiClassFinder(psiClassFinder); this.javaSemanticServices.setPsiClassFinder(psiClassFinder);
this.javaSemanticServices.setTrace(bindingTrace); this.javaSemanticServices.setTrace(bindingTrace);
this.javaSemanticServices.setTypeTransformer(javaTypeTransformer); this.javaSemanticServices.setTypeTransformer(javaTypeTransformer);
this.javaDescriptorResolver.setJavaDescriptorSignatureResolver(javaDescriptorSignatureResolver); this.javaDescriptorResolver.setClassResolver(classResolver);
this.javaDescriptorResolver.setConstructorResolver(constructorResolver);
this.javaDescriptorResolver.setFunctionResolver(functionResolver);
this.javaDescriptorResolver.setInnerClassResolver(innerClassResolver);
this.javaDescriptorResolver.setNamespaceResolver(namespaceResolver);
this.javaDescriptorResolver.setProject(project); this.javaDescriptorResolver.setProject(project);
this.javaDescriptorResolver.setPsiClassFinder(psiClassFinder); this.javaDescriptorResolver.setPropertiesResolver(propertiesResolver);
this.javaDescriptorResolver.setSemanticServices(javaSemanticServices); this.javaDescriptorResolver.setSemanticServices(javaSemanticServices);
this.javaDescriptorResolver.setTrace(bindingTrace); this.javaDescriptorResolver.setTrace(bindingTrace);
@@ -79,8 +110,47 @@ public class InjectorForJavaSemanticServices {
javaTypeTransformer.setJavaSemanticServices(javaSemanticServices); javaTypeTransformer.setJavaSemanticServices(javaSemanticServices);
javaTypeTransformer.setResolver(javaDescriptorResolver); javaTypeTransformer.setResolver(javaDescriptorResolver);
classResolver.setAnnotationResolver(javaAnnotationResolver);
classResolver.setJavaDescriptorResolver(javaDescriptorResolver);
classResolver.setNamespaceResolver(namespaceResolver);
classResolver.setPsiClassFinder(psiClassFinder);
classResolver.setSemanticServices(javaSemanticServices);
classResolver.setSignatureResolver(javaDescriptorSignatureResolver);
classResolver.setTrace(bindingTrace);
classResolver.setTypeTransformer(javaTypeTransformer);
javaAnnotationResolver.setClassResolver(classResolver);
javaAnnotationResolver.setCompileTimeConstResolver(compileTimeConstResolver);
compileTimeConstResolver.setAnnotationResolver(javaAnnotationResolver);
compileTimeConstResolver.setClassResolver(classResolver);
namespaceResolver.setJavaSemanticServices(javaSemanticServices);
namespaceResolver.setPsiClassFinder(psiClassFinder);
namespaceResolver.setTrace(bindingTrace);
javaDescriptorSignatureResolver.setJavaSemanticServices(javaSemanticServices); javaDescriptorSignatureResolver.setJavaSemanticServices(javaSemanticServices);
constructorResolver.setTrace(bindingTrace);
constructorResolver.setTypeTransformer(javaTypeTransformer);
constructorResolver.setValueParameterResolver(valueParameterResolver);
valueParameterResolver.setTypeTransformer(javaTypeTransformer);
functionResolver.setAnnotationResolver(javaAnnotationResolver);
functionResolver.setParameterResolver(valueParameterResolver);
functionResolver.setSignatureResolver(javaDescriptorSignatureResolver);
functionResolver.setTrace(bindingTrace);
functionResolver.setTypeTransformer(javaTypeTransformer);
innerClassResolver.setClassResolver(classResolver);
propertiesResolver.setAnnotationResolver(javaAnnotationResolver);
propertiesResolver.setClassResolver(classResolver);
propertiesResolver.setJavaDescriptorSignatureResolver(javaDescriptorSignatureResolver);
propertiesResolver.setSemanticServices(javaSemanticServices);
propertiesResolver.setTrace(bindingTrace);
javaBridgeConfiguration.init(); javaBridgeConfiguration.init();
psiClassFinder.initialize(); psiClassFinder.initialize();
@@ -48,7 +48,16 @@ import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
import org.jetbrains.jet.lang.resolve.java.resolver.ClassResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.CompileTimeConstResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.NamespaceResolver;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorSignatureResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorSignatureResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.ConstructorResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.ValueParameterResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.FunctionResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.InnerClassResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.PropertiesResolver;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@@ -85,7 +94,16 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private ScriptBodyResolver scriptBodyResolver; private ScriptBodyResolver scriptBodyResolver;
private JavaSemanticServices javaSemanticServices; private JavaSemanticServices javaSemanticServices;
private JavaTypeTransformer javaTypeTransformer; private JavaTypeTransformer javaTypeTransformer;
private ClassResolver classResolver;
private JavaAnnotationResolver javaAnnotationResolver;
private CompileTimeConstResolver compileTimeConstResolver;
private NamespaceResolver namespaceResolver;
private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver; private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver;
private ConstructorResolver constructorResolver;
private ValueParameterResolver valueParameterResolver;
private FunctionResolver functionResolver;
private InnerClassResolver innerClassResolver;
private PropertiesResolver propertiesResolver;
public InjectorForTopDownAnalyzerForJvm( public InjectorForTopDownAnalyzerForJvm(
@NotNull Project project, @NotNull Project project,
@@ -124,7 +142,16 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.scriptBodyResolver = new ScriptBodyResolver(); this.scriptBodyResolver = new ScriptBodyResolver();
this.javaSemanticServices = new JavaSemanticServices(); this.javaSemanticServices = new JavaSemanticServices();
this.javaTypeTransformer = new JavaTypeTransformer(); this.javaTypeTransformer = new JavaTypeTransformer();
this.classResolver = new ClassResolver();
this.javaAnnotationResolver = new JavaAnnotationResolver();
this.compileTimeConstResolver = new CompileTimeConstResolver();
this.namespaceResolver = new NamespaceResolver();
this.javaDescriptorSignatureResolver = new JavaDescriptorSignatureResolver(); this.javaDescriptorSignatureResolver = new JavaDescriptorSignatureResolver();
this.constructorResolver = new ConstructorResolver();
this.valueParameterResolver = new ValueParameterResolver();
this.functionResolver = new FunctionResolver();
this.innerClassResolver = new InnerClassResolver();
this.propertiesResolver = new PropertiesResolver();
this.topDownAnalyzer.setBodyResolver(bodyResolver); this.topDownAnalyzer.setBodyResolver(bodyResolver);
this.topDownAnalyzer.setContext(topDownAnalysisContext); this.topDownAnalyzer.setContext(topDownAnalysisContext);
@@ -162,9 +189,13 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.moduleConfiguration.setJavaSemanticServices(javaSemanticServices); this.moduleConfiguration.setJavaSemanticServices(javaSemanticServices);
this.moduleConfiguration.setProject(project); this.moduleConfiguration.setProject(project);
javaDescriptorResolver.setJavaDescriptorSignatureResolver(javaDescriptorSignatureResolver); javaDescriptorResolver.setClassResolver(classResolver);
javaDescriptorResolver.setConstructorResolver(constructorResolver);
javaDescriptorResolver.setFunctionResolver(functionResolver);
javaDescriptorResolver.setInnerClassResolver(innerClassResolver);
javaDescriptorResolver.setNamespaceResolver(namespaceResolver);
javaDescriptorResolver.setProject(project); javaDescriptorResolver.setProject(project);
javaDescriptorResolver.setPsiClassFinder(psiClassFinder); javaDescriptorResolver.setPropertiesResolver(propertiesResolver);
javaDescriptorResolver.setSemanticServices(javaSemanticServices); javaDescriptorResolver.setSemanticServices(javaSemanticServices);
javaDescriptorResolver.setTrace(bindingTrace); javaDescriptorResolver.setTrace(bindingTrace);
@@ -236,8 +267,47 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
javaTypeTransformer.setJavaSemanticServices(javaSemanticServices); javaTypeTransformer.setJavaSemanticServices(javaSemanticServices);
javaTypeTransformer.setResolver(javaDescriptorResolver); javaTypeTransformer.setResolver(javaDescriptorResolver);
classResolver.setAnnotationResolver(javaAnnotationResolver);
classResolver.setJavaDescriptorResolver(javaDescriptorResolver);
classResolver.setNamespaceResolver(namespaceResolver);
classResolver.setPsiClassFinder(psiClassFinder);
classResolver.setSemanticServices(javaSemanticServices);
classResolver.setSignatureResolver(javaDescriptorSignatureResolver);
classResolver.setTrace(bindingTrace);
classResolver.setTypeTransformer(javaTypeTransformer);
javaAnnotationResolver.setClassResolver(classResolver);
javaAnnotationResolver.setCompileTimeConstResolver(compileTimeConstResolver);
compileTimeConstResolver.setAnnotationResolver(javaAnnotationResolver);
compileTimeConstResolver.setClassResolver(classResolver);
namespaceResolver.setJavaSemanticServices(javaSemanticServices);
namespaceResolver.setPsiClassFinder(psiClassFinder);
namespaceResolver.setTrace(bindingTrace);
javaDescriptorSignatureResolver.setJavaSemanticServices(javaSemanticServices); javaDescriptorSignatureResolver.setJavaSemanticServices(javaSemanticServices);
constructorResolver.setTrace(bindingTrace);
constructorResolver.setTypeTransformer(javaTypeTransformer);
constructorResolver.setValueParameterResolver(valueParameterResolver);
valueParameterResolver.setTypeTransformer(javaTypeTransformer);
functionResolver.setAnnotationResolver(javaAnnotationResolver);
functionResolver.setParameterResolver(valueParameterResolver);
functionResolver.setSignatureResolver(javaDescriptorSignatureResolver);
functionResolver.setTrace(bindingTrace);
functionResolver.setTypeTransformer(javaTypeTransformer);
innerClassResolver.setClassResolver(classResolver);
propertiesResolver.setAnnotationResolver(javaAnnotationResolver);
propertiesResolver.setClassResolver(classResolver);
propertiesResolver.setJavaDescriptorSignatureResolver(javaDescriptorSignatureResolver);
propertiesResolver.setSemanticServices(javaSemanticServices);
propertiesResolver.setTrace(bindingTrace);
moduleConfiguration.init(); moduleConfiguration.init();
psiClassFinder.initialize(); psiClassFinder.initialize();
@@ -17,22 +17,16 @@
package org.jetbrains.jet.lang.resolve.java; package org.jetbrains.jet.lang.resolve.java;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiAnnotationMemberValue;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiModifierListOwner;
import org.jetbrains.annotations.NotNull; 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.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData; import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData;
import org.jetbrains.jet.lang.resolve.java.data.ResolverScopeData; import org.jetbrains.jet.lang.resolve.java.data.ResolverScopeData;
import org.jetbrains.jet.lang.resolve.java.resolver.*; import org.jetbrains.jet.lang.resolve.java.resolver.*;
import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiParameterWrapper;
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.types.DependencyClassByQualifiedNameResolver; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver;
@@ -70,17 +64,12 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
protected Project project; protected Project project;
protected JavaSemanticServices semanticServices; protected JavaSemanticServices semanticServices;
private BindingTrace trace; private BindingTrace trace;
private PsiClassFinder psiClassFinder; private PropertiesResolver propertiesResolver;
private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver; private ClassResolver classResolver;
private final PropertiesResolver propertiesResolver = new PropertiesResolver(this); private ConstructorResolver constructorResolver;
private final ClassResolver classResolver = new ClassResolver(this); private FunctionResolver functionResolver;
private final ConstructorResolver constructorResolver = new ConstructorResolver(this); private NamespaceResolver namespaceResolver;
private final CompileTimeConstResolver compileTimeConstResolver = new CompileTimeConstResolver(this); private InnerClassResolver innerClassResolver;
private final JavaAnnotationResolver annotationResolver = new JavaAnnotationResolver(this);
private final FunctionResolver functionResolver = new FunctionResolver(this);
private final NamespaceResolver namespaceResolver = new NamespaceResolver(this);
private final InnerClassResolver innerClassResolver = new InnerClassResolver(this);
private final ValueParameterResolver valueParameterResolver = new ValueParameterResolver(this);
@Inject @Inject
public void setProject(Project project) { public void setProject(Project project) {
@@ -90,24 +79,41 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
@Inject @Inject
public void setSemanticServices(JavaSemanticServices semanticServices) { public void setSemanticServices(JavaSemanticServices semanticServices) {
this.semanticServices = semanticServices; this.semanticServices = semanticServices;
this.propertiesResolver.setSemanticServices(semanticServices);
} }
@Inject @Inject
public void setTrace(BindingTrace trace) { public void setTrace(BindingTrace trace) {
this.trace = trace; this.trace = trace;
this.propertiesResolver.setTrace(trace);
} }
@Inject @Inject
public void setPsiClassFinder(PsiClassFinder psiClassFinder) { public void setFunctionResolver(FunctionResolver functionResolver) {
this.psiClassFinder = psiClassFinder; this.functionResolver = functionResolver;
} }
@Inject @Inject
public void setJavaDescriptorSignatureResolver(JavaDescriptorSignatureResolver javaDescriptorSignatureResolver) { public void setClassResolver(ClassResolver classResolver) {
this.javaDescriptorSignatureResolver = javaDescriptorSignatureResolver; this.classResolver = classResolver;
this.propertiesResolver.setJavaDescriptorSignatureResolver(javaDescriptorSignatureResolver); }
@Inject
public void setNamespaceResolver(NamespaceResolver namespaceResolver) {
this.namespaceResolver = namespaceResolver;
}
@Inject
public void setPropertiesResolver(PropertiesResolver propertiesResolver) {
this.propertiesResolver = propertiesResolver;
}
@Inject
public void setConstructorResolver(ConstructorResolver constructorResolver) {
this.constructorResolver = constructorResolver;
}
@Inject
public void setInnerClassResolver(InnerClassResolver innerClassResolver) {
this.innerClassResolver = innerClassResolver;
} }
@Nullable @Nullable
@@ -117,19 +123,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
@Override @Override
public ClassDescriptor resolveClass(@NotNull FqName qualifiedName) { public ClassDescriptor resolveClass(@NotNull FqName qualifiedName) {
return classResolver.resolveClass(qualifiedName, DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN); return classResolver.resolveClass(qualifiedName);
}
public PsiClassFinder getPsiClassFinder() {
return psiClassFinder;
}
public JavaDescriptorSignatureResolver getJavaDescriptorSignatureResolver() {
return javaDescriptorSignatureResolver;
}
public JavaSemanticServices getSemanticServices() {
return semanticServices;
} }
public BindingTrace getTrace() { public BindingTrace getTrace() {
@@ -169,16 +163,6 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
return classResolver.resolveClass(name, searchRule, list); return classResolver.resolveClass(name, searchRule, list);
} }
@Nullable
public CompileTimeConstant getCompileTimeConstFromExpression(
FqName annotationName,
Name parameterName,
PsiAnnotationMemberValue value,
List<Runnable> taskList
) {
return compileTimeConstResolver.getCompileTimeConstFromExpression(annotationName, parameterName, value, taskList);
}
public static class ValueParameterDescriptors { public static class ValueParameterDescriptors {
private final JetType receiverType; private final JetType receiverType;
private final List<ValueParameterDescriptor> descriptors; private final List<ValueParameterDescriptor> descriptors;
@@ -204,26 +188,6 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
return functionResolver.resolveFunctionGroup(methodName, scopeData); return functionResolver.resolveFunctionGroup(methodName, scopeData);
} }
public ValueParameterDescriptors resolveParameterDescriptors(
DeclarationDescriptor containingDeclaration,
List<PsiParameterWrapper> parameters, TypeVariableResolver typeVariableResolver
) {
return valueParameterResolver.resolveParameterDescriptors(containingDeclaration, parameters, typeVariableResolver);
}
public List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner, @NotNull List<Runnable> tasks) {
return annotationResolver.resolveAnnotations(owner, tasks);
}
public List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner) {
return annotationResolver.resolveAnnotations(owner);
}
@Nullable
public AnnotationDescriptor resolveAnnotation(PsiAnnotation psiAnnotation, @NotNull List<Runnable> taskList) {
return annotationResolver.resolveAnnotation(psiAnnotation, taskList);
}
public List<FunctionDescriptor> resolveMethods(@NotNull ResolverScopeData scopeData) { public List<FunctionDescriptor> resolveMethods(@NotNull ResolverScopeData scopeData) {
return functionResolver.resolveMethods(scopeData); return functionResolver.resolveMethods(scopeData);
} }
@@ -27,6 +27,7 @@ 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.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.data.ResolverBinaryClassData; import org.jetbrains.jet.lang.resolve.java.data.ResolverBinaryClassData;
import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData; import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData;
@@ -52,6 +53,7 @@ import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader; import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor; import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
import javax.inject.Inject;
import java.util.*; import java.util.*;
import static org.jetbrains.jet.lang.resolve.DescriptorResolver.createEnumClassObjectValueOfMethod; import static org.jetbrains.jet.lang.resolve.DescriptorResolver.createEnumClassObjectValueOfMethod;
@@ -60,8 +62,6 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName;
public final class ClassResolver { public final class ClassResolver {
private final JavaDescriptorResolver javaDescriptorResolver;
// NOTE: this complexity is introduced because class descriptors do not always have valid fqnames (class objects) // NOTE: this complexity is introduced because class descriptors do not always have valid fqnames (class objects)
private final Map<FqNameBase, ResolverClassData> classDescriptorCache = private final Map<FqNameBase, ResolverClassData> classDescriptorCache =
new THashMap<FqNameBase, ResolverClassData>(new TObjectHashingStrategy<FqNameBase>() { new THashMap<FqNameBase, ResolverClassData>(new TObjectHashingStrategy<FqNameBase>() {
@@ -80,10 +80,58 @@ public final class ClassResolver {
} }
}); });
public ClassResolver(JavaDescriptorResolver javaDescriptorResolver) { private BindingTrace trace;
private JavaDescriptorResolver javaDescriptorResolver;
private JavaDescriptorSignatureResolver signatureResolver;
private JavaSemanticServices semanticServices;
private JavaAnnotationResolver annotationResolver;
private PsiClassFinder psiClassFinder;
private NamespaceResolver namespaceResolver;
private JavaTypeTransformer typeTransformer;
public ClassResolver() {
}
@Inject
public void setTrace(BindingTrace trace) {
this.trace = trace;
}
@Inject
public void setJavaDescriptorResolver(JavaDescriptorResolver javaDescriptorResolver) {
this.javaDescriptorResolver = javaDescriptorResolver; this.javaDescriptorResolver = javaDescriptorResolver;
} }
@Inject
public void setSignatureResolver(JavaDescriptorSignatureResolver signatureResolver) {
this.signatureResolver = signatureResolver;
}
@Inject
public void setSemanticServices(JavaSemanticServices semanticServices) {
this.semanticServices = semanticServices;
}
@Inject
public void setAnnotationResolver(JavaAnnotationResolver annotationResolver) {
this.annotationResolver = annotationResolver;
}
@Inject
public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
this.psiClassFinder = psiClassFinder;
}
@Inject
public void setNamespaceResolver(NamespaceResolver namespaceResolver) {
this.namespaceResolver = namespaceResolver;
}
@Inject
public void setTypeTransformer(JavaTypeTransformer typeTransformer) {
this.typeTransformer = typeTransformer;
}
@Nullable @Nullable
public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) { public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
List<Runnable> tasks = Lists.newArrayList(); List<Runnable> tasks = Lists.newArrayList();
@@ -106,13 +154,13 @@ public final class ClassResolver {
} }
ClassDescriptor builtinClassDescriptor = ClassDescriptor builtinClassDescriptor =
javaDescriptorResolver.getSemanticServices().getKotlinBuiltinClassDescriptor(qualifiedName); semanticServices.getKotlinBuiltinClassDescriptor(qualifiedName);
if (builtinClassDescriptor != null) { if (builtinClassDescriptor != null) {
return builtinClassDescriptor; return builtinClassDescriptor;
} }
// First, let's check that this is a real Java class, not a Java's view on a Kotlin class: // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
ClassDescriptor kotlinClassDescriptor = javaDescriptorResolver.getSemanticServices().getKotlinClassDescriptor(qualifiedName); ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
if (kotlinClassDescriptor != null) { if (kotlinClassDescriptor != null) {
return searchRule.processFoundInKotlin(kotlinClassDescriptor); return searchRule.processFoundInKotlin(kotlinClassDescriptor);
} }
@@ -121,7 +169,7 @@ public final class ClassResolver {
ResolverClassData classData = classDescriptorCache.get(qualifiedName); ResolverClassData classData = classDescriptorCache.get(qualifiedName);
if (classData == null) { if (classData == null) {
PsiClass psiClass = PsiClass psiClass =
javaDescriptorResolver.getPsiClassFinder().findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW); psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW);
if (psiClass == null) { if (psiClass == null) {
ResolverClassData oldValue = ResolverClassData oldValue =
classDescriptorCache classDescriptorCache
@@ -171,7 +219,7 @@ public final class ClassResolver {
List<JetType> supertypes = new ArrayList<JetType>(); List<JetType> supertypes = new ArrayList<JetType>();
List<JavaDescriptorSignatureResolver.TypeParameterDescriptorInitialization> typeParameterDescriptorInitializations List<JavaDescriptorSignatureResolver.TypeParameterDescriptorInitialization> typeParameterDescriptorInitializations
= javaDescriptorResolver.getJavaDescriptorSignatureResolver().createUninitializedClassTypeParameters(psiClass, classData); = signatureResolver.createUninitializedClassTypeParameters(psiClass, classData);
List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(); List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
for (JavaDescriptorSignatureResolver.TypeParameterDescriptorInitialization typeParameter : typeParameterDescriptorInitializations) { for (JavaDescriptorSignatureResolver.TypeParameterDescriptorInitialization typeParameter : typeParameterDescriptorInitializations) {
@@ -193,9 +241,9 @@ public final class ClassResolver {
classData.getClassDescriptor().setModality(modality); classData.getClassDescriptor().setModality(modality);
classData.getClassDescriptor().createTypeConstructor(); classData.getClassDescriptor().createTypeConstructor();
classData.getClassDescriptor() classData.getClassDescriptor()
.setScopeForMemberLookup(new JavaClassMembersScope(javaDescriptorResolver.getSemanticServices(), classData)); .setScopeForMemberLookup(new JavaClassMembersScope(semanticServices, classData));
javaDescriptorResolver.getJavaDescriptorSignatureResolver() signatureResolver
.initializeTypeParameters(typeParameterDescriptorInitializations, classData.getClassDescriptor(), "class " + qualifiedName); .initializeTypeParameters(typeParameterDescriptorInitializations, classData.getClassDescriptor(), "class " + qualifiedName);
// TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes // TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes
@@ -207,7 +255,7 @@ public final class ClassResolver {
classData.getClassDescriptor().getBuilder().setClassObjectDescriptor(classObject); classData.getClassDescriptor().getBuilder().setClassObjectDescriptor(classObject);
} }
classData.getClassDescriptor().setAnnotations(javaDescriptorResolver.resolveAnnotations(psiClass, taskList)); classData.getClassDescriptor().setAnnotations(annotationResolver.resolveAnnotations(psiClass, taskList));
javaDescriptorResolver.getTrace().record(BindingContext.CLASS, psiClass, classData.getClassDescriptor()); javaDescriptorResolver.getTrace().record(BindingContext.CLASS, psiClass, classData.getClassDescriptor());
@@ -268,7 +316,7 @@ public final class ClassResolver {
classDescriptor.setVisibility(containing.getVisibility()); classDescriptor.setVisibility(containing.getVisibility());
classDescriptor.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList()); classDescriptor.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList());
classDescriptor.createTypeConstructor(); classDescriptor.createTypeConstructor();
JavaClassMembersScope classMembersScope = new JavaClassMembersScope(javaDescriptorResolver.getSemanticServices(), data); JavaClassMembersScope classMembersScope = new JavaClassMembersScope(semanticServices, data);
WritableScopeImpl writableScope = WritableScopeImpl writableScope =
new WritableScopeImpl(classMembersScope, classDescriptor, RedeclarationHandler.THROW_EXCEPTION, fqName.toString()); new WritableScopeImpl(classMembersScope, classDescriptor, RedeclarationHandler.THROW_EXCEPTION, fqName.toString());
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH); writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
@@ -283,9 +331,9 @@ public final class ClassResolver {
MutableClassDescriptorLite classObjectDescriptor = createSyntheticClassObject(containing, psiClass); MutableClassDescriptorLite classObjectDescriptor = createSyntheticClassObject(containing, psiClass);
classObjectDescriptor.getBuilder() classObjectDescriptor.getBuilder()
.addFunctionDescriptor(createEnumClassObjectValuesMethod(classObjectDescriptor, javaDescriptorResolver.getTrace())); .addFunctionDescriptor(createEnumClassObjectValuesMethod(classObjectDescriptor, trace));
classObjectDescriptor.getBuilder() classObjectDescriptor.getBuilder()
.addFunctionDescriptor(createEnumClassObjectValueOfMethod(classObjectDescriptor, javaDescriptorResolver.getTrace())); .addFunctionDescriptor(createEnumClassObjectValueOfMethod(classObjectDescriptor, trace));
return classObjectDescriptor; return classObjectDescriptor;
} }
@@ -332,7 +380,7 @@ public final class ClassResolver {
@Override @Override
public JetSignatureVisitor visitSuperclass() { public JetSignatureVisitor visitSuperclass() {
return new JetTypeJetSignatureReader(javaDescriptorResolver.getSemanticServices(), JetStandardLibrary.getInstance(), return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(),
typeVariableResolver) { typeVariableResolver) {
@Override @Override
protected void done(@NotNull JetType jetType) { protected void done(@NotNull JetType jetType) {
@@ -358,7 +406,7 @@ public final class ClassResolver {
for (JetType supertype : result) { for (JetType supertype : result) {
if (ErrorUtils.isErrorType(supertype)) { if (ErrorUtils.isErrorType(supertype)) {
javaDescriptorResolver.getTrace().record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor); trace.record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
} }
} }
@@ -397,7 +445,7 @@ public final class ClassResolver {
} }
} }
JetType transform = javaDescriptorResolver.getSemanticServices().getTypeTransformer() JetType transform = typeTransformer
.transformToType(type, JavaTypeTransformer.TypeUsage.SUPERTYPE, typeVariableResolver); .transformToType(type, JavaTypeTransformer.TypeUsage.SUPERTYPE, typeVariableResolver);
if (ErrorUtils.isErrorType(transform)) { if (ErrorUtils.isErrorType(transform)) {
continue; continue;
@@ -433,7 +481,7 @@ public final class ClassResolver {
return clazz; return clazz;
} }
NamespaceDescriptor ns = javaDescriptorResolver.resolveNamespace(fqName.parent(), DescriptorSearchRule.INCLUDE_KOTLIN); NamespaceDescriptor ns = namespaceResolver.resolveNamespace(fqName.parent(), DescriptorSearchRule.INCLUDE_KOTLIN);
if (ns == null) { if (ns == null) {
throw new IllegalStateException("cannot resolve namespace " + fqName.parent() + ", required to be container for " + fqName); throw new IllegalStateException("cannot resolve namespace " + fqName.parent() + ", required to be container for " + fqName);
} }
@@ -472,4 +520,10 @@ public final class ClassResolver {
} }
return null; return null;
} }
@Nullable
public ClassDescriptor resolveClass(FqName name) {
return resolveClass(name, DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
}
} }
@@ -28,22 +28,32 @@ import org.jetbrains.jet.lang.resolve.constants.*;
import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.resolve.constants.StringValue;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
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.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeProjection; import org.jetbrains.jet.lang.types.TypeProjection;
import javax.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
public final class CompileTimeConstResolver { public final class CompileTimeConstResolver {
private final JavaDescriptorResolver javaDescriptorResolver; private JavaAnnotationResolver annotationResolver;
private ClassResolver classResolver;
public CompileTimeConstResolver(JavaDescriptorResolver javaDescriptorResolver) { public CompileTimeConstResolver() {
this.javaDescriptorResolver = javaDescriptorResolver; }
@Inject
public void setAnnotationResolver(JavaAnnotationResolver annotationResolver) {
this.annotationResolver = annotationResolver;
}
@Inject
public void setClassResolver(ClassResolver classResolver) {
this.classResolver = classResolver;
} }
@Nullable @Nullable
@@ -72,7 +82,7 @@ public final class CompileTimeConstResolver {
@Nullable @Nullable
private CompileTimeConstant<?> getCompileTimeConstFromAnnotation(PsiAnnotation value, List<Runnable> taskList) { private CompileTimeConstant<?> getCompileTimeConstFromAnnotation(PsiAnnotation value, List<Runnable> taskList) {
AnnotationDescriptor annotationDescriptor = javaDescriptorResolver.resolveAnnotation(value, taskList); AnnotationDescriptor annotationDescriptor = annotationResolver.resolveAnnotation(value, taskList);
if (annotationDescriptor != null) { if (annotationDescriptor != null) {
return new AnnotationValue(annotationDescriptor); return new AnnotationValue(annotationDescriptor);
} }
@@ -89,7 +99,7 @@ public final class CompileTimeConstResolver {
List<CompileTimeConstant<?>> values = getCompileTimeConstantForArrayValues(annotationFqName, valueName, taskList, initializers); List<CompileTimeConstant<?>> values = getCompileTimeConstantForArrayValues(annotationFqName, valueName, taskList, initializers);
ClassDescriptor classDescriptor = ClassDescriptor classDescriptor =
javaDescriptorResolver.resolveClass(annotationFqName, DescriptorSearchRule.INCLUDE_KOTLIN, taskList); classResolver.resolveClass(annotationFqName, DescriptorSearchRule.INCLUDE_KOTLIN, taskList);
ValueParameterDescriptor valueParameterDescriptor = ValueParameterDescriptor valueParameterDescriptor =
DescriptorResolverUtils.getValueParameterDescriptorForAnnotationParameter(valueName, classDescriptor); DescriptorResolverUtils.getValueParameterDescriptorForAnnotationParameter(valueName, classDescriptor);
@@ -131,8 +141,7 @@ public final class CompileTimeConstResolver {
} }
JetScope scope; JetScope scope;
ClassDescriptor classDescriptor = ClassDescriptor classDescriptor = classResolver.resolveClass(new FqName(fqName), DescriptorSearchRule.INCLUDE_KOTLIN, taskList);
javaDescriptorResolver.resolveClass(new FqName(fqName), DescriptorSearchRule.INCLUDE_KOTLIN, taskList);
if (classDescriptor == null) { if (classDescriptor == null) {
return null; return null;
} }
@@ -23,11 +23,9 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.TypeVariableResolver;
import org.jetbrains.jet.lang.resolve.java.TypeVariableResolvers;
import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData; import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData;
@@ -35,15 +33,32 @@ import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
public final class ConstructorResolver { public final class ConstructorResolver {
private final JavaDescriptorResolver javaDescriptorResolver; private BindingTrace trace;
private JavaTypeTransformer typeTransformer;
private ValueParameterResolver valueParameterResolver;
public ConstructorResolver(JavaDescriptorResolver javaDescriptorResolver) { public ConstructorResolver() {
this.javaDescriptorResolver = javaDescriptorResolver; }
@Inject
public void setTrace(BindingTrace trace) {
this.trace = trace;
}
@Inject
public void setTypeTransformer(JavaTypeTransformer typeTransformer) {
this.typeTransformer = typeTransformer;
}
@Inject
public void setValueParameterResolver(ValueParameterResolver valueParameterResolver) {
this.valueParameterResolver = valueParameterResolver;
} }
@NotNull @NotNull
@@ -66,8 +81,8 @@ public final class ConstructorResolver {
constructors.add(DescriptorResolver.createPrimaryConstructorForObject(containingClass)); constructors.add(DescriptorResolver.createPrimaryConstructorForObject(containingClass));
} }
else if (psiConstructors.length == 0) { else if (psiConstructors.length == 0) {
if (javaDescriptorResolver.getTrace().get(BindingContext.CONSTRUCTOR, psiClass) != null) { if (trace.get(BindingContext.CONSTRUCTOR, psiClass) != null) {
constructors.add(javaDescriptorResolver.getTrace().get(BindingContext.CONSTRUCTOR, psiClass)); constructors.add(trace.get(BindingContext.CONSTRUCTOR, psiClass));
} }
else { else {
// We need to create default constructors for classes and abstract classes. // We need to create default constructors for classes and abstract classes.
@@ -82,7 +97,7 @@ public final class ConstructorResolver {
constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), containingClass constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), containingClass
.getVisibility(), isStatic); .getVisibility(), isStatic);
constructors.add(constructorDescriptor); constructors.add(constructorDescriptor);
javaDescriptorResolver.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor); trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
} }
if (psiClass.isAnnotationType()) { if (psiClass.isAnnotationType()) {
// A constructor for an annotation type takes all the "methods" in the @interface as parameters // A constructor for an annotation type takes all the "methods" in the @interface as parameters
@@ -105,7 +120,7 @@ public final class ConstructorResolver {
// if the last method of the @interface is an array, we convert it into a vararg // if the last method of the @interface is an array, we convert it into a vararg
JetType varargElementType = null; JetType varargElementType = null;
if (i == methods.length - 1 && (returnType instanceof PsiArrayType)) { if (i == methods.length - 1 && (returnType instanceof PsiArrayType)) {
varargElementType = javaDescriptorResolver.getSemanticServices().getTypeTransformer() varargElementType = typeTransformer
.transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters); .transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters);
} }
@@ -116,8 +131,7 @@ public final class ConstructorResolver {
Collections.<AnnotationDescriptor>emptyList(), Collections.<AnnotationDescriptor>emptyList(),
Name.identifier(method.getName()), Name.identifier(method.getName()),
false, false,
javaDescriptorResolver.getSemanticServices().getTypeTransformer() typeTransformer.transformToType(returnType, resolverForTypeParameters),
.transformToType(returnType, resolverForTypeParameters),
annotationMethod.getDefaultValue() != null, annotationMethod.getDefaultValue() != null,
varargElementType)); varargElementType));
} }
@@ -125,7 +139,7 @@ public final class ConstructorResolver {
constructorDescriptor.initialize(typeParameters, valueParameters, containingClass.getVisibility(), isStatic); constructorDescriptor.initialize(typeParameters, valueParameters, containingClass.getVisibility(), isStatic);
constructors.add(constructorDescriptor); constructors.add(constructorDescriptor);
javaDescriptorResolver.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor); trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
} }
} }
} }
@@ -159,8 +173,8 @@ public final class ConstructorResolver {
return null; return null;
} }
if (javaDescriptorResolver.getTrace().get(BindingContext.CONSTRUCTOR, psiConstructor) != null) { if (trace.get(BindingContext.CONSTRUCTOR, psiConstructor) != null) {
return javaDescriptorResolver.getTrace().get(BindingContext.CONSTRUCTOR, psiConstructor); return trace.get(BindingContext.CONSTRUCTOR, psiConstructor);
} }
ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl( ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
@@ -169,7 +183,7 @@ public final class ConstructorResolver {
false); false);
String context = "constructor of class " + psiClass.getQualifiedName(); String context = "constructor of class " + psiClass.getQualifiedName();
JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors = javaDescriptorResolver.resolveParameterDescriptors( JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors = valueParameterResolver.resolveParameterDescriptors(
constructorDescriptor, constructor.getParameters(), constructorDescriptor, constructor.getParameters(),
TypeVariableResolvers.classTypeVariableResolver(classData.getClassDescriptor(), context)); TypeVariableResolvers.classTypeVariableResolver(classData.getClassDescriptor(), context));
@@ -184,15 +198,15 @@ public final class ConstructorResolver {
valueParameterDescriptors = alternativeMethodSignatureData.getValueParameters(); valueParameterDescriptors = alternativeMethodSignatureData.getValueParameters();
} }
else if (alternativeMethodSignatureData.hasErrors()) { else if (alternativeMethodSignatureData.hasErrors()) {
javaDescriptorResolver.getTrace().record(BindingContext.ALTERNATIVE_SIGNATURE_DATA_ERROR, constructorDescriptor, trace.record(BindingContext.ALTERNATIVE_SIGNATURE_DATA_ERROR, constructorDescriptor,
alternativeMethodSignatureData.getError()); alternativeMethodSignatureData.getError());
} }
constructorDescriptor.initialize(classData.getClassDescriptor().getTypeConstructor().getParameters(), constructorDescriptor.initialize(classData.getClassDescriptor().getTypeConstructor().getParameters(),
valueParameterDescriptors.getDescriptors(), valueParameterDescriptors.getDescriptors(),
DescriptorResolverUtils.resolveVisibility(psiConstructor, constructor.getJetConstructor()), DescriptorResolverUtils.resolveVisibility(psiConstructor, constructor.getJetConstructor()),
aStatic); aStatic);
javaDescriptorResolver.getTrace().record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor); trace.record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor);
return constructorDescriptor; return constructorDescriptor;
} }
} }
@@ -24,10 +24,7 @@ import com.intellij.psi.PsiType;
import org.jetbrains.annotations.NotNull; 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.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.data.ResolverScopeData; import org.jetbrains.jet.lang.resolve.java.data.ResolverScopeData;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData;
@@ -39,13 +36,43 @@ import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import javax.inject.Inject;
import java.util.*; import java.util.*;
public final class FunctionResolver { public final class FunctionResolver {
private final JavaDescriptorResolver javaDescriptorResolver;
public FunctionResolver(JavaDescriptorResolver javaDescriptorResolver) { private JavaTypeTransformer typeTransformer;
this.javaDescriptorResolver = javaDescriptorResolver; private BindingTrace trace;
private JavaDescriptorSignatureResolver signatureResolver;
private ValueParameterResolver parameterResolver;
private JavaAnnotationResolver annotationResolver;
public FunctionResolver() {
}
@Inject
public void setTypeTransformer(JavaTypeTransformer typeTransformer) {
this.typeTransformer = typeTransformer;
}
@Inject
public void setTrace(BindingTrace trace) {
this.trace = trace;
}
@Inject
public void setSignatureResolver(JavaDescriptorSignatureResolver signatureResolver) {
this.signatureResolver = signatureResolver;
}
@Inject
public void setParameterResolver(ValueParameterResolver parameterResolver) {
this.parameterResolver = parameterResolver;
}
@Inject
public void setAnnotationResolver(JavaAnnotationResolver annotationResolver) {
this.annotationResolver = annotationResolver;
} }
@Nullable @Nullable
@@ -77,13 +104,13 @@ public final class FunctionResolver {
} }
} }
if (javaDescriptorResolver.getTrace().get(BindingContext.FUNCTION, psiMethod) != null) { if (trace.get(BindingContext.FUNCTION, psiMethod) != null) {
return javaDescriptorResolver.getTrace().get(BindingContext.FUNCTION, psiMethod); return trace.get(BindingContext.FUNCTION, psiMethod);
} }
SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl( SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl(
scopeData.getClassOrNamespaceDescriptor(), scopeData.getClassOrNamespaceDescriptor(),
javaDescriptorResolver.resolveAnnotations(psiMethod), annotationResolver.resolveAnnotations(psiMethod),
Name.identifier(method.getName()), Name.identifier(method.getName()),
DescriptorKindUtils.flagsToKind(method.getJetMethod().kind()) DescriptorKindUtils.flagsToKind(method.getJetMethod().kind())
); );
@@ -91,15 +118,15 @@ public final class FunctionResolver {
String context = "method " + method.getName() + " in class " + psiClass.getQualifiedName(); String context = "method " + method.getName() + " in class " + psiClass.getQualifiedName();
List<TypeParameterDescriptor> methodTypeParameters = List<TypeParameterDescriptor> methodTypeParameters =
javaDescriptorResolver.getJavaDescriptorSignatureResolver().resolveMethodTypeParameters(method, signatureResolver.resolveMethodTypeParameters(method,
functionDescriptorImpl); functionDescriptorImpl);
TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters, TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters,
functionDescriptorImpl, functionDescriptorImpl,
context); context);
JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors = javaDescriptorResolver JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors = parameterResolver
.resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver); .resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
JetType returnType = makeReturnType(returnPsiType, method, methodTypeVariableResolver); JetType returnType = makeReturnType(returnPsiType, method, methodTypeVariableResolver);
@@ -112,8 +139,8 @@ public final class FunctionResolver {
methodTypeParameters = alternativeMethodSignatureData.getTypeParameters(); methodTypeParameters = alternativeMethodSignatureData.getTypeParameters();
} }
else if (alternativeMethodSignatureData.hasErrors()) { else if (alternativeMethodSignatureData.hasErrors()) {
javaDescriptorResolver.getTrace().record(BindingContext.ALTERNATIVE_SIGNATURE_DATA_ERROR, functionDescriptorImpl, trace.record(BindingContext.ALTERNATIVE_SIGNATURE_DATA_ERROR, functionDescriptorImpl,
alternativeMethodSignatureData.getError()); alternativeMethodSignatureData.getError());
} }
functionDescriptorImpl.initialize( functionDescriptorImpl.initialize(
@@ -128,11 +155,11 @@ public final class FunctionResolver {
); );
if (functionDescriptorImpl.getKind() == CallableMemberDescriptor.Kind.DECLARATION) { if (functionDescriptorImpl.getKind() == CallableMemberDescriptor.Kind.DECLARATION) {
BindingContextUtils.recordFunctionDeclarationToDescriptor(javaDescriptorResolver.getTrace(), psiMethod, functionDescriptorImpl); BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, psiMethod, functionDescriptorImpl);
} }
if (!scopeData.isKotlin()) { if (!scopeData.isKotlin()) {
javaDescriptorResolver.getTrace().record(BindingContext.IS_DECLARED_IN_JAVA, functionDescriptorImpl); trace.record(BindingContext.IS_DECLARED_IN_JAVA, functionDescriptorImpl);
} }
if (containingClass != psiClass && !method.isStatic()) { if (containingClass != psiClass && !method.isStatic()) {
@@ -181,7 +208,7 @@ public final class FunctionResolver {
}); });
} }
OverrideResolver.resolveUnknownVisibilities(functions, javaDescriptorResolver.getTrace()); OverrideResolver.resolveUnknownVisibilities(functions, trace);
functions.addAll(functionsFromCurrent); functions.addAll(functionsFromCurrent);
if (DescriptorUtils.isEnumClassObject(owner)) { if (DescriptorUtils.isEnumClassObject(owner)) {
@@ -227,11 +254,10 @@ public final class FunctionResolver {
JetType transformedType; JetType transformedType;
if (returnTypeFromAnnotation.length() > 0) { if (returnTypeFromAnnotation.length() > 0) {
transformedType = javaDescriptorResolver.getSemanticServices() transformedType = typeTransformer.transformToType(returnTypeFromAnnotation, typeVariableResolver);
.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
} }
else { else {
transformedType = javaDescriptorResolver.getSemanticServices().getTypeTransformer().transformToType( transformedType = typeTransformer.transformToType(
returnType, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_COVARIANT, typeVariableResolver); returnType, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_COVARIANT, typeVariableResolver);
} }
@@ -24,18 +24,23 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import javax.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public final class InnerClassResolver { public final class InnerClassResolver {
private final JavaDescriptorResolver javaDescriptorResolver;
public InnerClassResolver(JavaDescriptorResolver javaDescriptorResolver) { private ClassResolver classResolver;
this.javaDescriptorResolver = javaDescriptorResolver;
public InnerClassResolver() {
}
@Inject
public void setClassResolver(ClassResolver classResolver) {
this.classResolver = classResolver;
} }
public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) { public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
@@ -83,8 +88,7 @@ public final class InnerClassResolver {
private ClassDescriptor resolveInnerClass(@NotNull PsiClass innerPsiClass) { private ClassDescriptor resolveInnerClass(@NotNull PsiClass innerPsiClass) {
String name = innerPsiClass.getQualifiedName(); String name = innerPsiClass.getQualifiedName();
assert name != null : "Inner class has no qualified name"; assert name != null : "Inner class has no qualified name";
ClassDescriptor classDescriptor = ClassDescriptor classDescriptor = classResolver.resolveClass(new FqName(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
javaDescriptorResolver.resolveClass(new FqName(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
assert classDescriptor != null : "Couldn't resolve class " + name; assert classDescriptor != null : "Couldn't resolve class " + name;
return classDescriptor; return classDescriptor;
} }
@@ -27,20 +27,30 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils; import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
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 javax.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
public final class JavaAnnotationResolver { public final class JavaAnnotationResolver {
private final JavaDescriptorResolver javaDescriptorResolver; private ClassResolver classResolver;
private CompileTimeConstResolver compileTimeConstResolver;
public JavaAnnotationResolver(JavaDescriptorResolver javaDescriptorResolver) { public JavaAnnotationResolver() {
this.javaDescriptorResolver = javaDescriptorResolver; }
@Inject
public void setClassResolver(ClassResolver classResolver) {
this.classResolver = classResolver;
}
@Inject
public void setCompileTimeConstResolver(CompileTimeConstResolver compileTimeConstResolver) {
this.compileTimeConstResolver = compileTimeConstResolver;
} }
public List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner, @NotNull List<Runnable> tasks) { public List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner, @NotNull List<Runnable> tasks) {
@@ -79,7 +89,7 @@ public final class JavaAnnotationResolver {
FqName annotationFqName = new FqName(qname); FqName annotationFqName = new FqName(qname);
final ClassDescriptor clazz = final ClassDescriptor clazz =
javaDescriptorResolver.resolveClass(annotationFqName, DescriptorSearchRule.INCLUDE_KOTLIN, taskList); classResolver.resolveClass(annotationFqName, DescriptorSearchRule.INCLUDE_KOTLIN, taskList);
if (clazz == null) { if (clazz == null) {
return null; return null;
} }
@@ -101,7 +111,7 @@ public final class JavaAnnotationResolver {
assert value != null; assert value != null;
CompileTimeConstant compileTimeConst = CompileTimeConstant compileTimeConst =
javaDescriptorResolver.getCompileTimeConstFromExpression(annotationFqName, identifier, value, taskList); compileTimeConstResolver.getCompileTimeConstFromExpression(annotationFqName, identifier, value, taskList);
if (compileTimeConst != null) { if (compileTimeConst != null) {
ValueParameterDescriptor valueParameterDescriptor = ValueParameterDescriptor valueParameterDescriptor =
DescriptorResolverUtils.getValueParameterDescriptorForAnnotationParameter(identifier, clazz); DescriptorResolverUtils.getValueParameterDescriptorForAnnotationParameter(identifier, clazz);
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptorParent; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptorParent;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.data.ResolverNamespaceData; import org.jetbrains.jet.lang.resolve.java.data.ResolverNamespaceData;
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor;
@@ -33,6 +34,7 @@ import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope;
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 javax.inject.Inject;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
@@ -41,19 +43,33 @@ public final class NamespaceResolver {
@NotNull @NotNull
public static final ModuleDescriptor FAKE_ROOT_MODULE = new ModuleDescriptor(JavaDescriptorResolver.JAVA_ROOT); public static final ModuleDescriptor FAKE_ROOT_MODULE = new ModuleDescriptor(JavaDescriptorResolver.JAVA_ROOT);
@NotNull @NotNull
private final JavaDescriptorResolver javaDescriptorResolver;
@NotNull
private final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap(); private final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
private PsiClassFinder psiClassFinder;
private BindingTrace trace;
private JavaSemanticServices javaSemanticServices;
public NamespaceResolver(@NotNull JavaDescriptorResolver javaDescriptorResolver) { public NamespaceResolver() {
this.javaDescriptorResolver = javaDescriptorResolver; }
@Inject
public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
this.psiClassFinder = psiClassFinder;
}
@Inject
public void setTrace(BindingTrace trace) {
this.trace = trace;
}
@Inject
public void setJavaSemanticServices(JavaSemanticServices javaSemanticServices) {
this.javaSemanticServices = javaSemanticServices;
} }
@Nullable @Nullable
public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) { public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
// First, let's check that there is no Kotlin package: // First, let's check that there is no Kotlin package:
NamespaceDescriptor kotlinNamespaceDescriptor = NamespaceDescriptor kotlinNamespaceDescriptor = javaSemanticServices.getKotlinNamespaceDescriptor(qualifiedName);
javaDescriptorResolver.getSemanticServices().getKotlinNamespaceDescriptor(qualifiedName);
if (kotlinNamespaceDescriptor != null) { if (kotlinNamespaceDescriptor != null) {
return searchRule.processFoundInKotlin(kotlinNamespaceDescriptor); return searchRule.processFoundInKotlin(kotlinNamespaceDescriptor);
} }
@@ -79,7 +95,7 @@ public final class NamespaceResolver {
return null; return null;
} }
javaDescriptorResolver.getTrace().record(BindingContext.NAMESPACE, scopeData.getPsiPackageOrPsiClass(), ns); trace.record(BindingContext.NAMESPACE, scopeData.getPsiPackageOrPsiClass(), ns);
ns.setMemberScope(scopeData.getMemberScope()); ns.setMemberScope(scopeData.getMemberScope());
@@ -112,15 +128,15 @@ public final class NamespaceResolver {
lookingForPsi: lookingForPsi:
{ {
psiClass = getPsiClassForJavaPackageScope(fqName); psiClass = getPsiClassForJavaPackageScope(fqName);
psiPackage = javaDescriptorResolver.getSemanticServices().getPsiClassFinder().findPsiPackage(fqName); psiPackage = psiClassFinder.findPsiPackage(fqName);
if (psiClass != null || psiPackage != null) { if (psiClass != null || psiPackage != null) {
javaDescriptorResolver.getTrace().record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.PROPER); trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.PROPER);
break lookingForPsi; break lookingForPsi;
} }
psiClass = javaDescriptorResolver.getPsiClassFinder().findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE); psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
if (psiClass != null && !psiClass.isEnum()) { if (psiClass != null && !psiClass.isEnum()) {
javaDescriptorResolver.getTrace().record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.CLASS_STATICS); trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.CLASS_STATICS);
break lookingForPsi; break lookingForPsi;
} }
@@ -135,7 +151,7 @@ public final class NamespaceResolver {
ResolverNamespaceData namespaceData = ResolverNamespaceData namespaceData =
new ResolverNamespaceData(psiClass, psiPackage, fqName, ns); new ResolverNamespaceData(psiClass, psiPackage, fqName, ns);
namespaceData.setMemberScope(new JavaPackageScope(fqName, javaDescriptorResolver.getSemanticServices(), namespaceData)); namespaceData.setMemberScope(new JavaPackageScope(fqName, javaSemanticServices, namespaceData));
ResolverNamespaceData oldValue = ResolverNamespaceData oldValue =
namespaceDescriptorCacheByFqn.put(fqName, namespaceData); namespaceDescriptorCacheByFqn.put(fqName, namespaceData);
@@ -169,7 +185,7 @@ public final class NamespaceResolver {
@Nullable @Nullable
private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) { private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
return javaDescriptorResolver.getPsiClassFinder() return psiClassFinder.findPsiClass(packageFQN.child(Name.identifier(JvmAbi.PACKAGE_CLASS)),
.findPsiClass(packageFQN.child(Name.identifier(JvmAbi.PACKAGE_CLASS)), PsiClassFinder.RuntimeClassesHandleMode.IGNORE); PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
} }
} }
@@ -40,10 +40,45 @@ 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;
import javax.inject.Inject;
import java.util.*; import java.util.*;
public final class PropertiesResolver { public final class PropertiesResolver {
private JavaSemanticServices semanticServices;
private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver;
private BindingTrace trace;
private JavaAnnotationResolver annotationResolver;
private ClassResolver classResolver;
public PropertiesResolver() {
}
@Inject
public void setSemanticServices(JavaSemanticServices semanticServices) {
this.semanticServices = semanticServices;
}
@Inject
public void setTrace(BindingTrace trace) {
this.trace = trace;
}
@Inject
public void setJavaDescriptorSignatureResolver(JavaDescriptorSignatureResolver javaDescriptorSignatureResolver) {
this.javaDescriptorSignatureResolver = javaDescriptorSignatureResolver;
}
@Inject
public void setAnnotationResolver(JavaAnnotationResolver annotationResolver) {
this.annotationResolver = annotationResolver;
}
@Inject
public void setClassResolver(ClassResolver classResolver) {
this.classResolver = classResolver;
}
public Set<VariableDescriptor> resolveFieldGroupByName( public Set<VariableDescriptor> resolveFieldGroupByName(
@NotNull Name fieldName, @NotNull Name fieldName,
@NotNull ResolverScopeData scopeData @NotNull ResolverScopeData scopeData
@@ -87,7 +122,6 @@ public final class PropertiesResolver {
return descriptors; return descriptors;
} }
private static class GroupingValue { private static class GroupingValue {
PropertyAccessorData getter; PropertyAccessorData getter;
PropertyAccessorData setter; PropertyAccessorData setter;
@@ -95,31 +129,6 @@ public final class PropertiesResolver {
boolean ext; boolean ext;
} }
private final JavaDescriptorResolver javaDescriptorResolver;
private JavaSemanticServices semanticServices;
private JavaDescriptorSignatureResolver javaDescriptorSignatureResolver;
private BindingTrace trace;
/* internal */
public PropertiesResolver(JavaDescriptorResolver resolver) {
this.javaDescriptorResolver = resolver;
}
/* internal */
public void setSemanticServices(JavaSemanticServices semanticServices) {
this.semanticServices = semanticServices;
}
/* internal */
public void setTrace(BindingTrace trace) {
this.trace = trace;
}
/* internal */
public void setJavaDescriptorSignatureResolver(JavaDescriptorSignatureResolver javaDescriptorSignatureResolver) {
this.javaDescriptorSignatureResolver = javaDescriptorSignatureResolver;
}
private void resolveNamedGroupProperties( private void resolveNamedGroupProperties(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull ClassOrNamespaceDescriptor owner,
@NotNull ResolverScopeData scopeData, @NotNull ResolverScopeData scopeData,
@@ -166,7 +175,7 @@ public final class PropertiesResolver {
boolean isPropertyForNamedObject = members.field != null && JvmAbi.INSTANCE_FIELD.equals(members.field.getMember().getName()); boolean isPropertyForNamedObject = members.field != null && JvmAbi.INSTANCE_FIELD.equals(members.field.getMember().getName());
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
realOwner, realOwner,
javaDescriptorResolver.resolveAnnotations(characteristicMember.getMember().getPsiMember()), annotationResolver.resolveAnnotations(characteristicMember.getMember().getPsiMember()),
DescriptorResolverUtils DescriptorResolverUtils
.resolveModality(characteristicMember.getMember(), isFinal || isEnumEntry || isPropertyForNamedObject), .resolveModality(characteristicMember.getMember(), isFinal || isEnumEntry || isPropertyForNamedObject),
visibility, visibility,
@@ -194,7 +203,7 @@ public final class PropertiesResolver {
if (members.getter != null) { if (members.getter != null) {
getterDescriptor = new PropertyGetterDescriptor( getterDescriptor = new PropertyGetterDescriptor(
propertyDescriptor, propertyDescriptor,
javaDescriptorResolver.resolveAnnotations(members.getter.getMember().getPsiMember()), annotationResolver.resolveAnnotations(members.getter.getMember().getPsiMember()),
Modality.OPEN, Modality.OPEN,
visibility, visibility,
true, true,
@@ -212,7 +221,7 @@ public final class PropertiesResolver {
} }
setterDescriptor = new PropertySetterDescriptor( setterDescriptor = new PropertySetterDescriptor(
propertyDescriptor, propertyDescriptor,
javaDescriptorResolver.resolveAnnotations(members.setter.getMember().getPsiMember()), annotationResolver.resolveAnnotations(members.setter.getMember().getPsiMember()),
Modality.OPEN, Modality.OPEN,
setterVisibility, setterVisibility,
true, true,
@@ -458,7 +467,7 @@ public final class PropertiesResolver {
if (psiClass != null && psiClass.isEnum() && isStatic) { if (psiClass != null && psiClass.isEnum() && isStatic) {
final String qualifiedName = psiClass.getQualifiedName(); final String qualifiedName = psiClass.getQualifiedName();
assert qualifiedName != null; assert qualifiedName != null;
final ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(new FqName(qualifiedName)); final ClassDescriptor classDescriptor = classResolver.resolveClass(new FqName(qualifiedName));
assert classDescriptor != null; assert classDescriptor != null;
final ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor(); final ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor();
assert classObjectDescriptor != null; assert classObjectDescriptor != null;
@@ -34,16 +34,16 @@ import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import javax.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
public final class ValueParameterResolver { public final class ValueParameterResolver {
private final JavaDescriptorResolver javaDescriptorResolver; private JavaTypeTransformer typeTransformer;
public ValueParameterResolver(JavaDescriptorResolver javaDescriptorResolver) { public ValueParameterResolver() {
this.javaDescriptorResolver = javaDescriptorResolver;
} }
@NotNull @NotNull
@@ -71,12 +71,11 @@ public final class ValueParameterResolver {
JetType outType; JetType outType;
if (typeFromAnnotation.length() > 0) { if (typeFromAnnotation.length() > 0) {
outType = javaDescriptorResolver.getSemanticServices().getTypeTransformer() outType = getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
.transformToType(typeFromAnnotation, typeVariableResolver);
} }
else { else {
outType = javaDescriptorResolver.getSemanticServices().getTypeTransformer() outType = getTypeTransformer().transformToType(psiType, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT,
.transformToType(psiType, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT, typeVariableResolver); typeVariableResolver);
} }
JetType varargElementType; JetType varargElementType;
@@ -115,6 +114,16 @@ public final class ValueParameterResolver {
} }
} }
@NotNull
private JavaTypeTransformer getTypeTransformer() {
return typeTransformer;
}
@Inject
public void setTypeTransformer(JavaTypeTransformer typeTransformer) {
this.typeTransformer = typeTransformer;
}
@NotNull @NotNull
private static String getParameterName(int number, @NotNull PsiParameterWrapper parameter) { private static String getParameterName(int number, @NotNull PsiParameterWrapper parameter) {
String psiParameterName = parameter.getPsiParameter().getName(); String psiParameterName = parameter.getPsiParameter().getName();