Refactor ExpressionTypingVisitorDispatcher to make it more "componentlike"
This commit is contained in:
+47
-18
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user