@Override
 public void visitAssignmentStatement(AssignmentStatement assignmentStatement) {
   LocalReference localReference = assignmentStatement.getLocalReference();
   String referenceName = localReference.getName();
   if (!localReference.isModuleState()) {
     if (!stack.isEmpty()) {
       assignmentStatement.setLocalReference(
           context().referenceTableStack.peek().get(referenceName));
     }
     if (assignmentStatement.isDeclaring()) {
       locallyDeclared(referenceName);
     }
   } else {
     locallyDeclared(referenceName);
   }
   locallyAssigned(referenceName);
   assignmentStatement.getExpressionStatement().accept(this);
   if (assignmentStatement.getExpressionStatement() instanceof ClosureReference) {
     ClosureReference closure = (ClosureReference) assignmentStatement.getExpressionStatement();
     GoloFunction target = closure.getTarget();
     if (target.getSyntheticParameterNames().contains(referenceName)) {
       target.removeSyntheticParameter(referenceName);
       target.setSyntheticSelfName(referenceName);
     }
   }
 }
 private void definedInBlock(Set<String> references, Block block) {
   if (!stack.isEmpty()) {
     for (String ref : references) {
       context().definingBlock.put(ref, block);
     }
     context().allReferences.addAll(references);
   }
 }
 private void pushBlockTable(Block block) {
   if (!stack.isEmpty()) {
     if (!context().referenceTableStack.isEmpty()) {
       block.getReferenceTable().relink(context().referenceTableStack.peek());
     }
     context().referenceTableStack.push(block.getReferenceTable());
   }
 }
 private void accessed(String name) {
   if (!stack.isEmpty()) {
     context().accessedReferences.add(name);
   }
 }
 private void locallyDeclared(String name) {
   if (!stack.isEmpty()) {
     context().localReferences.add(name);
   }
 }
 private void dropBlockTable() {
   if (!stack.isEmpty()) {
     context().referenceTableStack.pop();
   }
 }
 private void dropContext() {
   stack.pop();
 }
 private void newContext() {
   stack.push(new Context());
 }
 private Context context() {
   return stack.peek();
 }