Unified processing in TopDownAnalyzer to avoid inconsistencies
This commit is contained in:
@@ -97,6 +97,8 @@ public class OverrideResolver {
|
||||
}
|
||||
|
||||
protected void checkOverridesInAClass(MutableClassDescriptor classDescriptor, JetClassOrObject klass) {
|
||||
if (context.analyzingBootstrapLibrary()) return;
|
||||
|
||||
// Check overrides for internal consistency
|
||||
for (CallableMemberDescriptor member : classDescriptor.getCallableMembers()) {
|
||||
checkOverride(member);
|
||||
|
||||
@@ -41,6 +41,8 @@ import java.util.Set;
|
||||
|
||||
private StringBuilder debugOutput;
|
||||
|
||||
private boolean analyzingBootstrapLibrary = false;
|
||||
|
||||
public TopDownAnalysisContext(JetSemanticServices semanticServices, BindingTrace trace, Predicate<PsiFile> analyzeCompletely) {
|
||||
this.trace = new ObservableBindingTrace(trace);
|
||||
this.semanticServices = semanticServices;
|
||||
@@ -66,6 +68,14 @@ import java.util.Set;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean analyzingBootstrapLibrary() {
|
||||
return analyzingBootstrapLibrary;
|
||||
}
|
||||
|
||||
public void setAnalyzingBootstrapLibrary(boolean analyzingBootstrapLibrary) {
|
||||
this.analyzingBootstrapLibrary = analyzingBootstrapLibrary;
|
||||
}
|
||||
|
||||
public boolean completeAnalysisNeeded(@NotNull PsiElement element) {
|
||||
PsiFile containingFile = element.getContainingFile();
|
||||
boolean result = containingFile != null && analyzeCompletely.apply(containingFile);
|
||||
|
||||
@@ -7,7 +7,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.psi.JetClassOrObject;
|
||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||
import org.jetbrains.jet.lang.psi.JetNamespace;
|
||||
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
||||
@@ -45,6 +44,16 @@ public class TopDownAnalyzer {
|
||||
@NotNull JetControlFlowDataTraceFactory flowDataTraceFactory,
|
||||
boolean declaredLocally) {
|
||||
TopDownAnalysisContext context = new TopDownAnalysisContext(semanticServices, trace, analyzeCompletely);
|
||||
doProcess(context, outerScope, owner, declarations, flowDataTraceFactory, declaredLocally);
|
||||
|
||||
}
|
||||
|
||||
private static void doProcess(
|
||||
TopDownAnalysisContext context, JetScope outerScope,
|
||||
NamespaceLike owner,
|
||||
Collection<? extends JetDeclaration> declarations,
|
||||
JetControlFlowDataTraceFactory flowDataTraceFactory,
|
||||
boolean declaredLocally) {
|
||||
// context.enableDebugOutput();
|
||||
context.debug("Enter");
|
||||
|
||||
@@ -53,9 +62,11 @@ public class TopDownAnalyzer {
|
||||
new DelegationResolver(context).process();
|
||||
new OverrideResolver(context).process();
|
||||
new OverloadResolver(context).process();
|
||||
new BodyResolver(context).resolveBehaviorDeclarationBodies();
|
||||
new ControlFlowAnalyzer(context, flowDataTraceFactory, declaredLocally).process();
|
||||
new DeclarationsChecker(context).process();
|
||||
if (!context.analyzingBootstrapLibrary()) {
|
||||
new BodyResolver(context).resolveBehaviorDeclarationBodies();
|
||||
new ControlFlowAnalyzer(context, flowDataTraceFactory, declaredLocally).process();
|
||||
new DeclarationsChecker(context).process();
|
||||
}
|
||||
|
||||
context.debug("Exit");
|
||||
context.printDebugOutput(System.out);
|
||||
@@ -69,17 +80,9 @@ public class TopDownAnalyzer {
|
||||
context.getNamespaceScopes().put(namespace, standardLibraryNamespace.getMemberScope());
|
||||
context.getNamespaceDescriptors().put(namespace, standardLibraryNamespace);
|
||||
context.getDeclaringScopes().put(namespace, outerScope);
|
||||
context.setAnalyzingBootstrapLibrary(true);
|
||||
|
||||
new TypeHierarchyResolver(context).process(outerScope, standardLibraryNamespace, namespace.getDeclarations());
|
||||
new DeclarationResolver(context).process();
|
||||
new DelegationResolver(context).process();
|
||||
OverrideResolver overrideResolver = new OverrideResolver(context) {
|
||||
@Override
|
||||
protected void checkOverridesInAClass(MutableClassDescriptor classDescriptor, JetClassOrObject klass) {
|
||||
}
|
||||
};
|
||||
overrideResolver.process();
|
||||
new BodyResolver(context).resolveBehaviorDeclarationBodies();
|
||||
doProcess(context, outerScope, standardLibraryNamespace, namespace.getDeclarations(), JetControlFlowDataTraceFactory.EMPTY, false);
|
||||
}
|
||||
|
||||
public static void processObject(
|
||||
|
||||
Reference in New Issue
Block a user