move BindingTrace to Injector from TopDownAnalysisContext
It is necessary to make NamespaceFactoryImpl independent from TopDownAnalysisContext
This commit is contained in:
+22
-12
@@ -25,10 +25,10 @@ import org.jetbrains.jet.lang.resolve.DeclarationsChecker;
|
|||||||
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
||||||
|
import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||||
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
|
||||||
import org.jetbrains.jet.lang.resolve.DeclarationResolver;
|
import org.jetbrains.jet.lang.resolve.DeclarationResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
|
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
||||||
@@ -46,9 +46,9 @@ import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
|||||||
import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
|
import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
||||||
|
import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||||
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
|
/* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
|
||||||
@@ -62,15 +62,15 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
private DescriptorResolver descriptorResolver;
|
private DescriptorResolver descriptorResolver;
|
||||||
private final Project project;
|
private final Project project;
|
||||||
private final TopDownAnalysisParameters topDownAnalysisParameters;
|
private final TopDownAnalysisParameters topDownAnalysisParameters;
|
||||||
|
private final ObservableBindingTrace observableBindingTrace;
|
||||||
private JavaBridgeConfiguration javaBridgeConfiguration;
|
private JavaBridgeConfiguration javaBridgeConfiguration;
|
||||||
private final BindingTrace bindingTrace;
|
|
||||||
|
|
||||||
public InjectorForTopDownAnalyzerForJvm(
|
public InjectorForTopDownAnalyzerForJvm(
|
||||||
@NotNull Project project,
|
@NotNull Project project,
|
||||||
@NotNull TopDownAnalysisParameters topDownAnalysisParameters,
|
@NotNull TopDownAnalysisParameters topDownAnalysisParameters,
|
||||||
|
@NotNull ObservableBindingTrace observableBindingTrace,
|
||||||
@NotNull ModuleDescriptor moduleDescriptor,
|
@NotNull ModuleDescriptor moduleDescriptor,
|
||||||
JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory,
|
JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory
|
||||||
@NotNull BindingTrace bindingTrace
|
|
||||||
) {
|
) {
|
||||||
this.topDownAnalyzer = new TopDownAnalyzer();
|
this.topDownAnalyzer = new TopDownAnalyzer();
|
||||||
this.topDownAnalysisContext = new TopDownAnalysisContext();
|
this.topDownAnalysisContext = new TopDownAnalysisContext();
|
||||||
@@ -80,8 +80,8 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
this.descriptorResolver = new DescriptorResolver();
|
this.descriptorResolver = new DescriptorResolver();
|
||||||
this.project = project;
|
this.project = project;
|
||||||
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
||||||
|
this.observableBindingTrace = observableBindingTrace;
|
||||||
this.javaBridgeConfiguration = new JavaBridgeConfiguration();
|
this.javaBridgeConfiguration = new JavaBridgeConfiguration();
|
||||||
this.bindingTrace = bindingTrace;
|
|
||||||
DeclarationResolver declarationResolver = new DeclarationResolver();
|
DeclarationResolver declarationResolver = new DeclarationResolver();
|
||||||
AnnotationResolver annotationResolver = new AnnotationResolver();
|
AnnotationResolver annotationResolver = new AnnotationResolver();
|
||||||
CallResolver callResolver = new CallResolver();
|
CallResolver callResolver = new CallResolver();
|
||||||
@@ -110,6 +110,7 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
this.topDownAnalyzer.setOverloadResolver(overloadResolver);
|
this.topDownAnalyzer.setOverloadResolver(overloadResolver);
|
||||||
this.topDownAnalyzer.setOverrideResolver(overrideResolver);
|
this.topDownAnalyzer.setOverrideResolver(overrideResolver);
|
||||||
this.topDownAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
this.topDownAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
|
this.topDownAnalyzer.setTrace(observableBindingTrace);
|
||||||
this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);
|
this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);
|
||||||
|
|
||||||
this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
@@ -119,12 +120,15 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
this.bodyResolver.setDescriptorResolver(descriptorResolver);
|
this.bodyResolver.setDescriptorResolver(descriptorResolver);
|
||||||
this.bodyResolver.setExpressionTypingServices(expressionTypingServices);
|
this.bodyResolver.setExpressionTypingServices(expressionTypingServices);
|
||||||
this.bodyResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
this.bodyResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
|
this.bodyResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
this.controlFlowAnalyzer.setContext(topDownAnalysisContext);
|
this.controlFlowAnalyzer.setContext(topDownAnalysisContext);
|
||||||
this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory);
|
this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory);
|
||||||
this.controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
this.controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
|
this.controlFlowAnalyzer.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
this.declarationsChecker.setContext(topDownAnalysisContext);
|
this.declarationsChecker.setContext(topDownAnalysisContext);
|
||||||
|
this.declarationsChecker.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
this.descriptorResolver.setAnnotationResolver(annotationResolver);
|
this.descriptorResolver.setAnnotationResolver(annotationResolver);
|
||||||
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
|
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
|
||||||
@@ -137,6 +141,7 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
declarationResolver.setContext(topDownAnalysisContext);
|
declarationResolver.setContext(topDownAnalysisContext);
|
||||||
declarationResolver.setDescriptorResolver(descriptorResolver);
|
declarationResolver.setDescriptorResolver(descriptorResolver);
|
||||||
declarationResolver.setImportsResolver(importsResolver);
|
declarationResolver.setImportsResolver(importsResolver);
|
||||||
|
declarationResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
annotationResolver.setCallResolver(callResolver);
|
annotationResolver.setCallResolver(callResolver);
|
||||||
annotationResolver.setExpressionTypingServices(expressionTypingServices);
|
annotationResolver.setExpressionTypingServices(expressionTypingServices);
|
||||||
@@ -156,25 +161,30 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
|
|
||||||
importsResolver.setConfiguration(javaBridgeConfiguration);
|
importsResolver.setConfiguration(javaBridgeConfiguration);
|
||||||
importsResolver.setContext(topDownAnalysisContext);
|
importsResolver.setContext(topDownAnalysisContext);
|
||||||
|
importsResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
delegationResolver.setContext(topDownAnalysisContext);
|
delegationResolver.setContext(topDownAnalysisContext);
|
||||||
|
delegationResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
namespaceFactoryImpl.setConfiguration(javaBridgeConfiguration);
|
namespaceFactoryImpl.setConfiguration(javaBridgeConfiguration);
|
||||||
namespaceFactoryImpl.setContext(topDownAnalysisContext);
|
|
||||||
namespaceFactoryImpl.setModuleDescriptor(moduleDescriptor);
|
namespaceFactoryImpl.setModuleDescriptor(moduleDescriptor);
|
||||||
|
namespaceFactoryImpl.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
overloadResolver.setContext(topDownAnalysisContext);
|
overloadResolver.setContext(topDownAnalysisContext);
|
||||||
|
overloadResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
overrideResolver.setContext(topDownAnalysisContext);
|
overrideResolver.setContext(topDownAnalysisContext);
|
||||||
overrideResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
overrideResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
|
overrideResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
typeHierarchyResolver.setContext(topDownAnalysisContext);
|
typeHierarchyResolver.setContext(topDownAnalysisContext);
|
||||||
typeHierarchyResolver.setDescriptorResolver(descriptorResolver);
|
typeHierarchyResolver.setDescriptorResolver(descriptorResolver);
|
||||||
typeHierarchyResolver.setImportsResolver(importsResolver);
|
typeHierarchyResolver.setImportsResolver(importsResolver);
|
||||||
typeHierarchyResolver.setNamespaceFactory(namespaceFactoryImpl);
|
typeHierarchyResolver.setNamespaceFactory(namespaceFactoryImpl);
|
||||||
|
typeHierarchyResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
javaSemanticServices.setDescriptorResolver(javaDescriptorResolver);
|
||||||
javaSemanticServices.setTrace(bindingTrace);
|
javaSemanticServices.setTrace(observableBindingTrace);
|
||||||
javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
javaSemanticServices.setTypeTransformer(javaTypeTransformer);
|
||||||
|
|
||||||
javaDescriptorResolver.setProject(project);
|
javaDescriptorResolver.setProject(project);
|
||||||
@@ -217,12 +227,12 @@ public class InjectorForTopDownAnalyzerForJvm {
|
|||||||
return this.topDownAnalysisParameters;
|
return this.topDownAnalysisParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ObservableBindingTrace getObservableBindingTrace() {
|
||||||
|
return this.observableBindingTrace;
|
||||||
|
}
|
||||||
|
|
||||||
public JavaBridgeConfiguration getJavaBridgeConfiguration() {
|
public JavaBridgeConfiguration getJavaBridgeConfiguration() {
|
||||||
return this.javaBridgeConfiguration;
|
return this.javaBridgeConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BindingTrace getBindingTrace() {
|
|
||||||
return this.bindingTrace;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.diagnostics.Errors;
|
|||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -150,11 +151,12 @@ public class AnalyzerFacadeForJVM {
|
|||||||
final ModuleDescriptor owner = new ModuleDescriptor("<module>");
|
final ModuleDescriptor owner = new ModuleDescriptor("<module>");
|
||||||
|
|
||||||
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(
|
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(
|
||||||
filesToAnalyzeCompletely, false, false, bindingTraceContext);
|
filesToAnalyzeCompletely, false, false);
|
||||||
|
|
||||||
|
|
||||||
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(
|
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(
|
||||||
project, topDownAnalysisParameters, owner, flowDataTraceFactory, bindingTraceContext);
|
project, topDownAnalysisParameters,
|
||||||
|
new ObservableBindingTrace(bindingTraceContext), owner, flowDataTraceFactory);
|
||||||
|
|
||||||
|
|
||||||
injector.getTopDownAnalyzer().doAnalyzeFilesWithGivenTrance2(files);
|
injector.getTopDownAnalyzer().doAnalyzeFilesWithGivenTrance2(files);
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.resolve.DeclarationsChecker;
|
|||||||
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
||||||
|
import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||||
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
||||||
import org.jetbrains.jet.lang.ModuleConfiguration;
|
import org.jetbrains.jet.lang.ModuleConfiguration;
|
||||||
@@ -42,6 +43,7 @@ import org.jetbrains.jet.lang.resolve.OverrideResolver;
|
|||||||
import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
|
import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
|
||||||
|
import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
|
||||||
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
||||||
import org.jetbrains.jet.lang.ModuleConfiguration;
|
import org.jetbrains.jet.lang.ModuleConfiguration;
|
||||||
@@ -58,10 +60,12 @@ public class InjectorForTopDownAnalyzerBasic {
|
|||||||
private DescriptorResolver descriptorResolver;
|
private DescriptorResolver descriptorResolver;
|
||||||
private final Project project;
|
private final Project project;
|
||||||
private final TopDownAnalysisParameters topDownAnalysisParameters;
|
private final TopDownAnalysisParameters topDownAnalysisParameters;
|
||||||
|
private final ObservableBindingTrace observableBindingTrace;
|
||||||
|
|
||||||
public InjectorForTopDownAnalyzerBasic(
|
public InjectorForTopDownAnalyzerBasic(
|
||||||
@NotNull Project project,
|
@NotNull Project project,
|
||||||
@NotNull TopDownAnalysisParameters topDownAnalysisParameters,
|
@NotNull TopDownAnalysisParameters topDownAnalysisParameters,
|
||||||
|
@NotNull ObservableBindingTrace observableBindingTrace,
|
||||||
@NotNull ModuleDescriptor moduleDescriptor,
|
@NotNull ModuleDescriptor moduleDescriptor,
|
||||||
JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory,
|
JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory,
|
||||||
@NotNull ModuleConfiguration moduleConfiguration
|
@NotNull ModuleConfiguration moduleConfiguration
|
||||||
@@ -74,6 +78,7 @@ public class InjectorForTopDownAnalyzerBasic {
|
|||||||
this.descriptorResolver = new DescriptorResolver();
|
this.descriptorResolver = new DescriptorResolver();
|
||||||
this.project = project;
|
this.project = project;
|
||||||
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
||||||
|
this.observableBindingTrace = observableBindingTrace;
|
||||||
DeclarationResolver declarationResolver = new DeclarationResolver();
|
DeclarationResolver declarationResolver = new DeclarationResolver();
|
||||||
AnnotationResolver annotationResolver = new AnnotationResolver();
|
AnnotationResolver annotationResolver = new AnnotationResolver();
|
||||||
CallResolver callResolver = new CallResolver();
|
CallResolver callResolver = new CallResolver();
|
||||||
@@ -99,6 +104,7 @@ public class InjectorForTopDownAnalyzerBasic {
|
|||||||
this.topDownAnalyzer.setOverloadResolver(overloadResolver);
|
this.topDownAnalyzer.setOverloadResolver(overloadResolver);
|
||||||
this.topDownAnalyzer.setOverrideResolver(overrideResolver);
|
this.topDownAnalyzer.setOverrideResolver(overrideResolver);
|
||||||
this.topDownAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
this.topDownAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
|
this.topDownAnalyzer.setTrace(observableBindingTrace);
|
||||||
this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);
|
this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);
|
||||||
|
|
||||||
this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
this.topDownAnalysisContext.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
@@ -108,12 +114,15 @@ public class InjectorForTopDownAnalyzerBasic {
|
|||||||
this.bodyResolver.setDescriptorResolver(descriptorResolver);
|
this.bodyResolver.setDescriptorResolver(descriptorResolver);
|
||||||
this.bodyResolver.setExpressionTypingServices(expressionTypingServices);
|
this.bodyResolver.setExpressionTypingServices(expressionTypingServices);
|
||||||
this.bodyResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
this.bodyResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
|
this.bodyResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
this.controlFlowAnalyzer.setContext(topDownAnalysisContext);
|
this.controlFlowAnalyzer.setContext(topDownAnalysisContext);
|
||||||
this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory);
|
this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory);
|
||||||
this.controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
this.controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
|
this.controlFlowAnalyzer.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
this.declarationsChecker.setContext(topDownAnalysisContext);
|
this.declarationsChecker.setContext(topDownAnalysisContext);
|
||||||
|
this.declarationsChecker.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
this.descriptorResolver.setAnnotationResolver(annotationResolver);
|
this.descriptorResolver.setAnnotationResolver(annotationResolver);
|
||||||
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
|
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
|
||||||
@@ -123,6 +132,7 @@ public class InjectorForTopDownAnalyzerBasic {
|
|||||||
declarationResolver.setContext(topDownAnalysisContext);
|
declarationResolver.setContext(topDownAnalysisContext);
|
||||||
declarationResolver.setDescriptorResolver(descriptorResolver);
|
declarationResolver.setDescriptorResolver(descriptorResolver);
|
||||||
declarationResolver.setImportsResolver(importsResolver);
|
declarationResolver.setImportsResolver(importsResolver);
|
||||||
|
declarationResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
annotationResolver.setCallResolver(callResolver);
|
annotationResolver.setCallResolver(callResolver);
|
||||||
annotationResolver.setExpressionTypingServices(expressionTypingServices);
|
annotationResolver.setExpressionTypingServices(expressionTypingServices);
|
||||||
@@ -142,22 +152,27 @@ public class InjectorForTopDownAnalyzerBasic {
|
|||||||
|
|
||||||
importsResolver.setConfiguration(moduleConfiguration);
|
importsResolver.setConfiguration(moduleConfiguration);
|
||||||
importsResolver.setContext(topDownAnalysisContext);
|
importsResolver.setContext(topDownAnalysisContext);
|
||||||
|
importsResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
delegationResolver.setContext(topDownAnalysisContext);
|
delegationResolver.setContext(topDownAnalysisContext);
|
||||||
|
delegationResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
namespaceFactoryImpl.setConfiguration(moduleConfiguration);
|
namespaceFactoryImpl.setConfiguration(moduleConfiguration);
|
||||||
namespaceFactoryImpl.setContext(topDownAnalysisContext);
|
|
||||||
namespaceFactoryImpl.setModuleDescriptor(moduleDescriptor);
|
namespaceFactoryImpl.setModuleDescriptor(moduleDescriptor);
|
||||||
|
namespaceFactoryImpl.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
overloadResolver.setContext(topDownAnalysisContext);
|
overloadResolver.setContext(topDownAnalysisContext);
|
||||||
|
overloadResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
overrideResolver.setContext(topDownAnalysisContext);
|
overrideResolver.setContext(topDownAnalysisContext);
|
||||||
overrideResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
overrideResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
|
||||||
|
overrideResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
typeHierarchyResolver.setContext(topDownAnalysisContext);
|
typeHierarchyResolver.setContext(topDownAnalysisContext);
|
||||||
typeHierarchyResolver.setDescriptorResolver(descriptorResolver);
|
typeHierarchyResolver.setDescriptorResolver(descriptorResolver);
|
||||||
typeHierarchyResolver.setImportsResolver(importsResolver);
|
typeHierarchyResolver.setImportsResolver(importsResolver);
|
||||||
typeHierarchyResolver.setNamespaceFactory(namespaceFactoryImpl);
|
typeHierarchyResolver.setNamespaceFactory(namespaceFactoryImpl);
|
||||||
|
typeHierarchyResolver.setTrace(observableBindingTrace);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,4 +208,8 @@ public class InjectorForTopDownAnalyzerBasic {
|
|||||||
return this.topDownAnalysisParameters;
|
return this.topDownAnalysisParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ObservableBindingTrace getObservableBindingTrace() {
|
||||||
|
return this.observableBindingTrace;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ public class BodyResolver {
|
|||||||
private ExpressionTypingServices expressionTypingServices;
|
private ExpressionTypingServices expressionTypingServices;
|
||||||
@NotNull
|
@NotNull
|
||||||
private CallResolver callResolver;
|
private CallResolver callResolver;
|
||||||
|
@NotNull
|
||||||
|
private ObservableBindingTrace trace;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -89,6 +91,10 @@ public class BodyResolver {
|
|||||||
this.callResolver = callResolver;
|
this.callResolver = callResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(@NotNull ObservableBindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -124,7 +130,7 @@ public class BodyResolver {
|
|||||||
final ConstructorDescriptor primaryConstructor = descriptor.getUnsubstitutedPrimaryConstructor();
|
final ConstructorDescriptor primaryConstructor = descriptor.getUnsubstitutedPrimaryConstructor();
|
||||||
final JetScope scopeForConstructor = primaryConstructor == null
|
final JetScope scopeForConstructor = primaryConstructor == null
|
||||||
? null
|
? null
|
||||||
: FunctionDescriptorUtil.getFunctionInnerScope(descriptor.getScopeForSupertypeResolution(), primaryConstructor, context.getTrace());
|
: FunctionDescriptorUtil.getFunctionInnerScope(descriptor.getScopeForSupertypeResolution(), primaryConstructor, trace);
|
||||||
final ExpressionTypingServices typeInferrer = expressionTypingServices; // TODO : flow
|
final ExpressionTypingServices typeInferrer = expressionTypingServices; // TODO : flow
|
||||||
|
|
||||||
final Map<JetTypeReference, JetType> supertypes = Maps.newLinkedHashMap();
|
final Map<JetTypeReference, JetType> supertypes = Maps.newLinkedHashMap();
|
||||||
@@ -137,16 +143,16 @@ public class BodyResolver {
|
|||||||
@Override
|
@Override
|
||||||
public void visitDelegationByExpressionSpecifier(JetDelegatorByExpressionSpecifier specifier) {
|
public void visitDelegationByExpressionSpecifier(JetDelegatorByExpressionSpecifier specifier) {
|
||||||
if (descriptor.getKind() == ClassKind.TRAIT) {
|
if (descriptor.getKind() == ClassKind.TRAIT) {
|
||||||
context.getTrace().report(DELEGATION_IN_TRAIT.on(specifier));
|
trace.report(DELEGATION_IN_TRAIT.on(specifier));
|
||||||
}
|
}
|
||||||
JetType supertype = context.getTrace().getBindingContext().get(BindingContext.TYPE, specifier.getTypeReference());
|
JetType supertype = trace.getBindingContext().get(BindingContext.TYPE, specifier.getTypeReference());
|
||||||
recordSupertype(specifier.getTypeReference(), supertype);
|
recordSupertype(specifier.getTypeReference(), supertype);
|
||||||
if (supertype != null) {
|
if (supertype != null) {
|
||||||
DeclarationDescriptor declarationDescriptor = supertype.getConstructor().getDeclarationDescriptor();
|
DeclarationDescriptor declarationDescriptor = supertype.getConstructor().getDeclarationDescriptor();
|
||||||
if (declarationDescriptor instanceof ClassDescriptor) {
|
if (declarationDescriptor instanceof ClassDescriptor) {
|
||||||
ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor;
|
ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor;
|
||||||
if (classDescriptor.getKind() != ClassKind.TRAIT) {
|
if (classDescriptor.getKind() != ClassKind.TRAIT) {
|
||||||
context.getTrace().report(DELEGATION_NOT_TO_TRAIT.on(specifier.getTypeReference()));
|
trace.report(DELEGATION_NOT_TO_TRAIT.on(specifier.getTypeReference()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,9 +161,9 @@ public class BodyResolver {
|
|||||||
JetScope scope = scopeForConstructor == null
|
JetScope scope = scopeForConstructor == null
|
||||||
? descriptor.getScopeForMemberResolution()
|
? descriptor.getScopeForMemberResolution()
|
||||||
: scopeForConstructor;
|
: scopeForConstructor;
|
||||||
JetType type = typeInferrer.getType(scope, delegateExpression, NO_EXPECTED_TYPE, context.getTrace());
|
JetType type = typeInferrer.getType(scope, delegateExpression, NO_EXPECTED_TYPE, trace);
|
||||||
if (type != null && supertype != null && !JetTypeChecker.INSTANCE.isSubtypeOf(type, supertype)) {
|
if (type != null && supertype != null && !JetTypeChecker.INSTANCE.isSubtypeOf(type, supertype)) {
|
||||||
context.getTrace().report(TYPE_MISMATCH.on(delegateExpression, supertype, type));
|
trace.report(TYPE_MISMATCH.on(delegateExpression, supertype, type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,7 +173,7 @@ public class BodyResolver {
|
|||||||
JetValueArgumentList valueArgumentList = call.getValueArgumentList();
|
JetValueArgumentList valueArgumentList = call.getValueArgumentList();
|
||||||
PsiElement elementToMark = valueArgumentList == null ? call : valueArgumentList;
|
PsiElement elementToMark = valueArgumentList == null ? call : valueArgumentList;
|
||||||
if (descriptor.getKind() == ClassKind.TRAIT) {
|
if (descriptor.getKind() == ClassKind.TRAIT) {
|
||||||
context.getTrace().report(SUPERTYPE_INITIALIZED_IN_TRAIT.on(elementToMark));
|
trace.report(SUPERTYPE_INITIALIZED_IN_TRAIT.on(elementToMark));
|
||||||
}
|
}
|
||||||
JetTypeReference typeReference = call.getTypeReference();
|
JetTypeReference typeReference = call.getTypeReference();
|
||||||
if (typeReference == null) return;
|
if (typeReference == null) return;
|
||||||
@@ -176,7 +182,7 @@ public class BodyResolver {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
OverloadResolutionResults<FunctionDescriptor> results = callResolver.resolveFunctionCall(
|
OverloadResolutionResults<FunctionDescriptor> results = callResolver.resolveFunctionCall(
|
||||||
context.getTrace(), scopeForConstructor,
|
trace, scopeForConstructor,
|
||||||
CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE, DataFlowInfo.EMPTY);
|
CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE, DataFlowInfo.EMPTY);
|
||||||
if (results.isSuccess()) {
|
if (results.isSuccess()) {
|
||||||
JetType supertype = results.getResultingDescriptor().getReturnType();
|
JetType supertype = results.getResultingDescriptor().getReturnType();
|
||||||
@@ -184,19 +190,19 @@ public class BodyResolver {
|
|||||||
ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(supertype);
|
ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(supertype);
|
||||||
if (classDescriptor != null) {
|
if (classDescriptor != null) {
|
||||||
if (classDescriptor.getKind() == ClassKind.TRAIT) {
|
if (classDescriptor.getKind() == ClassKind.TRAIT) {
|
||||||
context.getTrace().report(CONSTRUCTOR_IN_TRAIT.on(elementToMark));
|
trace.report(CONSTRUCTOR_IN_TRAIT.on(elementToMark));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
recordSupertype(typeReference, context.getTrace().getBindingContext().get(BindingContext.TYPE, typeReference));
|
recordSupertype(typeReference, trace.getBindingContext().get(BindingContext.TYPE, typeReference));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitDelegationToSuperClassSpecifier(JetDelegatorToSuperClass specifier) {
|
public void visitDelegationToSuperClassSpecifier(JetDelegatorToSuperClass specifier) {
|
||||||
JetTypeReference typeReference = specifier.getTypeReference();
|
JetTypeReference typeReference = specifier.getTypeReference();
|
||||||
JetType supertype = context.getTrace().getBindingContext().get(BindingContext.TYPE, typeReference);
|
JetType supertype = trace.getBindingContext().get(BindingContext.TYPE, typeReference);
|
||||||
recordSupertype(typeReference, supertype);
|
recordSupertype(typeReference, supertype);
|
||||||
if (supertype == null) return;
|
if (supertype == null) return;
|
||||||
ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(supertype);
|
ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(supertype);
|
||||||
@@ -210,10 +216,10 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!hasConstructorWithoutParams) {
|
if (!hasConstructorWithoutParams) {
|
||||||
context.getTrace().report(SUPERTYPE_NOT_INITIALIZED.on(specifier));
|
trace.report(SUPERTYPE_NOT_INITIALIZED.on(specifier));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
context.getTrace().report(SUPERTYPE_NOT_INITIALIZED_DEFAULT.on(specifier));
|
trace.report(SUPERTYPE_NOT_INITIALIZED_DEFAULT.on(specifier));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -254,7 +260,7 @@ public class BodyResolver {
|
|||||||
if (classDescriptor != null) {
|
if (classDescriptor != null) {
|
||||||
if (classDescriptor.getKind() != ClassKind.TRAIT) {
|
if (classDescriptor.getKind() != ClassKind.TRAIT) {
|
||||||
if (classAppeared) {
|
if (classAppeared) {
|
||||||
context.getTrace().report(MANY_CLASSES_IN_SUPERTYPE_LIST.on(typeReference));
|
trace.report(MANY_CLASSES_IN_SUPERTYPE_LIST.on(typeReference));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
classAppeared = true;
|
classAppeared = true;
|
||||||
@@ -262,16 +268,16 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
context.getTrace().report(SUPERTYPE_NOT_A_CLASS_OR_TRAIT.on(typeReference));
|
trace.report(SUPERTYPE_NOT_A_CLASS_OR_TRAIT.on(typeReference));
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeConstructor constructor = supertype.getConstructor();
|
TypeConstructor constructor = supertype.getConstructor();
|
||||||
if (!typeConstructors.add(constructor)) {
|
if (!typeConstructors.add(constructor)) {
|
||||||
context.getTrace().report(SUPERTYPE_APPEARS_TWICE.on(typeReference));
|
trace.report(SUPERTYPE_APPEARS_TWICE.on(typeReference));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (constructor.isSealed() && !allowedFinalSupertypes.contains(constructor)) {
|
if (constructor.isSealed() && !allowedFinalSupertypes.contains(constructor)) {
|
||||||
context.getTrace().report(FINAL_SUPERTYPE.on(typeReference));
|
trace.report(FINAL_SUPERTYPE.on(typeReference));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -296,12 +302,12 @@ public class BodyResolver {
|
|||||||
assert primaryConstructor != null;
|
assert primaryConstructor != null;
|
||||||
final JetScope scopeForInitializers = classDescriptor.getScopeForInitializers();
|
final JetScope scopeForInitializers = classDescriptor.getScopeForInitializers();
|
||||||
for (JetClassInitializer anonymousInitializer : anonymousInitializers) {
|
for (JetClassInitializer anonymousInitializer : anonymousInitializers) {
|
||||||
expressionTypingServices.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE, context.getTrace());
|
expressionTypingServices.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (JetClassInitializer anonymousInitializer : anonymousInitializers) {
|
for (JetClassInitializer anonymousInitializer : anonymousInitializers) {
|
||||||
context.getTrace().report(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR.on(anonymousInitializer));
|
trace.report(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR.on(anonymousInitializer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -331,21 +337,21 @@ public class BodyResolver {
|
|||||||
private void resolveSecondaryConstructorBody(JetSecondaryConstructor declaration, final ConstructorDescriptor descriptor) {
|
private void resolveSecondaryConstructorBody(JetSecondaryConstructor declaration, final ConstructorDescriptor descriptor) {
|
||||||
if (!context.completeAnalysisNeeded(declaration)) return;
|
if (!context.completeAnalysisNeeded(declaration)) return;
|
||||||
MutableClassDescriptor classDescriptor = (MutableClassDescriptor) descriptor.getContainingDeclaration();
|
MutableClassDescriptor classDescriptor = (MutableClassDescriptor) descriptor.getContainingDeclaration();
|
||||||
final JetScope scopeForSupertypeInitializers = FunctionDescriptorUtil.getFunctionInnerScope(classDescriptor.getScopeForSupertypeResolution(), descriptor, context.getTrace());
|
final JetScope scopeForSupertypeInitializers = FunctionDescriptorUtil.getFunctionInnerScope(classDescriptor.getScopeForSupertypeResolution(), descriptor, trace);
|
||||||
//contains only constructor parameters
|
//contains only constructor parameters
|
||||||
final JetScope scopeForConstructorBody = FunctionDescriptorUtil.getFunctionInnerScope(classDescriptor.getScopeForInitializers(), descriptor, context.getTrace());
|
final JetScope scopeForConstructorBody = FunctionDescriptorUtil.getFunctionInnerScope(classDescriptor.getScopeForInitializers(), descriptor, trace);
|
||||||
//contains members & backing fields
|
//contains members & backing fields
|
||||||
|
|
||||||
final DataFlowInfo dataFlowInfo = DataFlowInfo.EMPTY; // TODO: dataFlowInfo
|
final DataFlowInfo dataFlowInfo = DataFlowInfo.EMPTY; // TODO: dataFlowInfo
|
||||||
|
|
||||||
PsiElement nameElement = declaration.getNameNode().getPsi();
|
PsiElement nameElement = declaration.getNameNode().getPsi();
|
||||||
if (classDescriptor.getUnsubstitutedPrimaryConstructor() == null) {
|
if (classDescriptor.getUnsubstitutedPrimaryConstructor() == null) {
|
||||||
context.getTrace().report(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY.on(nameElement));
|
trace.report(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY.on(nameElement));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
List<JetDelegationSpecifier> initializers = declaration.getInitializers();
|
List<JetDelegationSpecifier> initializers = declaration.getInitializers();
|
||||||
if (initializers.isEmpty()) {
|
if (initializers.isEmpty()) {
|
||||||
context.getTrace().report(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST.on(nameElement));
|
trace.report(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST.on(nameElement));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
initializers.get(0).accept(new JetVisitorVoid() {
|
initializers.get(0).accept(new JetVisitorVoid() {
|
||||||
@@ -353,7 +359,7 @@ public class BodyResolver {
|
|||||||
public void visitDelegationToSuperCallSpecifier(JetDelegatorToSuperCall call) {
|
public void visitDelegationToSuperCallSpecifier(JetDelegatorToSuperCall call) {
|
||||||
JetTypeReference typeReference = call.getTypeReference();
|
JetTypeReference typeReference = call.getTypeReference();
|
||||||
if (typeReference != null) {
|
if (typeReference != null) {
|
||||||
callResolver.resolveFunctionCall(context.getTrace(), scopeForSupertypeInitializers, CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE, dataFlowInfo);
|
callResolver.resolveFunctionCall(trace, scopeForSupertypeInitializers, CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE, dataFlowInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,24 +369,24 @@ public class BodyResolver {
|
|||||||
// TODO : check: if a this() call is present, no other initializers are allowed
|
// TODO : check: if a this() call is present, no other initializers are allowed
|
||||||
ClassDescriptor classDescriptor = descriptor.getContainingDeclaration();
|
ClassDescriptor classDescriptor = descriptor.getContainingDeclaration();
|
||||||
|
|
||||||
callResolver.resolveFunctionCall(context.getTrace(),
|
callResolver.resolveFunctionCall(trace,
|
||||||
scopeForSupertypeInitializers,
|
scopeForSupertypeInitializers,
|
||||||
CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE, dataFlowInfo);
|
CallMaker.makeCall(ReceiverDescriptor.NO_RECEIVER, null, call), NO_EXPECTED_TYPE, dataFlowInfo);
|
||||||
// call.getThisReference(),
|
// call.getThisReference(),
|
||||||
// classDescriptor,
|
// classDescriptor,
|
||||||
// classDescriptor.getDefaultType(),
|
// classDescriptor.getDefaultType(),
|
||||||
// call);
|
// call);
|
||||||
// context.getTrace().getErrorHandler().genericError(call.getNode(), "this-calls are not supported");
|
// trace.getErrorHandler().genericError(call.getNode(), "this-calls are not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitDelegationByExpressionSpecifier(JetDelegatorByExpressionSpecifier specifier) {
|
public void visitDelegationByExpressionSpecifier(JetDelegatorByExpressionSpecifier specifier) {
|
||||||
context.getTrace().report(BY_IN_SECONDARY_CONSTRUCTOR.on(specifier));
|
trace.report(BY_IN_SECONDARY_CONSTRUCTOR.on(specifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitDelegationToSuperClassSpecifier(JetDelegatorToSuperClass specifier) {
|
public void visitDelegationToSuperClassSpecifier(JetDelegatorToSuperClass specifier) {
|
||||||
context.getTrace().report(INITIALIZER_WITH_NO_ARGUMENTS.on(specifier));
|
trace.report(INITIALIZER_WITH_NO_ARGUMENTS.on(specifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -390,14 +396,14 @@ public class BodyResolver {
|
|||||||
});
|
});
|
||||||
for (int i = 1, initializersSize = initializers.size(); i < initializersSize; i++) {
|
for (int i = 1, initializersSize = initializers.size(); i < initializersSize; i++) {
|
||||||
JetDelegationSpecifier initializer = initializers.get(i);
|
JetDelegationSpecifier initializer = initializers.get(i);
|
||||||
context.getTrace().report(MANY_CALLS_TO_THIS.on(initializer));
|
trace.report(MANY_CALLS_TO_THIS.on(initializer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
JetExpression bodyExpression = declaration.getBodyExpression();
|
JetExpression bodyExpression = declaration.getBodyExpression();
|
||||||
if (bodyExpression != null) {
|
if (bodyExpression != null) {
|
||||||
|
|
||||||
expressionTypingServices.checkFunctionReturnType(scopeForConstructorBody, declaration, descriptor, JetStandardClasses.getUnitType(), context.getTrace());
|
expressionTypingServices.checkFunctionReturnType(scopeForConstructorBody, declaration, descriptor, JetStandardClasses.getUnitType(), trace);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkDefaultParameterValues(declaration.getValueParameters(), descriptor.getValueParameters(), scopeForConstructorBody);
|
checkDefaultParameterValues(declaration.getValueParameters(), descriptor.getValueParameters(), scopeForConstructorBody);
|
||||||
@@ -457,8 +463,8 @@ public class BodyResolver {
|
|||||||
JetScope declaringScope = context.getDeclaringScopes().get(accessor);
|
JetScope declaringScope = context.getDeclaringScopes().get(accessor);
|
||||||
|
|
||||||
JetScope propertyDeclarationInnerScope = descriptorResolver.getPropertyDeclarationInnerScope(
|
JetScope propertyDeclarationInnerScope = descriptorResolver.getPropertyDeclarationInnerScope(
|
||||||
declaringScope, propertyDescriptor, propertyDescriptor.getTypeParameters(), propertyDescriptor.getReceiverParameter(), context.getTrace());
|
declaringScope, propertyDescriptor, propertyDescriptor.getTypeParameters(), propertyDescriptor.getReceiverParameter(), trace);
|
||||||
WritableScope accessorScope = new WritableScopeImpl(propertyDeclarationInnerScope, declaringScope.getContainingDeclaration(), new TraceBasedRedeclarationHandler(context.getTrace())).setDebugName("Accessor scope");
|
WritableScope accessorScope = new WritableScopeImpl(propertyDeclarationInnerScope, declaringScope.getContainingDeclaration(), new TraceBasedRedeclarationHandler(trace)).setDebugName("Accessor scope");
|
||||||
accessorScope.changeLockLevel(WritableScope.LockLevel.READING);
|
accessorScope.changeLockLevel(WritableScope.LockLevel.READING);
|
||||||
|
|
||||||
return accessorScope;
|
return accessorScope;
|
||||||
@@ -483,7 +489,7 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ObservableBindingTrace createFieldTrackingTrace(final PropertyDescriptor propertyDescriptor) {
|
private ObservableBindingTrace createFieldTrackingTrace(final PropertyDescriptor propertyDescriptor) {
|
||||||
return new ObservableBindingTrace(context.getTrace()).addHandler(BindingContext.REFERENCE_TARGET, new ObservableBindingTrace.RecordHandler<JetReferenceExpression, DeclarationDescriptor>() {
|
return new ObservableBindingTrace(trace).addHandler(BindingContext.REFERENCE_TARGET, new ObservableBindingTrace.RecordHandler<JetReferenceExpression, DeclarationDescriptor>() {
|
||||||
@Override
|
@Override
|
||||||
public void handleRecord(WritableSlice<JetReferenceExpression, DeclarationDescriptor> slice, JetReferenceExpression expression, DeclarationDescriptor descriptor) {
|
public void handleRecord(WritableSlice<JetReferenceExpression, DeclarationDescriptor> slice, JetReferenceExpression expression, DeclarationDescriptor descriptor) {
|
||||||
if (expression instanceof JetSimpleNameExpression) {
|
if (expression instanceof JetSimpleNameExpression) {
|
||||||
@@ -491,7 +497,7 @@ public class BodyResolver {
|
|||||||
if (simpleNameExpression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) {
|
if (simpleNameExpression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) {
|
||||||
// This check may be considered redundant as long as $x is only accessible from accessors to $x
|
// This check may be considered redundant as long as $x is only accessible from accessors to $x
|
||||||
if (descriptor == propertyDescriptor) { // TODO : original?
|
if (descriptor == propertyDescriptor) { // TODO : original?
|
||||||
context.getTrace().record(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor); // TODO: this context.getTrace()?
|
trace.record(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor); // TODO: this trace?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -502,7 +508,7 @@ public class BodyResolver {
|
|||||||
private void resolvePropertyInitializer(JetProperty property, PropertyDescriptor propertyDescriptor, JetExpression initializer, JetScope scope) {
|
private void resolvePropertyInitializer(JetProperty property, PropertyDescriptor propertyDescriptor, JetExpression initializer, JetScope scope) {
|
||||||
//JetFlowInformationProvider flowInformationProvider = context.getDescriptorResolver().computeFlowData(property, initializer); // TODO : flow JET-15
|
//JetFlowInformationProvider flowInformationProvider = context.getDescriptorResolver().computeFlowData(property, initializer); // TODO : flow JET-15
|
||||||
JetType expectedTypeForInitializer = property.getPropertyTypeRef() != null ? propertyDescriptor.getType() : NO_EXPECTED_TYPE;
|
JetType expectedTypeForInitializer = property.getPropertyTypeRef() != null ? propertyDescriptor.getType() : NO_EXPECTED_TYPE;
|
||||||
JetType type = expressionTypingServices.getType(descriptorResolver.getPropertyDeclarationInnerScope(scope, propertyDescriptor, propertyDescriptor.getTypeParameters(), propertyDescriptor.getReceiverParameter(), context.getTrace()), initializer, expectedTypeForInitializer, context.getTrace());
|
JetType type = expressionTypingServices.getType(descriptorResolver.getPropertyDeclarationInnerScope(scope, propertyDescriptor, propertyDescriptor.getTypeParameters(), propertyDescriptor.getReceiverParameter(), trace), initializer, expectedTypeForInitializer, trace);
|
||||||
//
|
//
|
||||||
// JetType expectedType = propertyDescriptor.getInType();
|
// JetType expectedType = propertyDescriptor.getInType();
|
||||||
// if (expectedType == null) {
|
// if (expectedType == null) {
|
||||||
@@ -510,7 +516,7 @@ public class BodyResolver {
|
|||||||
// }
|
// }
|
||||||
// if (type != null && expectedType != null
|
// if (type != null && expectedType != null
|
||||||
// && !context.getSemanticServices().getTypeChecker().isSubtypeOf(type, expectedType)) {
|
// && !context.getSemanticServices().getTypeChecker().isSubtypeOf(type, expectedType)) {
|
||||||
//// context.getTrace().report(TYPE_MISMATCH.on(initializer, expectedType, type));
|
//// trace.report(TYPE_MISMATCH.on(initializer, expectedType, type));
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -524,7 +530,7 @@ public class BodyResolver {
|
|||||||
JetScope declaringScope = this.context.getDeclaringScopes().get(declaration);
|
JetScope declaringScope = this.context.getDeclaringScopes().get(declaration);
|
||||||
assert declaringScope != null;
|
assert declaringScope != null;
|
||||||
|
|
||||||
resolveFunctionBody(context.getTrace(), declaration, descriptor, declaringScope);
|
resolveFunctionBody(trace, declaration, descriptor, declaringScope);
|
||||||
|
|
||||||
assert descriptor.getReturnType() != null;
|
assert descriptor.getReturnType() != null;
|
||||||
}
|
}
|
||||||
@@ -558,7 +564,7 @@ public class BodyResolver {
|
|||||||
JetParameter jetParameter = valueParameters.get(i);
|
JetParameter jetParameter = valueParameters.get(i);
|
||||||
JetExpression defaultValue = jetParameter.getDefaultValue();
|
JetExpression defaultValue = jetParameter.getDefaultValue();
|
||||||
if (defaultValue != null) {
|
if (defaultValue != null) {
|
||||||
expressionTypingServices.getType(declaringScope, defaultValue, valueParameterDescriptor.getType(), context.getTrace());
|
expressionTypingServices.getType(declaringScope, defaultValue, valueParameterDescriptor.getType(), trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -578,11 +584,11 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void computeDeferredTypes() {
|
private void computeDeferredTypes() {
|
||||||
Collection<Box<DeferredType>> deferredTypes = context.getTrace().getKeys(DEFERRED_TYPE);
|
Collection<Box<DeferredType>> deferredTypes = trace.getKeys(DEFERRED_TYPE);
|
||||||
if (deferredTypes != null) {
|
if (deferredTypes != null) {
|
||||||
// +1 is a work around agains new Queue(0).addLast(...) bug // stepan.koltsov@ 2011-11-21
|
// +1 is a work around agains new Queue(0).addLast(...) bug // stepan.koltsov@ 2011-11-21
|
||||||
final Queue<DeferredType> queue = new Queue<DeferredType>(deferredTypes.size() + 1);
|
final Queue<DeferredType> queue = new Queue<DeferredType>(deferredTypes.size() + 1);
|
||||||
context.getTrace().addHandler(DEFERRED_TYPE, new ObservableBindingTrace.RecordHandler<Box<DeferredType>, Boolean>() {
|
trace.addHandler(DEFERRED_TYPE, new ObservableBindingTrace.RecordHandler<Box<DeferredType>, Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public void handleRecord(WritableSlice<Box<DeferredType>, Boolean> deferredTypeKeyDeferredTypeWritableSlice, Box<DeferredType> key, Boolean value) {
|
public void handleRecord(WritableSlice<Box<DeferredType>, Boolean> deferredTypeKeyDeferredTypeWritableSlice, Box<DeferredType> key, Boolean value) {
|
||||||
queue.addLast(key.getData());
|
queue.addLast(key.getData());
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE;
|
|||||||
public class ControlFlowAnalyzer {
|
public class ControlFlowAnalyzer {
|
||||||
private TopDownAnalysisParameters topDownAnalysisParameters;
|
private TopDownAnalysisParameters topDownAnalysisParameters;
|
||||||
private TopDownAnalysisContext context;
|
private TopDownAnalysisContext context;
|
||||||
|
private BindingTrace trace;
|
||||||
private JetControlFlowDataTraceFactory flowDataTraceFactory;
|
private JetControlFlowDataTraceFactory flowDataTraceFactory;
|
||||||
|
|
||||||
|
|
||||||
@@ -50,6 +51,11 @@ public class ControlFlowAnalyzer {
|
|||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(BindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setFlowDataTraceFactory(JetControlFlowDataTraceFactory flowDataTraceFactory) {
|
public void setFlowDataTraceFactory(JetControlFlowDataTraceFactory flowDataTraceFactory) {
|
||||||
this.flowDataTraceFactory = flowDataTraceFactory;
|
this.flowDataTraceFactory = flowDataTraceFactory;
|
||||||
@@ -88,7 +94,7 @@ public class ControlFlowAnalyzer {
|
|||||||
|
|
||||||
private void checkClassOrObject(JetClassOrObject klass) {
|
private void checkClassOrObject(JetClassOrObject klass) {
|
||||||
// A pseudocode of class initialization corresponds to a class
|
// A pseudocode of class initialization corresponds to a class
|
||||||
JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider((JetDeclaration) klass, (JetExpression) klass, flowDataTraceFactory, context.getTrace());
|
JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider((JetDeclaration) klass, (JetExpression) klass, flowDataTraceFactory, trace);
|
||||||
flowInformationProvider.markUninitializedVariables((JetElement) klass, topDownAnalysisParameters.isDeclaredLocally());
|
flowInformationProvider.markUninitializedVariables((JetElement) klass, topDownAnalysisParameters.isDeclaredLocally());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +113,7 @@ public class ControlFlowAnalyzer {
|
|||||||
|
|
||||||
JetExpression bodyExpression = function.getBodyExpression();
|
JetExpression bodyExpression = function.getBodyExpression();
|
||||||
if (bodyExpression == null) return;
|
if (bodyExpression == null) return;
|
||||||
JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider((JetDeclaration) function, bodyExpression, flowDataTraceFactory, context.getTrace());
|
JetFlowInformationProvider flowInformationProvider = new JetFlowInformationProvider((JetDeclaration) function, bodyExpression, flowDataTraceFactory, trace);
|
||||||
|
|
||||||
flowInformationProvider.checkDefiniteReturn(function, expectedReturnType);
|
flowInformationProvider.checkDefiniteReturn(function, expectedReturnType);
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ public class DeclarationResolver {
|
|||||||
private ImportsResolver importsResolver;
|
private ImportsResolver importsResolver;
|
||||||
@NotNull
|
@NotNull
|
||||||
private DescriptorResolver descriptorResolver;
|
private DescriptorResolver descriptorResolver;
|
||||||
|
@NotNull
|
||||||
|
private BindingTrace trace;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -62,6 +64,11 @@ public class DeclarationResolver {
|
|||||||
this.descriptorResolver = descriptorResolver;
|
this.descriptorResolver = descriptorResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(@NotNull BindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void process() {
|
public void process() {
|
||||||
@@ -99,7 +106,7 @@ public class DeclarationResolver {
|
|||||||
private void resolveAnnotationsForClassOrObject(AnnotationResolver annotationResolver, JetClassOrObject jetClass, MutableClassDescriptor descriptor) {
|
private void resolveAnnotationsForClassOrObject(AnnotationResolver annotationResolver, JetClassOrObject jetClass, MutableClassDescriptor descriptor) {
|
||||||
JetModifierList modifierList = jetClass.getModifierList();
|
JetModifierList modifierList = jetClass.getModifierList();
|
||||||
if (modifierList != null) {
|
if (modifierList != null) {
|
||||||
descriptor.getAnnotations().addAll(annotationResolver.resolveAnnotations(descriptor.getScopeForSupertypeResolution(), modifierList.getAnnotationEntries(), context.getTrace()));
|
descriptor.getAnnotations().addAll(annotationResolver.resolveAnnotations(descriptor.getScopeForSupertypeResolution(), modifierList.getAnnotationEntries(), trace));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +151,7 @@ public class DeclarationResolver {
|
|||||||
declaration.accept(new JetVisitorVoid() {
|
declaration.accept(new JetVisitorVoid() {
|
||||||
@Override
|
@Override
|
||||||
public void visitNamedFunction(JetNamedFunction function) {
|
public void visitNamedFunction(JetNamedFunction function) {
|
||||||
SimpleFunctionDescriptor functionDescriptor = descriptorResolver.resolveFunctionDescriptor(namespaceLike.getOwnerForChildren(), scopeForFunctions, function, context.getTrace());
|
SimpleFunctionDescriptor functionDescriptor = descriptorResolver.resolveFunctionDescriptor(namespaceLike.getOwnerForChildren(), scopeForFunctions, function, trace);
|
||||||
namespaceLike.addFunctionDescriptor(functionDescriptor);
|
namespaceLike.addFunctionDescriptor(functionDescriptor);
|
||||||
context.getFunctions().put(function, functionDescriptor);
|
context.getFunctions().put(function, functionDescriptor);
|
||||||
context.getDeclaringScopes().put(function, scopeForFunctions);
|
context.getDeclaringScopes().put(function, scopeForFunctions);
|
||||||
@@ -152,7 +159,7 @@ public class DeclarationResolver {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitProperty(JetProperty property) {
|
public void visitProperty(JetProperty property) {
|
||||||
PropertyDescriptor propertyDescriptor = descriptorResolver.resolvePropertyDescriptor(namespaceLike.getOwnerForChildren(), scopeForPropertyInitializers, property, context.getTrace());
|
PropertyDescriptor propertyDescriptor = descriptorResolver.resolvePropertyDescriptor(namespaceLike.getOwnerForChildren(), scopeForPropertyInitializers, property, trace);
|
||||||
namespaceLike.addPropertyDescriptor(propertyDescriptor);
|
namespaceLike.addPropertyDescriptor(propertyDescriptor);
|
||||||
context.getProperties().put(property, propertyDescriptor);
|
context.getProperties().put(property, propertyDescriptor);
|
||||||
context.getDeclaringScopes().put(property, scopeForPropertyInitializers);
|
context.getDeclaringScopes().put(property, scopeForPropertyInitializers);
|
||||||
@@ -166,7 +173,7 @@ public class DeclarationResolver {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitObjectDeclaration(JetObjectDeclaration declaration) {
|
public void visitObjectDeclaration(JetObjectDeclaration declaration) {
|
||||||
PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor(namespaceLike.getOwnerForChildren(), declaration, context.getObjects().get(declaration), context.getTrace());
|
PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor(namespaceLike.getOwnerForChildren(), declaration, context.getObjects().get(declaration), trace);
|
||||||
namespaceLike.addPropertyDescriptor(propertyDescriptor);
|
namespaceLike.addPropertyDescriptor(propertyDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,7 +182,7 @@ public class DeclarationResolver {
|
|||||||
if (enumEntry.getPrimaryConstructorParameterList() == null) {
|
if (enumEntry.getPrimaryConstructorParameterList() == null) {
|
||||||
MutableClassDescriptorLite classObjectDescriptor = ((MutableClassDescriptor) namespaceLike).getClassObjectDescriptor();
|
MutableClassDescriptorLite classObjectDescriptor = ((MutableClassDescriptor) namespaceLike).getClassObjectDescriptor();
|
||||||
assert classObjectDescriptor != null;
|
assert classObjectDescriptor != null;
|
||||||
PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor(classObjectDescriptor, enumEntry, context.getClasses().get(enumEntry), context.getTrace());
|
PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor(classObjectDescriptor, enumEntry, context.getClasses().get(enumEntry), trace);
|
||||||
classObjectDescriptor.addPropertyDescriptor(propertyDescriptor);
|
classObjectDescriptor.addPropertyDescriptor(propertyDescriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -187,39 +194,39 @@ public class DeclarationResolver {
|
|||||||
if (classDescriptor.getKind() == ClassKind.TRAIT) {
|
if (classDescriptor.getKind() == ClassKind.TRAIT) {
|
||||||
JetParameterList primaryConstructorParameterList = klass.getPrimaryConstructorParameterList();
|
JetParameterList primaryConstructorParameterList = klass.getPrimaryConstructorParameterList();
|
||||||
if (primaryConstructorParameterList != null) {
|
if (primaryConstructorParameterList != null) {
|
||||||
context.getTrace().report(CONSTRUCTOR_IN_TRAIT.on(primaryConstructorParameterList));
|
trace.report(CONSTRUCTOR_IN_TRAIT.on(primaryConstructorParameterList));
|
||||||
}
|
}
|
||||||
if (!klass.hasPrimaryConstructor()) return;
|
if (!klass.hasPrimaryConstructor()) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO : not all the parameters are real properties
|
// TODO : not all the parameters are real properties
|
||||||
JetScope memberScope = classDescriptor.getScopeForSupertypeResolution();
|
JetScope memberScope = classDescriptor.getScopeForSupertypeResolution();
|
||||||
ConstructorDescriptor constructorDescriptor = descriptorResolver.resolvePrimaryConstructorDescriptor(memberScope, classDescriptor, klass, context.getTrace());
|
ConstructorDescriptor constructorDescriptor = descriptorResolver.resolvePrimaryConstructorDescriptor(memberScope, classDescriptor, klass, trace);
|
||||||
for (JetParameter parameter : klass.getPrimaryConstructorParameters()) {
|
for (JetParameter parameter : klass.getPrimaryConstructorParameters()) {
|
||||||
if (parameter.getValOrVarNode() != null) {
|
if (parameter.getValOrVarNode() != null) {
|
||||||
PropertyDescriptor propertyDescriptor = descriptorResolver.resolvePrimaryConstructorParameterToAProperty(
|
PropertyDescriptor propertyDescriptor = descriptorResolver.resolvePrimaryConstructorParameterToAProperty(
|
||||||
classDescriptor,
|
classDescriptor,
|
||||||
memberScope,
|
memberScope,
|
||||||
parameter, context.getTrace()
|
parameter, trace
|
||||||
);
|
);
|
||||||
classDescriptor.addPropertyDescriptor(propertyDescriptor);
|
classDescriptor.addPropertyDescriptor(propertyDescriptor);
|
||||||
context.getPrimaryConstructorParameterProperties().add(propertyDescriptor);
|
context.getPrimaryConstructorParameterProperties().add(propertyDescriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (constructorDescriptor != null) {
|
if (constructorDescriptor != null) {
|
||||||
classDescriptor.setPrimaryConstructor(constructorDescriptor, context.getTrace());
|
classDescriptor.setPrimaryConstructor(constructorDescriptor, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processSecondaryConstructor(MutableClassDescriptor classDescriptor, JetSecondaryConstructor constructor) {
|
private void processSecondaryConstructor(MutableClassDescriptor classDescriptor, JetSecondaryConstructor constructor) {
|
||||||
if (classDescriptor.getKind() == ClassKind.TRAIT) {
|
if (classDescriptor.getKind() == ClassKind.TRAIT) {
|
||||||
context.getTrace().report(CONSTRUCTOR_IN_TRAIT.on(constructor.getNameNode().getPsi()));
|
trace.report(CONSTRUCTOR_IN_TRAIT.on(constructor.getNameNode().getPsi()));
|
||||||
}
|
}
|
||||||
ConstructorDescriptor constructorDescriptor = descriptorResolver.resolveSecondaryConstructorDescriptor(
|
ConstructorDescriptor constructorDescriptor = descriptorResolver.resolveSecondaryConstructorDescriptor(
|
||||||
classDescriptor.getScopeForMemberResolution(),
|
classDescriptor.getScopeForMemberResolution(),
|
||||||
classDescriptor,
|
classDescriptor,
|
||||||
constructor, context.getTrace());
|
constructor, trace);
|
||||||
classDescriptor.addConstructor(constructorDescriptor, context.getTrace());
|
classDescriptor.addConstructor(constructorDescriptor, trace);
|
||||||
context.getConstructors().put(constructor, constructorDescriptor);
|
context.getConstructors().put(constructor, constructorDescriptor);
|
||||||
context.getDeclaringScopes().put(constructor, classDescriptor.getScopeForMemberLookup());
|
context.getDeclaringScopes().put(constructor, classDescriptor.getScopeForMemberLookup());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.TYPE;
|
|||||||
public class DeclarationsChecker {
|
public class DeclarationsChecker {
|
||||||
@NotNull
|
@NotNull
|
||||||
private TopDownAnalysisContext context;
|
private TopDownAnalysisContext context;
|
||||||
|
@NotNull
|
||||||
|
private BindingTrace trace;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -54,6 +56,12 @@ public class DeclarationsChecker {
|
|||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(@NotNull BindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void process() {
|
public void process() {
|
||||||
Map<JetClass, MutableClassDescriptor> classes = context.getClasses();
|
Map<JetClass, MutableClassDescriptor> classes = context.getClasses();
|
||||||
@@ -108,13 +116,13 @@ public class DeclarationsChecker {
|
|||||||
JetModifierList modifierList = aClass.getModifierList();
|
JetModifierList modifierList = aClass.getModifierList();
|
||||||
if (modifierList == null) return;
|
if (modifierList == null) return;
|
||||||
if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) {
|
if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) {
|
||||||
context.getTrace().report(Errors.TRAIT_CAN_NOT_BE_FINAL.on(modifierList.getModifierNode(JetTokens.FINAL_KEYWORD).getPsi()));
|
trace.report(Errors.TRAIT_CAN_NOT_BE_FINAL.on(modifierList.getModifierNode(JetTokens.FINAL_KEYWORD).getPsi()));
|
||||||
}
|
}
|
||||||
if (modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
if (modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
||||||
context.getTrace().report(Errors.ABSTRACT_MODIFIER_IN_TRAIT.on(aClass));
|
trace.report(Errors.ABSTRACT_MODIFIER_IN_TRAIT.on(aClass));
|
||||||
}
|
}
|
||||||
if (modifierList.hasModifier(JetTokens.OPEN_KEYWORD)) {
|
if (modifierList.hasModifier(JetTokens.OPEN_KEYWORD)) {
|
||||||
context.getTrace().report(Errors.OPEN_MODIFIER_IN_TRAIT.on(aClass));
|
trace.report(Errors.OPEN_MODIFIER_IN_TRAIT.on(aClass));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,9 +134,9 @@ public class DeclarationsChecker {
|
|||||||
private void checkOpenMembers(MutableClassDescriptor classDescriptor) {
|
private void checkOpenMembers(MutableClassDescriptor classDescriptor) {
|
||||||
for (CallableMemberDescriptor memberDescriptor : classDescriptor.getCallableMembers()) {
|
for (CallableMemberDescriptor memberDescriptor : classDescriptor.getCallableMembers()) {
|
||||||
|
|
||||||
JetNamedDeclaration member = (JetNamedDeclaration) context.getTrace().get(BindingContext.DESCRIPTOR_TO_DECLARATION, memberDescriptor);
|
JetNamedDeclaration member = (JetNamedDeclaration) trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, memberDescriptor);
|
||||||
if (member != null && classDescriptor.getModality() == Modality.FINAL && member.hasModifier(JetTokens.OPEN_KEYWORD)) {
|
if (member != null && classDescriptor.getModality() == Modality.FINAL && member.hasModifier(JetTokens.OPEN_KEYWORD)) {
|
||||||
context.getTrace().report(NON_FINAL_MEMBER_IN_FINAL_CLASS.on(member));
|
trace.report(NON_FINAL_MEMBER_IN_FINAL_CLASS.on(member));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,7 +163,7 @@ public class DeclarationsChecker {
|
|||||||
hasDeferredType = function.getReturnTypeRef() == null && function.getBodyExpression() != null && !function.hasBlockBody();
|
hasDeferredType = function.getReturnTypeRef() == null && function.getBodyExpression() != null && !function.hasBlockBody();
|
||||||
}
|
}
|
||||||
if ((memberDescriptor.getVisibility() == Visibility.PUBLIC || memberDescriptor.getVisibility() == Visibility.PROTECTED) && hasDeferredType) {
|
if ((memberDescriptor.getVisibility() == Visibility.PUBLIC || memberDescriptor.getVisibility() == Visibility.PROTECTED) && hasDeferredType) {
|
||||||
context.getTrace().report(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE.on(member));
|
trace.report(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE.on(member));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,18 +175,18 @@ public class DeclarationsChecker {
|
|||||||
|
|
||||||
if (abstractNode != null) { //has abstract modifier
|
if (abstractNode != null) { //has abstract modifier
|
||||||
if (classDescriptor == null) {
|
if (classDescriptor == null) {
|
||||||
context.getTrace().report(ABSTRACT_PROPERTY_NOT_IN_CLASS.on(property));
|
trace.report(ABSTRACT_PROPERTY_NOT_IN_CLASS.on(property));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!(classDescriptor.getModality() == Modality.ABSTRACT) && classDescriptor.getKind() != ClassKind.ENUM_CLASS) {
|
if (!(classDescriptor.getModality() == Modality.ABSTRACT) && classDescriptor.getKind() != ClassKind.ENUM_CLASS) {
|
||||||
PsiElement classElement = context.getTrace().get(BindingContext.DESCRIPTOR_TO_DECLARATION, classDescriptor);
|
PsiElement classElement = trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, classDescriptor);
|
||||||
assert classElement instanceof JetClass;
|
assert classElement instanceof JetClass;
|
||||||
String name = property.getName();
|
String name = property.getName();
|
||||||
context.getTrace().report(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS.on(property, name != null ? name : "", classDescriptor, (JetClass) classElement));
|
trace.report(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS.on(property, name != null ? name : "", classDescriptor, (JetClass) classElement));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (classDescriptor.getKind() == ClassKind.TRAIT) {
|
if (classDescriptor.getKind() == ClassKind.TRAIT) {
|
||||||
context.getTrace().report(ABSTRACT_MODIFIER_IN_TRAIT.on(property));
|
trace.report(ABSTRACT_MODIFIER_IN_TRAIT.on(property));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,13 +198,13 @@ public class DeclarationsChecker {
|
|||||||
|
|
||||||
JetExpression initializer = property.getInitializer();
|
JetExpression initializer = property.getInitializer();
|
||||||
if (initializer != null) {
|
if (initializer != null) {
|
||||||
context.getTrace().report(ABSTRACT_PROPERTY_WITH_INITIALIZER.on(initializer));
|
trace.report(ABSTRACT_PROPERTY_WITH_INITIALIZER.on(initializer));
|
||||||
}
|
}
|
||||||
if (getter != null && getter.getBodyExpression() != null) {
|
if (getter != null && getter.getBodyExpression() != null) {
|
||||||
context.getTrace().report(ABSTRACT_PROPERTY_WITH_GETTER.on(getter));
|
trace.report(ABSTRACT_PROPERTY_WITH_GETTER.on(getter));
|
||||||
}
|
}
|
||||||
if (setter != null && setter.getBodyExpression() != null) {
|
if (setter != null && setter.getBodyExpression() != null) {
|
||||||
context.getTrace().report(ABSTRACT_PROPERTY_WITH_SETTER.on(setter));
|
trace.report(ABSTRACT_PROPERTY_WITH_SETTER.on(setter));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -210,27 +218,27 @@ public class DeclarationsChecker {
|
|||||||
|
|
||||||
boolean inTrait = classDescriptor != null && classDescriptor.getKind() == ClassKind.TRAIT;
|
boolean inTrait = classDescriptor != null && classDescriptor.getKind() == ClassKind.TRAIT;
|
||||||
JetExpression initializer = property.getInitializer();
|
JetExpression initializer = property.getInitializer();
|
||||||
boolean backingFieldRequired = context.getTrace().getBindingContext().get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor);
|
boolean backingFieldRequired = trace.getBindingContext().get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor);
|
||||||
|
|
||||||
if (inTrait && backingFieldRequired && hasAccessorImplementation) {
|
if (inTrait && backingFieldRequired && hasAccessorImplementation) {
|
||||||
context.getTrace().report(BACKING_FIELD_IN_TRAIT.on(property));
|
trace.report(BACKING_FIELD_IN_TRAIT.on(property));
|
||||||
}
|
}
|
||||||
if (initializer == null) {
|
if (initializer == null) {
|
||||||
if (backingFieldRequired && !inTrait && !context.getTrace().getBindingContext().get(BindingContext.IS_INITIALIZED, propertyDescriptor)) {
|
if (backingFieldRequired && !inTrait && !trace.getBindingContext().get(BindingContext.IS_INITIALIZED, propertyDescriptor)) {
|
||||||
if (classDescriptor == null || hasAccessorImplementation) {
|
if (classDescriptor == null || hasAccessorImplementation) {
|
||||||
context.getTrace().report(MUST_BE_INITIALIZED.on(property));
|
trace.report(MUST_BE_INITIALIZED.on(property));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
context.getTrace().report(MUST_BE_INITIALIZED_OR_BE_ABSTRACT.on(property));
|
trace.report(MUST_BE_INITIALIZED_OR_BE_ABSTRACT.on(property));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (inTrait) {
|
if (inTrait) {
|
||||||
context.getTrace().report(PROPERTY_INITIALIZER_IN_TRAIT.on(initializer));
|
trace.report(PROPERTY_INITIALIZER_IN_TRAIT.on(initializer));
|
||||||
}
|
}
|
||||||
else if (!backingFieldRequired) {
|
else if (!backingFieldRequired) {
|
||||||
context.getTrace().report(PROPERTY_INITIALIZER_NO_BACKING_FIELD.on(initializer));
|
trace.report(PROPERTY_INITIALIZER_NO_BACKING_FIELD.on(initializer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,26 +252,26 @@ public class DeclarationsChecker {
|
|||||||
boolean inEnum = classDescriptor.getKind() == ClassKind.ENUM_CLASS;
|
boolean inEnum = classDescriptor.getKind() == ClassKind.ENUM_CLASS;
|
||||||
boolean inAbstractClass = classDescriptor.getModality() == Modality.ABSTRACT;
|
boolean inAbstractClass = classDescriptor.getModality() == Modality.ABSTRACT;
|
||||||
if (hasAbstractModifier && !inAbstractClass && !inTrait && !inEnum) {
|
if (hasAbstractModifier && !inAbstractClass && !inTrait && !inEnum) {
|
||||||
PsiElement classElement = context.getTrace().get(BindingContext.DESCRIPTOR_TO_DECLARATION, classDescriptor);
|
PsiElement classElement = trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, classDescriptor);
|
||||||
assert classElement instanceof JetClass;
|
assert classElement instanceof JetClass;
|
||||||
context.getTrace().report(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS.on(function, functionDescriptor.getName(), classDescriptor, (JetClass) classElement));
|
trace.report(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS.on(function, functionDescriptor.getName(), classDescriptor, (JetClass) classElement));
|
||||||
}
|
}
|
||||||
if (hasAbstractModifier && inTrait) {
|
if (hasAbstractModifier && inTrait) {
|
||||||
context.getTrace().report(ABSTRACT_MODIFIER_IN_TRAIT.on(function));
|
trace.report(ABSTRACT_MODIFIER_IN_TRAIT.on(function));
|
||||||
}
|
}
|
||||||
if (function.getBodyExpression() != null && hasAbstractModifier) {
|
if (function.getBodyExpression() != null && hasAbstractModifier) {
|
||||||
context.getTrace().report(ABSTRACT_FUNCTION_WITH_BODY.on(function, functionDescriptor));
|
trace.report(ABSTRACT_FUNCTION_WITH_BODY.on(function, functionDescriptor));
|
||||||
}
|
}
|
||||||
if (function.getBodyExpression() == null && !hasAbstractModifier && !inTrait) {
|
if (function.getBodyExpression() == null && !hasAbstractModifier && !inTrait) {
|
||||||
context.getTrace().report(NON_ABSTRACT_FUNCTION_WITH_NO_BODY.on(function, functionDescriptor));
|
trace.report(NON_ABSTRACT_FUNCTION_WITH_NO_BODY.on(function, functionDescriptor));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (hasAbstractModifier) {
|
if (hasAbstractModifier) {
|
||||||
context.getTrace().report(NON_MEMBER_ABSTRACT_FUNCTION.on(function, functionDescriptor));
|
trace.report(NON_MEMBER_ABSTRACT_FUNCTION.on(function, functionDescriptor));
|
||||||
}
|
}
|
||||||
if (function.getBodyExpression() == null && !hasAbstractModifier) {
|
if (function.getBodyExpression() == null && !hasAbstractModifier) {
|
||||||
context.getTrace().report(NON_MEMBER_FUNCTION_NO_BODY.on(function, functionDescriptor));
|
trace.report(NON_MEMBER_FUNCTION_NO_BODY.on(function, functionDescriptor));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,12 +286,12 @@ public class DeclarationsChecker {
|
|||||||
Map<JetKeywordToken, ASTNode> nodes = getNodesCorrespondingToModifiers(getterModifierList, Sets.newHashSet(JetTokens.PUBLIC_KEYWORD, JetTokens.PROTECTED_KEYWORD, JetTokens.PRIVATE_KEYWORD, JetTokens.INTERNAL_KEYWORD));
|
Map<JetKeywordToken, ASTNode> nodes = getNodesCorrespondingToModifiers(getterModifierList, Sets.newHashSet(JetTokens.PUBLIC_KEYWORD, JetTokens.PROTECTED_KEYWORD, JetTokens.PRIVATE_KEYWORD, JetTokens.INTERNAL_KEYWORD));
|
||||||
if (getterDescriptor.getVisibility() != propertyDescriptor.getVisibility()) {
|
if (getterDescriptor.getVisibility() != propertyDescriptor.getVisibility()) {
|
||||||
for (ASTNode node : nodes.values()) {
|
for (ASTNode node : nodes.values()) {
|
||||||
context.getTrace().report(Errors.GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.on(node.getPsi()));
|
trace.report(Errors.GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.on(node.getPsi()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (ASTNode node : nodes.values()) {
|
for (ASTNode node : nodes.values()) {
|
||||||
context.getTrace().report(Errors.REDUNDANT_MODIFIER_IN_GETTER.on(node.getPsi()));
|
trace.report(Errors.REDUNDANT_MODIFIER_IN_GETTER.on(node.getPsi()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -326,7 +334,7 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (JetKeywordToken token : presentModifiers) {
|
for (JetKeywordToken token : presentModifiers) {
|
||||||
context.getTrace().report(Errors.INCOMPATIBLE_MODIFIERS.on(modifierList.getModifierNode(token).getPsi(), presentModifiers));
|
trace.report(Errors.INCOMPATIBLE_MODIFIERS.on(modifierList.getModifierNode(token).getPsi(), presentModifiers));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,7 +343,7 @@ public class DeclarationsChecker {
|
|||||||
JetKeywordToken redundantModifier = tokenPair.getFirst();
|
JetKeywordToken redundantModifier = tokenPair.getFirst();
|
||||||
JetKeywordToken sufficientModifier = tokenPair.getSecond();
|
JetKeywordToken sufficientModifier = tokenPair.getSecond();
|
||||||
if (modifierList.hasModifier(redundantModifier) && modifierList.hasModifier(sufficientModifier)) {
|
if (modifierList.hasModifier(redundantModifier) && modifierList.hasModifier(sufficientModifier)) {
|
||||||
context.getTrace().report(Errors.REDUNDANT_MODIFIER.on(modifierList.getModifierNode(redundantModifier).getPsi(), redundantModifier, sufficientModifier));
|
trace.report(Errors.REDUNDANT_MODIFIER.on(modifierList.getModifierNode(redundantModifier).getPsi(), redundantModifier, sufficientModifier));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -344,7 +352,7 @@ public class DeclarationsChecker {
|
|||||||
if (modifierList == null) return;
|
if (modifierList == null) return;
|
||||||
for (JetKeywordToken modifier : illegalModifiers) {
|
for (JetKeywordToken modifier : illegalModifiers) {
|
||||||
if (modifierList.hasModifier(modifier)) {
|
if (modifierList.hasModifier(modifier)) {
|
||||||
context.getTrace().report(Errors.ILLEGAL_MODIFIER.on(modifierList.getModifierNode(modifier).getPsi(), modifier));
|
trace.report(Errors.ILLEGAL_MODIFIER.on(modifierList.getModifierNode(modifier).getPsi(), modifier));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -372,17 +380,17 @@ public class DeclarationsChecker {
|
|||||||
ConstructorDescriptor constructor = enumClass.getUnsubstitutedPrimaryConstructor();
|
ConstructorDescriptor constructor = enumClass.getUnsubstitutedPrimaryConstructor();
|
||||||
assert constructor != null;
|
assert constructor != null;
|
||||||
if (!constructor.getValueParameters().isEmpty() && delegationSpecifiers.isEmpty()) {
|
if (!constructor.getValueParameters().isEmpty() && delegationSpecifiers.isEmpty()) {
|
||||||
context.getTrace().report(ENUM_ENTRY_SHOULD_BE_INITIALIZED.on(aClass, enumClass));
|
trace.report(ENUM_ENTRY_SHOULD_BE_INITIALIZED.on(aClass, enumClass));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (JetDelegationSpecifier delegationSpecifier : delegationSpecifiers) {
|
for (JetDelegationSpecifier delegationSpecifier : delegationSpecifiers) {
|
||||||
JetTypeReference typeReference = delegationSpecifier.getTypeReference();
|
JetTypeReference typeReference = delegationSpecifier.getTypeReference();
|
||||||
if (typeReference != null) {
|
if (typeReference != null) {
|
||||||
JetType type = context.getTrace().getBindingContext().get(TYPE, typeReference);
|
JetType type = trace.getBindingContext().get(TYPE, typeReference);
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
JetType enumType = enumClass.getDefaultType();
|
JetType enumType = enumClass.getDefaultType();
|
||||||
if (!type.getConstructor().equals(enumType.getConstructor())) {
|
if (!type.getConstructor().equals(enumType.getConstructor())) {
|
||||||
context.getTrace().report(ENUM_ENTRY_ILLEGAL_TYPE.on(typeReference, enumClass));
|
trace.report(ENUM_ENTRY_ILLEGAL_TYPE.on(typeReference, enumClass));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.DELEGATED;
|
|||||||
public class DelegationResolver {
|
public class DelegationResolver {
|
||||||
@NotNull
|
@NotNull
|
||||||
private TopDownAnalysisContext context;
|
private TopDownAnalysisContext context;
|
||||||
|
@NotNull
|
||||||
|
private BindingTrace trace;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -39,6 +41,12 @@ public class DelegationResolver {
|
|||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(@NotNull BindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void process() {
|
public void process() {
|
||||||
addDelegatedMembers();
|
addDelegatedMembers();
|
||||||
@@ -57,7 +65,7 @@ public class DelegationResolver {
|
|||||||
for (JetDelegationSpecifier delegationSpecifier : jetClass.getDelegationSpecifiers()) {
|
for (JetDelegationSpecifier delegationSpecifier : jetClass.getDelegationSpecifiers()) {
|
||||||
if (delegationSpecifier instanceof JetDelegatorByExpressionSpecifier) {
|
if (delegationSpecifier instanceof JetDelegatorByExpressionSpecifier) {
|
||||||
JetDelegatorByExpressionSpecifier specifier = (JetDelegatorByExpressionSpecifier) delegationSpecifier;
|
JetDelegatorByExpressionSpecifier specifier = (JetDelegatorByExpressionSpecifier) delegationSpecifier;
|
||||||
JetType type = context.getTrace().get(BindingContext.TYPE, specifier.getTypeReference());
|
JetType type = trace.get(BindingContext.TYPE, specifier.getTypeReference());
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
for (DeclarationDescriptor declarationDescriptor : type.getMemberScope().getAllDescriptors()) {
|
for (DeclarationDescriptor declarationDescriptor : type.getMemberScope().getAllDescriptors()) {
|
||||||
if (declarationDescriptor instanceof PropertyDescriptor) {
|
if (declarationDescriptor instanceof PropertyDescriptor) {
|
||||||
@@ -65,7 +73,7 @@ public class DelegationResolver {
|
|||||||
if (propertyDescriptor.getModality().isOverridable()) {
|
if (propertyDescriptor.getModality().isOverridable()) {
|
||||||
PropertyDescriptor copy = propertyDescriptor.copy(classDescriptor, true, CallableMemberDescriptor.Kind.DELEGATION, true);
|
PropertyDescriptor copy = propertyDescriptor.copy(classDescriptor, true, CallableMemberDescriptor.Kind.DELEGATION, true);
|
||||||
classDescriptor.addPropertyDescriptor(copy);
|
classDescriptor.addPropertyDescriptor(copy);
|
||||||
context.getTrace().record(DELEGATED, copy);
|
trace.record(DELEGATED, copy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (declarationDescriptor instanceof SimpleFunctionDescriptor) {
|
else if (declarationDescriptor instanceof SimpleFunctionDescriptor) {
|
||||||
@@ -73,7 +81,7 @@ public class DelegationResolver {
|
|||||||
if (functionDescriptor.getModality().isOverridable()) {
|
if (functionDescriptor.getModality().isOverridable()) {
|
||||||
SimpleFunctionDescriptor copy = functionDescriptor.copy(classDescriptor, true, CallableMemberDescriptor.Kind.DELEGATION, true);
|
SimpleFunctionDescriptor copy = functionDescriptor.copy(classDescriptor, true, CallableMemberDescriptor.Kind.DELEGATION, true);
|
||||||
classDescriptor.addFunctionDescriptor(copy);
|
classDescriptor.addFunctionDescriptor(copy);
|
||||||
context.getTrace().record(DELEGATED, copy);
|
trace.record(DELEGATED, copy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ public class ImportsResolver {
|
|||||||
private ModuleConfiguration configuration;
|
private ModuleConfiguration configuration;
|
||||||
@NotNull
|
@NotNull
|
||||||
private SingleImportResolver singleImportResolver;
|
private SingleImportResolver singleImportResolver;
|
||||||
|
@NotNull
|
||||||
|
private ObservableBindingTrace trace;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setContext(@NotNull TopDownAnalysisContext context) {
|
public void setContext(@NotNull TopDownAnalysisContext context) {
|
||||||
@@ -56,6 +58,11 @@ public class ImportsResolver {
|
|||||||
this.configuration = configuration;
|
this.configuration = configuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(@NotNull ObservableBindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
public ImportsResolver() {
|
public ImportsResolver() {
|
||||||
this.singleImportResolver = new SingleImportResolver();
|
this.singleImportResolver = new SingleImportResolver();
|
||||||
}
|
}
|
||||||
@@ -71,7 +78,7 @@ public class ImportsResolver {
|
|||||||
// On first phase all classes and objects are imported,
|
// On first phase all classes and objects are imported,
|
||||||
// on second phase previous imports are thrown and everything (including functions and properties at namespace level) is imported
|
// on second phase previous imports are thrown and everything (including functions and properties at namespace level) is imported
|
||||||
private void processImports(boolean firstPhase) {
|
private void processImports(boolean firstPhase) {
|
||||||
TemporaryBindingTrace temporaryTrace = TemporaryBindingTrace.create(context.getTrace()); //not to trace errors of default imports
|
TemporaryBindingTrace temporaryTrace = TemporaryBindingTrace.create(trace); //not to trace errors of default imports
|
||||||
for (JetFile file : context.getNamespaceDescriptors().keySet()) {
|
for (JetFile file : context.getNamespaceDescriptors().keySet()) {
|
||||||
WritableScope namespaceScope = context.getNamespaceScopes().get(file);
|
WritableScope namespaceScope = context.getNamespaceScopes().get(file);
|
||||||
Importer.DelayedImporter delayedImporter = new Importer.DelayedImporter(namespaceScope, firstPhase);
|
Importer.DelayedImporter delayedImporter = new Importer.DelayedImporter(namespaceScope, firstPhase);
|
||||||
@@ -87,7 +94,7 @@ public class ImportsResolver {
|
|||||||
|
|
||||||
List<JetImportDirective> importDirectives = file.getImportDirectives();
|
List<JetImportDirective> importDirectives = file.getImportDirectives();
|
||||||
for (JetImportDirective importDirective : importDirectives) {
|
for (JetImportDirective importDirective : importDirectives) {
|
||||||
Collection<? extends DeclarationDescriptor> descriptors = singleImportResolver.processImportReference(importDirective, namespaceScope, delayedImporter, context.getTrace(), firstPhase);
|
Collection<? extends DeclarationDescriptor> descriptors = singleImportResolver.processImportReference(importDirective, namespaceScope, delayedImporter, trace, firstPhase);
|
||||||
if (descriptors.size() == 1) {
|
if (descriptors.size() == 1) {
|
||||||
resolvedDirectives.put(importDirective, descriptors.iterator().next());
|
resolvedDirectives.put(importDirective, descriptors.iterator().next());
|
||||||
}
|
}
|
||||||
@@ -154,10 +161,10 @@ public class ImportsResolver {
|
|||||||
isResolved = namespaceScope.getNamespace(aliasName);
|
isResolved = namespaceScope.getNamespace(aliasName);
|
||||||
}
|
}
|
||||||
if (isResolved != null && isResolved != wasResolved) {
|
if (isResolved != null && isResolved != wasResolved) {
|
||||||
context.getTrace().report(USELESS_HIDDEN_IMPORT.on(importedReference));
|
trace.report(USELESS_HIDDEN_IMPORT.on(importedReference));
|
||||||
}
|
}
|
||||||
if (!importDirective.isAllUnder() && importedReference instanceof JetSimpleNameExpression && importDirective.getAliasName() == null) {
|
if (!importDirective.isAllUnder() && importedReference instanceof JetSimpleNameExpression && importDirective.getAliasName() == null) {
|
||||||
context.getTrace().report(USELESS_SIMPLE_IMPORT.on(importedReference));
|
trace.report(USELESS_SIMPLE_IMPORT.on(importedReference));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.RESOLUTION_SCOPE;
|
|||||||
public class NamespaceFactoryImpl implements NamespaceFactory {
|
public class NamespaceFactoryImpl implements NamespaceFactory {
|
||||||
|
|
||||||
private ModuleDescriptor moduleDescriptor;
|
private ModuleDescriptor moduleDescriptor;
|
||||||
private TopDownAnalysisContext context;
|
private BindingTrace trace;
|
||||||
private ModuleConfiguration configuration;
|
private ModuleConfiguration configuration;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -53,8 +53,8 @@ public class NamespaceFactoryImpl implements NamespaceFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setContext(TopDownAnalysisContext context) {
|
public void setTrace(BindingTrace trace) {
|
||||||
this.context = context;
|
this.trace = trace;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -83,14 +83,14 @@ public class NamespaceFactoryImpl implements NamespaceFactory {
|
|||||||
|
|
||||||
currentOwner = namespaceDescriptor;
|
currentOwner = namespaceDescriptor;
|
||||||
|
|
||||||
context.getTrace().record(REFERENCE_TARGET, nameExpression, currentOwner);
|
trace.record(REFERENCE_TARGET, nameExpression, currentOwner);
|
||||||
context.getTrace().record(RESOLUTION_SCOPE, nameExpression, outerScope);
|
trace.record(RESOLUTION_SCOPE, nameExpression, outerScope);
|
||||||
|
|
||||||
outerScope = namespaceDescriptor.getMemberScope();
|
outerScope = namespaceDescriptor.getMemberScope();
|
||||||
}
|
}
|
||||||
|
|
||||||
String name = JetPsiUtil.safeName(namespaceHeader.getName());
|
String name = JetPsiUtil.safeName(namespaceHeader.getName());
|
||||||
context.getTrace().record(RESOLUTION_SCOPE, namespaceHeader, outerScope);
|
trace.record(RESOLUTION_SCOPE, namespaceHeader, outerScope);
|
||||||
|
|
||||||
return createNamespaceDescriptorIfNeeded(file, currentOwner, name, false);
|
return createNamespaceDescriptorIfNeeded(file, currentOwner, name, false);
|
||||||
}
|
}
|
||||||
@@ -130,19 +130,19 @@ public class NamespaceFactoryImpl implements NamespaceFactory {
|
|||||||
Collections.<AnnotationDescriptor>emptyList(), // TODO: annotations
|
Collections.<AnnotationDescriptor>emptyList(), // TODO: annotations
|
||||||
name
|
name
|
||||||
);
|
);
|
||||||
context.getTrace().record(FQNAME_TO_NAMESPACE_DESCRIPTOR, fqName, namespaceDescriptor);
|
trace.record(FQNAME_TO_NAMESPACE_DESCRIPTOR, fqName, namespaceDescriptor);
|
||||||
WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, namespaceDescriptor, new TraceBasedRedeclarationHandler(context.getTrace())).setDebugName("Namespace member scope");
|
WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, namespaceDescriptor, new TraceBasedRedeclarationHandler(trace)).setDebugName("Namespace member scope");
|
||||||
scope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
scope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
||||||
namespaceDescriptor.initialize(scope);
|
namespaceDescriptor.initialize(scope);
|
||||||
configuration.extendNamespaceScope(context.getTrace(), namespaceDescriptor, scope);
|
configuration.extendNamespaceScope(trace, namespaceDescriptor, scope);
|
||||||
owner.addNamespace(namespaceDescriptor);
|
owner.addNamespace(namespaceDescriptor);
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
context.getTrace().record(BindingContext.NAMESPACE, file, namespaceDescriptor);
|
trace.record(BindingContext.NAMESPACE, file, namespaceDescriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
context.getTrace().record(BindingContext.FILE_TO_NAMESPACE, file, namespaceDescriptor);
|
trace.record(BindingContext.FILE_TO_NAMESPACE, file, namespaceDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return namespaceDescriptor;
|
return namespaceDescriptor;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.DELEGATED;
|
|||||||
*/
|
*/
|
||||||
public class OverloadResolver {
|
public class OverloadResolver {
|
||||||
private TopDownAnalysisContext context;
|
private TopDownAnalysisContext context;
|
||||||
|
private BindingTrace trace;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -44,6 +45,12 @@ public class OverloadResolver {
|
|||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(BindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void process() {
|
public void process() {
|
||||||
checkOverloads();
|
checkOverloads();
|
||||||
@@ -186,16 +193,16 @@ public class OverloadResolver {
|
|||||||
|
|
||||||
OverloadUtil.OverloadCompatibilityInfo overloadable = OverloadUtil.isOverloadable(function, function2);
|
OverloadUtil.OverloadCompatibilityInfo overloadable = OverloadUtil.isOverloadable(function, function2);
|
||||||
if (!overloadable.isSuccess()) {
|
if (!overloadable.isSuccess()) {
|
||||||
JetDeclaration member = (JetDeclaration) context.getTrace().get(BindingContext.DESCRIPTOR_TO_DECLARATION, function);
|
JetDeclaration member = (JetDeclaration) trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, function);
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
assert context.getTrace().get(DELEGATED, function);
|
assert trace.get(DELEGATED, function);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (function instanceof PropertyDescriptor) {
|
if (function instanceof PropertyDescriptor) {
|
||||||
context.getTrace().report(Errors.REDECLARATION.on(function, context.getTrace().getBindingContext()));
|
trace.report(Errors.REDECLARATION.on(function, trace.getBindingContext()));
|
||||||
} else {
|
} else {
|
||||||
context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(member, function, functionContainer));
|
trace.report(Errors.CONFLICTING_OVERLOADS.on(member, function, functionContainer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ public class OverrideResolver {
|
|||||||
|
|
||||||
private TopDownAnalysisContext context;
|
private TopDownAnalysisContext context;
|
||||||
private TopDownAnalysisParameters topDownAnalysisParameters;
|
private TopDownAnalysisParameters topDownAnalysisParameters;
|
||||||
|
private BindingTrace trace;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@@ -58,6 +59,11 @@ public class OverrideResolver {
|
|||||||
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(BindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void process() {
|
public void process() {
|
||||||
@@ -126,8 +132,8 @@ public class OverrideResolver {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
|
public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
|
||||||
JetDeclaration jetProperty = (JetDeclaration) context.getTrace().get(BindingContext.DESCRIPTOR_TO_DECLARATION, fromCurrent);
|
JetDeclaration jetProperty = (JetDeclaration) trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, fromCurrent);
|
||||||
context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(jetProperty, fromCurrent, fromCurrent.getContainingDeclaration().getName()));
|
trace.report(Errors.CONFLICTING_OVERLOADS.on(jetProperty, fromCurrent, fromCurrent.getContainingDeclaration().getName()));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -245,7 +251,7 @@ public class OverrideResolver {
|
|||||||
if (nameIdentifier == null) return;
|
if (nameIdentifier == null) return;
|
||||||
|
|
||||||
for (CallableMemberDescriptor memberDescriptor : manyImpl) {
|
for (CallableMemberDescriptor memberDescriptor : manyImpl) {
|
||||||
context.getTrace().report(MANY_IMPL_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, klass, memberDescriptor));
|
trace.report(MANY_IMPL_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, klass, memberDescriptor));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,7 +261,7 @@ public class OverrideResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (CallableMemberDescriptor memberDescriptor : abstractNoImpl) {
|
for (CallableMemberDescriptor memberDescriptor : abstractNoImpl) {
|
||||||
context.getTrace().report(ABSTRACT_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, klass, memberDescriptor));
|
trace.report(ABSTRACT_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, klass, memberDescriptor));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,9 +284,9 @@ public class OverrideResolver {
|
|||||||
// if (functionDescriptor.getModality() == Modality.ABSTRACT && !allOverriddenFunctions.contains(functionDescriptor.getOriginal()) && !foundError && nameIdentifier != null) {
|
// if (functionDescriptor.getModality() == Modality.ABSTRACT && !allOverriddenFunctions.contains(functionDescriptor.getOriginal()) && !foundError && nameIdentifier != null) {
|
||||||
// DeclarationDescriptor declarationDescriptor = functionDescriptor.getContainingDeclaration();
|
// DeclarationDescriptor declarationDescriptor = functionDescriptor.getContainingDeclaration();
|
||||||
// if (declarationDescriptor != classDescriptor) {
|
// if (declarationDescriptor != classDescriptor) {
|
||||||
//// context.getTrace().getErrorHandler().genericError(nameIdentifier.getNode(), "Class '" + klass.getName() + "' must be declared abstract or implement abstract method '" +
|
//// trace.getErrorHandler().genericError(nameIdentifier.getNode(), "Class '" + klass.getName() + "' must be declared abstract or implement abstract method '" +
|
||||||
//// functionDescriptor.getName() + "' declared in " + declarationDescriptor.getName());
|
//// functionDescriptor.getName() + "' declared in " + declarationDescriptor.getName());
|
||||||
// context.getTrace().report(ABSTRACT_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, klass, functionDescriptor));
|
// trace.report(ABSTRACT_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, klass, functionDescriptor));
|
||||||
// foundError = true;
|
// foundError = true;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
@@ -356,9 +362,9 @@ public class OverrideResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void checkOverride(CallableMemberDescriptor declared) {
|
private void checkOverride(CallableMemberDescriptor declared) {
|
||||||
JetNamedDeclaration member = (JetNamedDeclaration) context.getTrace().get(BindingContext.DESCRIPTOR_TO_DECLARATION, declared);
|
JetNamedDeclaration member = (JetNamedDeclaration) trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, declared);
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
assert context.getTrace().get(DELEGATED, declared);
|
assert trace.get(DELEGATED, declared);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,29 +383,29 @@ public class OverrideResolver {
|
|||||||
if (overridden != null) {
|
if (overridden != null) {
|
||||||
if (hasOverrideModifier) {
|
if (hasOverrideModifier) {
|
||||||
if (!overridden.getModality().isOverridable() && !finalOverriddenError) {
|
if (!overridden.getModality().isOverridable() && !finalOverriddenError) {
|
||||||
context.getTrace().report(OVERRIDING_FINAL_MEMBER.on(overrideNode.getPsi(), overridden, overridden.getContainingDeclaration()));
|
trace.report(OVERRIDING_FINAL_MEMBER.on(overrideNode.getPsi(), overridden, overridden.getContainingDeclaration()));
|
||||||
finalOverriddenError = true;
|
finalOverriddenError = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!OverridingUtil.isReturnTypeOkForOverride(JetTypeChecker.INSTANCE, overridden, declared) && !typeMismatchError) {
|
if (!OverridingUtil.isReturnTypeOkForOverride(JetTypeChecker.INSTANCE, overridden, declared) && !typeMismatchError) {
|
||||||
context.getTrace().report(RETURN_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden));
|
trace.report(RETURN_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden));
|
||||||
typeMismatchError = true;
|
typeMismatchError = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkPropertyKind(overridden, true) && checkPropertyKind(declared, false) && !kindMismatchError) {
|
if (checkPropertyKind(overridden, true) && checkPropertyKind(declared, false) && !kindMismatchError) {
|
||||||
context.getTrace().report(VAR_OVERRIDDEN_BY_VAL.on((JetProperty) member, (PropertyDescriptor) declared, (PropertyDescriptor) overridden));
|
trace.report(VAR_OVERRIDDEN_BY_VAL.on((JetProperty) member, (PropertyDescriptor) declared, (PropertyDescriptor) overridden));
|
||||||
kindMismatchError = true;
|
kindMismatchError = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasOverrideModifier && declared.getOverriddenDescriptors().size() == 0) {
|
if (hasOverrideModifier && declared.getOverriddenDescriptors().size() == 0) {
|
||||||
context.getTrace().report(NOTHING_TO_OVERRIDE.on(member, declared));
|
trace.report(NOTHING_TO_OVERRIDE.on(member, declared));
|
||||||
}
|
}
|
||||||
PsiElement nameIdentifier = member.getNameIdentifier();
|
PsiElement nameIdentifier = member.getNameIdentifier();
|
||||||
if (!hasOverrideModifier && declared.getOverriddenDescriptors().size() > 0 && nameIdentifier != null) {
|
if (!hasOverrideModifier && declared.getOverriddenDescriptors().size() > 0 && nameIdentifier != null) {
|
||||||
CallableMemberDescriptor overridden = declared.getOverriddenDescriptors().iterator().next();
|
CallableMemberDescriptor overridden = declared.getOverriddenDescriptors().iterator().next();
|
||||||
context.getTrace().report(VIRTUAL_MEMBER_HIDDEN.on(member, declared, overridden, overridden.getContainingDeclaration()));
|
trace.report(VIRTUAL_MEMBER_HIDDEN.on(member, declared, overridden, overridden.getContainingDeclaration()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,8 +36,6 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
public class TopDownAnalysisContext {
|
public class TopDownAnalysisContext {
|
||||||
|
|
||||||
private ObservableBindingTrace trace;
|
|
||||||
|
|
||||||
private final Map<JetClass, MutableClassDescriptor> classes = Maps.newLinkedHashMap();
|
private final Map<JetClass, MutableClassDescriptor> classes = Maps.newLinkedHashMap();
|
||||||
private final Map<JetObjectDeclaration, MutableClassDescriptor> objects = Maps.newLinkedHashMap();
|
private final Map<JetObjectDeclaration, MutableClassDescriptor> objects = Maps.newLinkedHashMap();
|
||||||
protected final Map<JetFile, WritableScope> namespaceScopes = Maps.newHashMap();
|
protected final Map<JetFile, WritableScope> namespaceScopes = Maps.newHashMap();
|
||||||
@@ -57,7 +55,6 @@ public class TopDownAnalysisContext {
|
|||||||
@Inject
|
@Inject
|
||||||
public void setTopDownAnalysisParameters(TopDownAnalysisParameters topDownAnalysisParameters) {
|
public void setTopDownAnalysisParameters(TopDownAnalysisParameters topDownAnalysisParameters) {
|
||||||
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
||||||
this.trace = new ObservableBindingTrace(topDownAnalysisParameters.getTrace());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -90,11 +87,6 @@ public class TopDownAnalysisContext {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public ObservableBindingTrace getTrace() {
|
|
||||||
return trace;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<JetClass, MutableClassDescriptor> getClasses() {
|
public Map<JetClass, MutableClassDescriptor> getClasses() {
|
||||||
return classes;
|
return classes;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-10
@@ -30,18 +30,14 @@ public class TopDownAnalysisParameters {
|
|||||||
private final Predicate<PsiFile> analyzeCompletely;
|
private final Predicate<PsiFile> analyzeCompletely;
|
||||||
private final boolean analyzingBootstrapLibrary;
|
private final boolean analyzingBootstrapLibrary;
|
||||||
private final boolean declaredLocally;
|
private final boolean declaredLocally;
|
||||||
@NotNull
|
|
||||||
private final BindingTrace trace;
|
|
||||||
|
|
||||||
public TopDownAnalysisParameters(
|
public TopDownAnalysisParameters(
|
||||||
@NotNull Predicate<PsiFile> analyzeCompletely,
|
@NotNull Predicate<PsiFile> analyzeCompletely,
|
||||||
boolean analyzingBootstrapLibrary,
|
boolean analyzingBootstrapLibrary,
|
||||||
boolean declaredLocally,
|
boolean declaredLocally) {
|
||||||
@NotNull BindingTrace trace) {
|
|
||||||
this.analyzeCompletely = analyzeCompletely;
|
this.analyzeCompletely = analyzeCompletely;
|
||||||
this.analyzingBootstrapLibrary = analyzingBootstrapLibrary;
|
this.analyzingBootstrapLibrary = analyzingBootstrapLibrary;
|
||||||
this.declaredLocally = declaredLocally;
|
this.declaredLocally = declaredLocally;
|
||||||
this.trace = trace;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -56,9 +52,4 @@ public class TopDownAnalysisParameters {
|
|||||||
public boolean isDeclaredLocally() {
|
public boolean isDeclaredLocally() {
|
||||||
return declaredLocally;
|
return declaredLocally;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public BindingTrace getTrace() {
|
|
||||||
return trace;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,6 +60,8 @@ public class TopDownAnalyzer {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private TopDownAnalysisContext context;
|
private TopDownAnalysisContext context;
|
||||||
@NotNull
|
@NotNull
|
||||||
|
private BindingTrace trace;
|
||||||
|
@NotNull
|
||||||
private ModuleConfiguration configuration;
|
private ModuleConfiguration configuration;
|
||||||
@NotNull
|
@NotNull
|
||||||
private ModuleDescriptor moduleDescriptor;
|
private ModuleDescriptor moduleDescriptor;
|
||||||
@@ -100,6 +102,11 @@ public class TopDownAnalyzer {
|
|||||||
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
this.topDownAnalysisParameters = topDownAnalysisParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(@NotNull BindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setContext(@NotNull TopDownAnalysisContext context) {
|
public void setContext(@NotNull TopDownAnalysisContext context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
@@ -150,9 +157,10 @@ public class TopDownAnalyzer {
|
|||||||
@NotNull ModuleConfiguration configuration,
|
@NotNull ModuleConfiguration configuration,
|
||||||
boolean declaredLocally) {
|
boolean declaredLocally) {
|
||||||
|
|
||||||
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(analyzeCompletely, false, declaredLocally, trace);
|
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(analyzeCompletely, false, declaredLocally);
|
||||||
|
|
||||||
InjectorForTopDownAnalyzerBasic injector = new InjectorForTopDownAnalyzerBasic(project, topDownAnalysisParameters, moduleDescriptor, flowDataTraceFactory, configuration);
|
InjectorForTopDownAnalyzerBasic injector = new InjectorForTopDownAnalyzerBasic(
|
||||||
|
project, topDownAnalysisParameters, new ObservableBindingTrace(trace), moduleDescriptor, flowDataTraceFactory, configuration);
|
||||||
|
|
||||||
injector.getTopDownAnalyzer().doProcess(outerScope, owner, declarations);
|
injector.getTopDownAnalyzer().doProcess(outerScope, owner, declarations);
|
||||||
|
|
||||||
@@ -204,9 +212,9 @@ public class TopDownAnalyzer {
|
|||||||
@NotNull NamespaceDescriptorImpl standardLibraryNamespace,
|
@NotNull NamespaceDescriptorImpl standardLibraryNamespace,
|
||||||
@NotNull List<JetFile> files) {
|
@NotNull List<JetFile> files) {
|
||||||
|
|
||||||
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(Predicates.<PsiFile>alwaysFalse(), true, false, trace);
|
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(Predicates.<PsiFile>alwaysFalse(), true, false);
|
||||||
InjectorForTopDownAnalyzerBasic injector = new InjectorForTopDownAnalyzerBasic(
|
InjectorForTopDownAnalyzerBasic injector = new InjectorForTopDownAnalyzerBasic(
|
||||||
project, topDownAnalysisParameters,
|
project, topDownAnalysisParameters, new ObservableBindingTrace(trace),
|
||||||
JetStandardClasses.FAKE_STANDARD_CLASSES_MODULE, null, ModuleConfiguration.EMPTY);
|
JetStandardClasses.FAKE_STANDARD_CLASSES_MODULE, null, ModuleConfiguration.EMPTY);
|
||||||
|
|
||||||
injector.getTopDownAnalyzer().doProcessStandardLibraryNamespace(outerScope, standardLibraryNamespace, files);
|
injector.getTopDownAnalyzer().doProcessStandardLibraryNamespace(outerScope, standardLibraryNamespace, files);
|
||||||
@@ -274,10 +282,10 @@ public class TopDownAnalyzer {
|
|||||||
final ModuleDescriptor owner = new ModuleDescriptor("<module>");
|
final ModuleDescriptor owner = new ModuleDescriptor("<module>");
|
||||||
|
|
||||||
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(
|
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(
|
||||||
filesToAnalyzeCompletely, false, false, bindingTraceContext);
|
filesToAnalyzeCompletely, false, false);
|
||||||
|
|
||||||
InjectorForTopDownAnalyzerBasic injector = new InjectorForTopDownAnalyzerBasic(
|
InjectorForTopDownAnalyzerBasic injector = new InjectorForTopDownAnalyzerBasic(
|
||||||
project, topDownAnalysisParameters, owner, flowDataTraceFactory, configuration);
|
project, topDownAnalysisParameters, new ObservableBindingTrace(bindingTraceContext), owner, flowDataTraceFactory, configuration);
|
||||||
|
|
||||||
|
|
||||||
injector.getTopDownAnalyzer().doAnalyzeFilesWithGivenTrance2(files);
|
injector.getTopDownAnalyzer().doAnalyzeFilesWithGivenTrance2(files);
|
||||||
@@ -286,7 +294,7 @@ public class TopDownAnalyzer {
|
|||||||
public void doAnalyzeFilesWithGivenTrance2(Collection<JetFile> files) {
|
public void doAnalyzeFilesWithGivenTrance2(Collection<JetFile> files) {
|
||||||
final WritableScope scope = new WritableScopeImpl(
|
final WritableScope scope = new WritableScopeImpl(
|
||||||
JetScope.EMPTY, moduleDescriptor,
|
JetScope.EMPTY, moduleDescriptor,
|
||||||
new TraceBasedRedeclarationHandler(topDownAnalysisParameters.getTrace())).setDebugName("Root scope in analyzeNamespace");
|
new TraceBasedRedeclarationHandler(trace)).setDebugName("Root scope in analyzeNamespace");
|
||||||
scope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
scope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
||||||
|
|
||||||
NamespaceDescriptorImpl rootNs = namespaceFactory.createNamespaceDescriptorPathIfNeeded(FqName.ROOT);
|
NamespaceDescriptorImpl rootNs = namespaceFactory.createNamespaceDescriptorPathIfNeeded(FqName.ROOT);
|
||||||
|
|||||||
@@ -23,13 +23,11 @@ import com.intellij.psi.PsiElement;
|
|||||||
import com.intellij.psi.PsiNameIdentifierOwner;
|
import com.intellij.psi.PsiNameIdentifierOwner;
|
||||||
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.ModuleConfiguration;
|
|
||||||
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.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WriteThroughScope;
|
import org.jetbrains.jet.lang.resolve.scopes.WriteThroughScope;
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.lang.types.TypeConstructor;
|
import org.jetbrains.jet.lang.types.TypeConstructor;
|
||||||
@@ -56,6 +54,8 @@ public class TypeHierarchyResolver {
|
|||||||
private DescriptorResolver descriptorResolver;
|
private DescriptorResolver descriptorResolver;
|
||||||
@NotNull
|
@NotNull
|
||||||
private NamespaceFactoryImpl namespaceFactory;
|
private NamespaceFactoryImpl namespaceFactory;
|
||||||
|
@NotNull
|
||||||
|
private BindingTrace trace;
|
||||||
|
|
||||||
// state
|
// state
|
||||||
private LinkedList<MutableClassDescriptor> topologicalOrder;
|
private LinkedList<MutableClassDescriptor> topologicalOrder;
|
||||||
@@ -80,6 +80,11 @@ public class TypeHierarchyResolver {
|
|||||||
this.namespaceFactory = namespaceFactory;
|
this.namespaceFactory = namespaceFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setTrace(@NotNull ObservableBindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void process(@NotNull JetScope outerScope, @NotNull NamespaceLikeBuilder owner, @NotNull Collection<? extends PsiElement> declarations) {
|
public void process(@NotNull JetScope outerScope, @NotNull NamespaceLikeBuilder owner, @NotNull Collection<? extends PsiElement> declarations) {
|
||||||
@@ -115,7 +120,7 @@ public class TypeHierarchyResolver {
|
|||||||
NamespaceDescriptorImpl namespaceDescriptor = namespaceFactory.createNamespaceDescriptorPathIfNeeded(file, outerScope);
|
NamespaceDescriptorImpl namespaceDescriptor = namespaceFactory.createNamespaceDescriptorPathIfNeeded(file, outerScope);
|
||||||
context.getNamespaceDescriptors().put(file, namespaceDescriptor);
|
context.getNamespaceDescriptors().put(file, namespaceDescriptor);
|
||||||
|
|
||||||
WriteThroughScope namespaceScope = new WriteThroughScope(outerScope, namespaceDescriptor.getMemberScope(), new TraceBasedRedeclarationHandler(context.getTrace()));
|
WriteThroughScope namespaceScope = new WriteThroughScope(outerScope, namespaceDescriptor.getMemberScope(), new TraceBasedRedeclarationHandler(trace));
|
||||||
namespaceScope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
namespaceScope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
||||||
context.getNamespaceScopes().put(file, namespaceScope);
|
context.getNamespaceScopes().put(file, namespaceScope);
|
||||||
|
|
||||||
@@ -124,11 +129,11 @@ public class TypeHierarchyResolver {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitClass(JetClass klass) {
|
public void visitClass(JetClass klass) {
|
||||||
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(context.getTrace(), owner.getOwnerForChildren(), outerScope, getClassKind(klass));
|
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner.getOwnerForChildren(), outerScope, getClassKind(klass));
|
||||||
context.getTrace().record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(klass), mutableClassDescriptor);
|
trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(klass), mutableClassDescriptor);
|
||||||
|
|
||||||
if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) {
|
if (klass.hasModifier(JetTokens.ENUM_KEYWORD)) {
|
||||||
MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(context.getTrace(), mutableClassDescriptor, outerScope, ClassKind.OBJECT);
|
MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(trace, mutableClassDescriptor, outerScope, ClassKind.OBJECT);
|
||||||
classObjectDescriptor.setName("class-object-for-" + klass.getName());
|
classObjectDescriptor.setName("class-object-for-" + klass.getName());
|
||||||
classObjectDescriptor.setModality(Modality.FINAL);
|
classObjectDescriptor.setModality(Modality.FINAL);
|
||||||
classObjectDescriptor.setVisibility(DescriptorResolver.resolveVisibilityFromModifiers(klass.getModifierList()));
|
classObjectDescriptor.setVisibility(DescriptorResolver.resolveVisibilityFromModifiers(klass.getModifierList()));
|
||||||
@@ -146,7 +151,7 @@ public class TypeHierarchyResolver {
|
|||||||
@Override
|
@Override
|
||||||
public void visitObjectDeclaration(JetObjectDeclaration declaration) {
|
public void visitObjectDeclaration(JetObjectDeclaration declaration) {
|
||||||
final MutableClassDescriptor objectDescriptor = createClassDescriptorForObject(declaration, owner, outerScope, ClassKind.OBJECT);
|
final MutableClassDescriptor objectDescriptor = createClassDescriptorForObject(declaration, owner, outerScope, ClassKind.OBJECT);
|
||||||
context.getTrace().record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(declaration), objectDescriptor);
|
trace.record(FQNAME_TO_CLASS_DESCRIPTOR, JetPsiUtil.getFQName(declaration), objectDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -157,7 +162,7 @@ public class TypeHierarchyResolver {
|
|||||||
createClassDescriptorForObject(enumEntry, classObjectDescriptor, outerScopeForStatic, ClassKind.ENUM_ENTRY);
|
createClassDescriptorForObject(enumEntry, classObjectDescriptor, outerScopeForStatic, ClassKind.ENUM_ENTRY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(context.getTrace(), classObjectDescriptor, outerScope, ClassKind.ENUM_ENTRY);
|
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, classObjectDescriptor, outerScope, ClassKind.ENUM_ENTRY);
|
||||||
visitClassOrObject(
|
visitClassOrObject(
|
||||||
enumEntry,
|
enumEntry,
|
||||||
(Map) context.getClasses(),
|
(Map) context.getClasses(),
|
||||||
@@ -167,7 +172,7 @@ public class TypeHierarchyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private MutableClassDescriptor createClassDescriptorForObject(@NotNull JetClassOrObject declaration, @NotNull NamespaceLikeBuilder owner, JetScope scope, ClassKind classKind) {
|
private MutableClassDescriptor createClassDescriptorForObject(@NotNull JetClassOrObject declaration, @NotNull NamespaceLikeBuilder owner, JetScope scope, ClassKind classKind) {
|
||||||
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(context.getTrace(), owner.getOwnerForChildren(), scope, classKind) {
|
MutableClassDescriptor mutableClassDescriptor = new MutableClassDescriptor(trace, owner.getOwnerForChildren(), scope, classKind) {
|
||||||
@Override
|
@Override
|
||||||
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) {
|
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) {
|
||||||
return ClassObjectStatus.NOT_ALLOWED;
|
return ClassObjectStatus.NOT_ALLOWED;
|
||||||
@@ -177,7 +182,7 @@ public class TypeHierarchyResolver {
|
|||||||
visitClassOrObject(declaration, map, mutableClassDescriptor);
|
visitClassOrObject(declaration, map, mutableClassDescriptor);
|
||||||
createPrimaryConstructorForObject((JetDeclaration) declaration, mutableClassDescriptor);
|
createPrimaryConstructorForObject((JetDeclaration) declaration, mutableClassDescriptor);
|
||||||
owner.addObjectDescriptor(mutableClassDescriptor);
|
owner.addObjectDescriptor(mutableClassDescriptor);
|
||||||
context.getTrace().record(BindingContext.CLASS, declaration, mutableClassDescriptor);
|
trace.record(BindingContext.CLASS, declaration, mutableClassDescriptor);
|
||||||
return mutableClassDescriptor;
|
return mutableClassDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,9 +191,9 @@ public class TypeHierarchyResolver {
|
|||||||
constructorDescriptor.initialize(Collections.<TypeParameterDescriptor>emptyList(), Collections.<ValueParameterDescriptor>emptyList(),
|
constructorDescriptor.initialize(Collections.<TypeParameterDescriptor>emptyList(), Collections.<ValueParameterDescriptor>emptyList(),
|
||||||
Visibility.INTERNAL);//TODO check set mutableClassDescriptor.getVisibility()
|
Visibility.INTERNAL);//TODO check set mutableClassDescriptor.getVisibility()
|
||||||
// TODO : make the constructor private?
|
// TODO : make the constructor private?
|
||||||
mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor, context.getTrace());
|
mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor, trace);
|
||||||
if (object != null) {
|
if (object != null) {
|
||||||
context.getTrace().record(CONSTRUCTOR, object, constructorDescriptor);
|
trace.record(CONSTRUCTOR, object, constructorDescriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,7 +209,7 @@ public class TypeHierarchyResolver {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitTypedef(JetTypedef typedef) {
|
public void visitTypedef(JetTypedef typedef) {
|
||||||
context.getTrace().report(UNSUPPORTED.on(typedef, "TypeHierarchyResolver"));
|
trace.report(UNSUPPORTED.on(typedef, "TypeHierarchyResolver"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -214,10 +219,10 @@ public class TypeHierarchyResolver {
|
|||||||
NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(createClassDescriptorForObject(objectDeclaration, owner, outerScopeForStatic, ClassKind.OBJECT));
|
NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(createClassDescriptorForObject(objectDeclaration, owner, outerScopeForStatic, ClassKind.OBJECT));
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case DUPLICATE:
|
case DUPLICATE:
|
||||||
context.getTrace().report(MANY_CLASS_OBJECTS.on(classObject));
|
trace.report(MANY_CLASS_OBJECTS.on(classObject));
|
||||||
break;
|
break;
|
||||||
case NOT_ALLOWED:
|
case NOT_ALLOWED:
|
||||||
context.getTrace().report(CLASS_OBJECT_NOT_ALLOWED.on(classObject));
|
trace.report(CLASS_OBJECT_NOT_ALLOWED.on(classObject));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -238,7 +243,7 @@ public class TypeHierarchyResolver {
|
|||||||
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
|
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
|
||||||
JetClass jetClass = entry.getKey();
|
JetClass jetClass = entry.getKey();
|
||||||
MutableClassDescriptor descriptor = entry.getValue();
|
MutableClassDescriptor descriptor = entry.getValue();
|
||||||
descriptorResolver.resolveMutableClassDescriptor(jetClass, descriptor, context.getTrace());
|
descriptorResolver.resolveMutableClassDescriptor(jetClass, descriptor, trace);
|
||||||
descriptor.createTypeConstructor();
|
descriptor.createTypeConstructor();
|
||||||
}
|
}
|
||||||
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
|
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
|
||||||
@@ -255,13 +260,13 @@ public class TypeHierarchyResolver {
|
|||||||
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
|
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
|
||||||
JetClass jetClass = entry.getKey();
|
JetClass jetClass = entry.getKey();
|
||||||
MutableClassDescriptor descriptor = entry.getValue();
|
MutableClassDescriptor descriptor = entry.getValue();
|
||||||
descriptorResolver.resolveGenericBounds(jetClass, descriptor.getScopeForSupertypeResolution(), descriptor.getTypeConstructor().getParameters(), context.getTrace());
|
descriptorResolver.resolveGenericBounds(jetClass, descriptor.getScopeForSupertypeResolution(), descriptor.getTypeConstructor().getParameters(), trace);
|
||||||
descriptorResolver.resolveSupertypes(jetClass, descriptor, context.getTrace());
|
descriptorResolver.resolveSupertypes(jetClass, descriptor, trace);
|
||||||
}
|
}
|
||||||
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
|
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
|
||||||
JetClassOrObject jetClass = entry.getKey();
|
JetClassOrObject jetClass = entry.getKey();
|
||||||
MutableClassDescriptor descriptor = entry.getValue();
|
MutableClassDescriptor descriptor = entry.getValue();
|
||||||
descriptorResolver.resolveSupertypes(jetClass, descriptor, context.getTrace());
|
descriptorResolver.resolveSupertypes(jetClass, descriptor, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,7 +349,7 @@ public class TypeHierarchyResolver {
|
|||||||
if (!found) continue;
|
if (!found) continue;
|
||||||
|
|
||||||
ClassDescriptor superclass = (i < size - 1) ? currentPath.get(i + 1) : current;
|
ClassDescriptor superclass = (i < size - 1) ? currentPath.get(i + 1) : current;
|
||||||
PsiElement psiElement = context.getTrace().get(DESCRIPTOR_TO_DECLARATION, classDescriptor);
|
PsiElement psiElement = trace.get(DESCRIPTOR_TO_DECLARATION, classDescriptor);
|
||||||
|
|
||||||
PsiElement elementToMark = null;
|
PsiElement elementToMark = null;
|
||||||
if (psiElement instanceof JetClassOrObject) {
|
if (psiElement instanceof JetClassOrObject) {
|
||||||
@@ -352,7 +357,7 @@ public class TypeHierarchyResolver {
|
|||||||
for (JetDelegationSpecifier delegationSpecifier : classOrObject.getDelegationSpecifiers()) {
|
for (JetDelegationSpecifier delegationSpecifier : classOrObject.getDelegationSpecifiers()) {
|
||||||
JetTypeReference typeReference = delegationSpecifier.getTypeReference();
|
JetTypeReference typeReference = delegationSpecifier.getTypeReference();
|
||||||
if (typeReference == null) continue;
|
if (typeReference == null) continue;
|
||||||
JetType supertype = context.getTrace().get(TYPE, typeReference);
|
JetType supertype = trace.get(TYPE, typeReference);
|
||||||
if (supertype != null && supertype.getConstructor() == superclass.getTypeConstructor()) {
|
if (supertype != null && supertype.getConstructor() == superclass.getTypeConstructor()) {
|
||||||
elementToMark = typeReference;
|
elementToMark = typeReference;
|
||||||
}
|
}
|
||||||
@@ -366,7 +371,7 @@ public class TypeHierarchyResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (elementToMark != null) {
|
if (elementToMark != null) {
|
||||||
context.getTrace().report(CYCLIC_INHERITANCE_HIERARCHY.on(elementToMark));
|
trace.report(CYCLIC_INHERITANCE_HIERARCHY.on(elementToMark));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -404,13 +409,13 @@ public class TypeHierarchyResolver {
|
|||||||
if (conflictingTypes.size() > 1) {
|
if (conflictingTypes.size() > 1) {
|
||||||
DeclarationDescriptor containingDeclaration = typeParameterDescriptor.getContainingDeclaration();
|
DeclarationDescriptor containingDeclaration = typeParameterDescriptor.getContainingDeclaration();
|
||||||
assert containingDeclaration instanceof ClassDescriptor : containingDeclaration;
|
assert containingDeclaration instanceof ClassDescriptor : containingDeclaration;
|
||||||
PsiElement psiElement = context.getTrace().get(DESCRIPTOR_TO_DECLARATION, mutableClassDescriptor);
|
PsiElement psiElement = trace.get(DESCRIPTOR_TO_DECLARATION, mutableClassDescriptor);
|
||||||
assert psiElement instanceof JetClassOrObject : psiElement;
|
assert psiElement instanceof JetClassOrObject : psiElement;
|
||||||
JetClassOrObject declaration = (JetClassOrObject) psiElement;
|
JetClassOrObject declaration = (JetClassOrObject) psiElement;
|
||||||
JetDelegationSpecifierList delegationSpecifierList = declaration.getDelegationSpecifierList();
|
JetDelegationSpecifierList delegationSpecifierList = declaration.getDelegationSpecifierList();
|
||||||
assert delegationSpecifierList != null;
|
assert delegationSpecifierList != null;
|
||||||
// context.getTrace().getErrorHandler().genericError(delegationSpecifierList.getNode(), "Type parameter " + typeParameterDescriptor.getName() + " of " + containingDeclaration.getName() + " has inconsistent values: " + conflictingTypes);
|
// trace.getErrorHandler().genericError(delegationSpecifierList.getNode(), "Type parameter " + typeParameterDescriptor.getName() + " of " + containingDeclaration.getName() + " has inconsistent values: " + conflictingTypes);
|
||||||
context.getTrace().report(INCONSISTENT_TYPE_PARAMETER_VALUES.on(delegationSpecifierList, typeParameterDescriptor, (ClassDescriptor) containingDeclaration, conflictingTypes));
|
trace.report(INCONSISTENT_TYPE_PARAMETER_VALUES.on(delegationSpecifierList, typeParameterDescriptor, (ClassDescriptor) containingDeclaration, conflictingTypes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -454,9 +459,9 @@ public class TypeHierarchyResolver {
|
|||||||
for (JetDelegationSpecifier delegationSpecifier : jetClass.getDelegationSpecifiers()) {
|
for (JetDelegationSpecifier delegationSpecifier : jetClass.getDelegationSpecifiers()) {
|
||||||
JetTypeReference typeReference = delegationSpecifier.getTypeReference();
|
JetTypeReference typeReference = delegationSpecifier.getTypeReference();
|
||||||
if (typeReference != null) {
|
if (typeReference != null) {
|
||||||
JetType type = context.getTrace().getBindingContext().get(TYPE, typeReference);
|
JetType type = trace.getBindingContext().get(TYPE, typeReference);
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
descriptorResolver.checkBounds(typeReference, type, context.getTrace());
|
descriptorResolver.checkBounds(typeReference, type, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -464,9 +469,9 @@ public class TypeHierarchyResolver {
|
|||||||
for (JetTypeParameter jetTypeParameter : jetClass.getTypeParameters()) {
|
for (JetTypeParameter jetTypeParameter : jetClass.getTypeParameters()) {
|
||||||
JetTypeReference extendsBound = jetTypeParameter.getExtendsBound();
|
JetTypeReference extendsBound = jetTypeParameter.getExtendsBound();
|
||||||
if (extendsBound != null) {
|
if (extendsBound != null) {
|
||||||
JetType type = context.getTrace().getBindingContext().get(TYPE, extendsBound);
|
JetType type = trace.getBindingContext().get(TYPE, extendsBound);
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
descriptorResolver.checkBounds(extendsBound, type, context.getTrace());
|
descriptorResolver.checkBounds(extendsBound, type, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -474,9 +479,9 @@ public class TypeHierarchyResolver {
|
|||||||
for (JetTypeConstraint constraint : jetClass.getTypeConstaints()) {
|
for (JetTypeConstraint constraint : jetClass.getTypeConstaints()) {
|
||||||
JetTypeReference extendsBound = constraint.getBoundTypeReference();
|
JetTypeReference extendsBound = constraint.getBoundTypeReference();
|
||||||
if (extendsBound != null) {
|
if (extendsBound != null) {
|
||||||
JetType type = context.getTrace().getBindingContext().get(TYPE, extendsBound);
|
JetType type = trace.getBindingContext().get(TYPE, extendsBound);
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
descriptorResolver.checkBounds(extendsBound, type, context.getTrace());
|
descriptorResolver.checkBounds(extendsBound, type, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ public class AllInjectorsGenerator {
|
|||||||
DependencyInjectorGenerator generator = new DependencyInjectorGenerator(false);
|
DependencyInjectorGenerator generator = new DependencyInjectorGenerator(false);
|
||||||
generateInjectorForTopDownAnalyzerCommon(generator);
|
generateInjectorForTopDownAnalyzerCommon(generator);
|
||||||
generator.addPublicField(JavaBridgeConfiguration.class);
|
generator.addPublicField(JavaBridgeConfiguration.class);
|
||||||
generator.addPublicParameter(BindingTrace.class);
|
|
||||||
generator.generate("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJvm");
|
generator.generate("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJvm");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,6 +71,7 @@ public class AllInjectorsGenerator {
|
|||||||
// Parameters
|
// Parameters
|
||||||
generator.addPublicParameter(Project.class);
|
generator.addPublicParameter(Project.class);
|
||||||
generator.addPublicParameter(TopDownAnalysisParameters.class);
|
generator.addPublicParameter(TopDownAnalysisParameters.class);
|
||||||
|
generator.addPublicParameter(ObservableBindingTrace.class);
|
||||||
generator.addParameter(ModuleDescriptor.class);
|
generator.addParameter(ModuleDescriptor.class);
|
||||||
generator.addParameter(JetControlFlowDataTraceFactory.class, false);
|
generator.addParameter(JetControlFlowDataTraceFactory.class, false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user