Refactor JetControlFlowBuilderAdapter to avoid mutable fields

This commit is contained in:
Andrey Breslav
2013-12-02 21:48:06 +04:00
parent de3af6151b
commit 5908211fbf
2 changed files with 50 additions and 40 deletions
@@ -27,204 +27,206 @@ import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import java.util.List; import java.util.List;
public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder { public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
protected JetControlFlowBuilder builder;
@NotNull
protected abstract JetControlFlowBuilder getDelegateBuilder();
@Override @Override
public void loadUnit(@NotNull JetExpression expression) { public void loadUnit(@NotNull JetExpression expression) {
builder.loadUnit(expression); getDelegateBuilder().loadUnit(expression);
} }
@Override @Override
public void loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) { public void loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant<?> constant) {
builder.loadConstant(expression, constant); getDelegateBuilder().loadConstant(expression, constant);
} }
@Override @Override
public void createAnonymousObject(@NotNull JetObjectLiteralExpression expression) { public void createAnonymousObject(@NotNull JetObjectLiteralExpression expression) {
builder.createAnonymousObject(expression); getDelegateBuilder().createAnonymousObject(expression);
} }
@Override @Override
public void loadStringTemplate(@NotNull JetStringTemplateExpression expression) { public void loadStringTemplate(@NotNull JetStringTemplateExpression expression) {
builder.loadStringTemplate(expression); getDelegateBuilder().loadStringTemplate(expression);
} }
@Override @Override
public void readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) { public void readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor) {
builder.readThis(expression, parameterDescriptor); getDelegateBuilder().readThis(expression, parameterDescriptor);
} }
@Override @Override
public void readVariable(@NotNull JetExpression expression, @Nullable VariableDescriptor variableDescriptor) { public void readVariable(@NotNull JetExpression expression, @Nullable VariableDescriptor variableDescriptor) {
builder.readVariable(expression, variableDescriptor); getDelegateBuilder().readVariable(expression, variableDescriptor);
} }
@Override @Override
public void call(@NotNull JetExpression expression, @NotNull ResolvedCall<?> resolvedCall) { public void call(@NotNull JetExpression expression, @NotNull ResolvedCall<?> resolvedCall) {
builder.call(expression, resolvedCall); getDelegateBuilder().call(expression, resolvedCall);
} }
@Override @Override
public void predefinedOperation(@NotNull JetExpression expression, @Nullable PredefinedOperation operation) { public void predefinedOperation(@NotNull JetExpression expression, @Nullable PredefinedOperation operation) {
builder.predefinedOperation(expression, operation); getDelegateBuilder().predefinedOperation(expression, operation);
} }
@Override @Override
public void compilationError(@NotNull JetElement element, @NotNull String message) { public void compilationError(@NotNull JetElement element, @NotNull String message) {
builder.compilationError(element, message); getDelegateBuilder().compilationError(element, message);
} }
@Override @Override
@NotNull @NotNull
public Label createUnboundLabel() { public Label createUnboundLabel() {
return builder.createUnboundLabel(); return getDelegateBuilder().createUnboundLabel();
} }
@NotNull @NotNull
@Override @Override
public Label createUnboundLabel(@NotNull String name) { public Label createUnboundLabel(@NotNull String name) {
return builder.createUnboundLabel(name); return getDelegateBuilder().createUnboundLabel(name);
} }
@Override @Override
public void bindLabel(@NotNull Label label) { public void bindLabel(@NotNull Label label) {
builder.bindLabel(label); getDelegateBuilder().bindLabel(label);
} }
@Override @Override
public void jump(@NotNull Label label) { public void jump(@NotNull Label label) {
builder.jump(label); getDelegateBuilder().jump(label);
} }
@Override @Override
public void jumpOnFalse(@NotNull Label label) { public void jumpOnFalse(@NotNull Label label) {
builder.jumpOnFalse(label); getDelegateBuilder().jumpOnFalse(label);
} }
@Override @Override
public void jumpOnTrue(@NotNull Label label) { public void jumpOnTrue(@NotNull Label label) {
builder.jumpOnTrue(label); getDelegateBuilder().jumpOnTrue(label);
} }
@Override @Override
public void nondeterministicJump(@NotNull Label label) { public void nondeterministicJump(@NotNull Label label) {
builder.nondeterministicJump(label); getDelegateBuilder().nondeterministicJump(label);
} }
@Override @Override
public void nondeterministicJump(@NotNull List<Label> labels) { public void nondeterministicJump(@NotNull List<Label> labels) {
builder.nondeterministicJump(labels); getDelegateBuilder().nondeterministicJump(labels);
} }
@Override @Override
public void jumpToError() { public void jumpToError() {
builder.jumpToError(); getDelegateBuilder().jumpToError();
} }
@Override @Override
public void throwException(@NotNull JetThrowExpression throwExpression) { public void throwException(@NotNull JetThrowExpression throwExpression) {
builder.throwException(throwExpression); getDelegateBuilder().throwException(throwExpression);
} }
@Override @Override
@NotNull @NotNull
public Label getEntryPoint(@NotNull JetElement labelElement) { public Label getEntryPoint(@NotNull JetElement labelElement) {
return builder.getEntryPoint(labelElement); return getDelegateBuilder().getEntryPoint(labelElement);
} }
@NotNull @NotNull
@Override @Override
public Label getExitPoint(@NotNull JetElement labelElement) { public Label getExitPoint(@NotNull JetElement labelElement) {
return builder.getExitPoint(labelElement); return getDelegateBuilder().getExitPoint(labelElement);
} }
@Override @Override
public LoopInfo enterLoop(@NotNull JetExpression expression, @Nullable Label loopExitPoint, Label conditionEntryPoint) { public LoopInfo enterLoop(@NotNull JetExpression expression, @Nullable Label loopExitPoint, Label conditionEntryPoint) {
return builder.enterLoop(expression, loopExitPoint, conditionEntryPoint); return getDelegateBuilder().enterLoop(expression, loopExitPoint, conditionEntryPoint);
} }
@Override @Override
public void exitLoop(@NotNull JetExpression expression) { public void exitLoop(@NotNull JetExpression expression) {
builder.exitLoop(expression); getDelegateBuilder().exitLoop(expression);
} }
@Override @Override
@Nullable @Nullable
public JetElement getCurrentLoop() { public JetElement getCurrentLoop() {
return builder.getCurrentLoop(); return getDelegateBuilder().getCurrentLoop();
} }
@Override @Override
public void enterTryFinally(@NotNull GenerationTrigger trigger) { public void enterTryFinally(@NotNull GenerationTrigger trigger) {
builder.enterTryFinally(trigger); getDelegateBuilder().enterTryFinally(trigger);
} }
@Override @Override
public void exitTryFinally() { public void exitTryFinally() {
builder.exitTryFinally(); getDelegateBuilder().exitTryFinally();
} }
@Override @Override
public void enterSubroutine(@NotNull JetElement subroutine) { public void enterSubroutine(@NotNull JetElement subroutine) {
builder.enterSubroutine(subroutine); getDelegateBuilder().enterSubroutine(subroutine);
} }
@NotNull @NotNull
@Override @Override
public Pseudocode exitSubroutine(@NotNull JetElement subroutine) { public Pseudocode exitSubroutine(@NotNull JetElement subroutine) {
return builder.exitSubroutine(subroutine); return getDelegateBuilder().exitSubroutine(subroutine);
} }
@NotNull @NotNull
@Override @Override
public JetElement getCurrentSubroutine() { public JetElement getCurrentSubroutine() {
return builder.getCurrentSubroutine(); return getDelegateBuilder().getCurrentSubroutine();
} }
@Override @Override
@Nullable @Nullable
public JetElement getReturnSubroutine() { public JetElement getReturnSubroutine() {
return builder.getReturnSubroutine(); return getDelegateBuilder().getReturnSubroutine();
} }
@Override @Override
public void returnValue(@NotNull JetExpression returnExpression, @NotNull JetElement subroutine) { public void returnValue(@NotNull JetExpression returnExpression, @NotNull JetElement subroutine) {
builder.returnValue(returnExpression, subroutine); getDelegateBuilder().returnValue(returnExpression, subroutine);
} }
@Override @Override
public void returnNoValue(@NotNull JetElement returnExpression, @NotNull JetElement subroutine) { public void returnNoValue(@NotNull JetElement returnExpression, @NotNull JetElement subroutine) {
builder.returnNoValue(returnExpression, subroutine); getDelegateBuilder().returnNoValue(returnExpression, subroutine);
} }
@Override @Override
public void unsupported(JetElement element) { public void unsupported(JetElement element) {
builder.unsupported(element); getDelegateBuilder().unsupported(element);
} }
@Override @Override
public void write(@NotNull JetElement assignment, @NotNull JetElement lValue) { public void write(@NotNull JetElement assignment, @NotNull JetElement lValue) {
builder.write(assignment, lValue); getDelegateBuilder().write(assignment, lValue);
} }
@Override @Override
public void declareParameter(@NotNull JetParameter parameter) { public void declareParameter(@NotNull JetParameter parameter) {
builder.declareParameter(parameter); getDelegateBuilder().declareParameter(parameter);
} }
@Override @Override
public void declareVariable(@NotNull JetVariableDeclaration property) { public void declareVariable(@NotNull JetVariableDeclaration property) {
builder.declareVariable(property); getDelegateBuilder().declareVariable(property);
} }
@Override @Override
public void declareFunction(@NotNull JetElement subroutine, @NotNull Pseudocode pseudocode) { public void declareFunction(@NotNull JetElement subroutine, @NotNull Pseudocode pseudocode) {
builder.declareFunction(subroutine, pseudocode); getDelegateBuilder().declareFunction(subroutine, pseudocode);
} }
@Override @Override
public void repeatPseudocode(@NotNull Label startLabel, @NotNull Label finishLabel) { public void repeatPseudocode(@NotNull Label startLabel, @NotNull Label finishLabel) {
builder.repeatPseudocode(startLabel, finishLabel); getDelegateBuilder().repeatPseudocode(startLabel, finishLabel);
} }
} }
@@ -33,6 +33,8 @@ import java.util.Map;
public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAdapter { public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAdapter {
private JetControlFlowBuilder builder = null;
private final Stack<BreakableBlockInfo> loopInfo = new Stack<BreakableBlockInfo>(); private final Stack<BreakableBlockInfo> loopInfo = new Stack<BreakableBlockInfo>();
private final Map<JetElement, BreakableBlockInfo> elementToBlockInfo = new HashMap<JetElement, BreakableBlockInfo>(); private final Map<JetElement, BreakableBlockInfo> elementToBlockInfo = new HashMap<JetElement, BreakableBlockInfo>();
private int labelCount = 0; private int labelCount = 0;
@@ -42,6 +44,12 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
private final Stack<BlockInfo> allBlocks = new Stack<BlockInfo>(); private final Stack<BlockInfo> allBlocks = new Stack<BlockInfo>();
@NotNull
@Override
protected JetControlFlowBuilder getDelegateBuilder() {
return builder;
}
private void pushBuilder(JetElement scopingElement, JetElement subroutine) { private void pushBuilder(JetElement scopingElement, JetElement subroutine) {
JetControlFlowInstructionsGeneratorWorker worker = new JetControlFlowInstructionsGeneratorWorker(scopingElement, subroutine); JetControlFlowInstructionsGeneratorWorker worker = new JetControlFlowInstructionsGeneratorWorker(scopingElement, subroutine);
builders.push(worker); builders.push(worker);