Refactor ExpressionTypingVisitorDispatcher to make it more "componentlike"

This commit is contained in:
Pavel V. Talanov
2015-04-14 19:27:14 +03:00
parent 1e5108a2ab
commit 50ae8182b8
@@ -38,11 +38,40 @@ import static org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtil
public class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTypeInfo, ExpressionTypingContext> implements ExpressionTypingInternals { public class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTypeInfo, ExpressionTypingContext> implements ExpressionTypingInternals {
public interface StatementVisitorProvider {
ExpressionTypingVisitorForStatements get(@NotNull ExpressionTypingContext context);
}
public class StatementVisitorProviderForBlock implements StatementVisitorProvider {
private final ExpressionTypingVisitorForStatements visitorForBlock;
public StatementVisitorProviderForBlock(@NotNull WritableScope scope) {
visitorForBlock = new ExpressionTypingVisitorForStatements(
ExpressionTypingVisitorDispatcher.this, scope, basic, controlStructures, patterns, functions
);
}
@Override
public ExpressionTypingVisitorForStatements get(@NotNull ExpressionTypingContext context) {
return visitorForBlock;
}
}
public class StatementVisitorProviderForDeclarations implements StatementVisitorProvider {
@Override
public ExpressionTypingVisitorForStatements get(@NotNull ExpressionTypingContext context) {
return createStatementVisitor(context);
}
}
private static final Logger LOG = Logger.getInstance(ExpressionTypingVisitor.class); private static final Logger LOG = Logger.getInstance(ExpressionTypingVisitor.class);
@NotNull @NotNull
public static ExpressionTypingFacade create(@NotNull ExpressionTypingComponents components) { public static ExpressionTypingFacade create(@NotNull ExpressionTypingComponents components) {
return new ExpressionTypingVisitorDispatcher(components, null); ExpressionTypingVisitorDispatcher typingVisitorDispatcher = new ExpressionTypingVisitorDispatcher(components);
typingVisitorDispatcher.setProviderForStatements(typingVisitorDispatcher.new StatementVisitorProviderForDeclarations());
return typingVisitorDispatcher;
} }
@NotNull @NotNull
@@ -50,28 +79,31 @@ public class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTypeInfo, E
@NotNull ExpressionTypingComponents components, @NotNull ExpressionTypingComponents components,
@NotNull WritableScope writableScope @NotNull WritableScope writableScope
) { ) {
return new ExpressionTypingVisitorDispatcher(components, writableScope); ExpressionTypingVisitorDispatcher typingVisitorDispatcher = new ExpressionTypingVisitorDispatcher(components);
typingVisitorDispatcher.setProviderForStatements(typingVisitorDispatcher.new StatementVisitorProviderForBlock(writableScope));
return typingVisitorDispatcher;
} }
private final ExpressionTypingComponents components; private final ExpressionTypingComponents components;
private final BasicExpressionTypingVisitor basic; private final BasicExpressionTypingVisitor basic;
private final ExpressionTypingVisitorForStatements statements; private StatementVisitorProvider providerForStatements;
private final FunctionsTypingVisitor functions; private final FunctionsTypingVisitor functions;
private final ControlStructureTypingVisitor controlStructures; private final ControlStructureTypingVisitor controlStructures;
private final PatternMatchingTypingVisitor patterns; private final PatternMatchingTypingVisitor patterns;
private ExpressionTypingVisitorDispatcher(@NotNull ExpressionTypingComponents components, WritableScope writableScope) { public void setProviderForStatements(StatementVisitorProvider providerForStatements) {
this.providerForStatements = providerForStatements;
}
private ExpressionTypingVisitorDispatcher(
@NotNull ExpressionTypingComponents components
) {
this.components = components; this.components = components;
basic = new BasicExpressionTypingVisitor(this); this.basic = new BasicExpressionTypingVisitor(this);
controlStructures = new ControlStructureTypingVisitor(this); this.controlStructures = new ControlStructureTypingVisitor(this);
patterns = new PatternMatchingTypingVisitor(this); this.patterns = new PatternMatchingTypingVisitor(this);
functions = new FunctionsTypingVisitor(this); this.functions = new FunctionsTypingVisitor(this);
if (writableScope != null) {
this.statements = new ExpressionTypingVisitorForStatements(this, writableScope, basic, controlStructures, patterns, functions);
}
else {
this.statements = null;
}
} }
@Override @Override
@@ -114,10 +146,7 @@ public class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTypeInfo, E
@NotNull @NotNull
public final JetTypeInfo getTypeInfo(@NotNull JetExpression expression, ExpressionTypingContext context, boolean isStatement) { public final JetTypeInfo getTypeInfo(@NotNull JetExpression expression, ExpressionTypingContext context, boolean isStatement) {
if (!isStatement) return getTypeInfo(expression, context); if (!isStatement) return getTypeInfo(expression, context);
if (statements != null) { return getTypeInfo(expression, context, providerForStatements.get(context));
return getTypeInfo(expression, context, statements);
}
return getTypeInfo(expression, context, createStatementVisitor(context));
} }
private ExpressionTypingVisitorForStatements createStatementVisitor(ExpressionTypingContext context) { private ExpressionTypingVisitorForStatements createStatementVisitor(ExpressionTypingContext context) {