@Override
 public void visitBlockStatement(final BlockStatement block) {
   Set<VariableExpression> old = declaredFinalVariables;
   declaredFinalVariables = new HashSet<VariableExpression>();
   super.visitBlockStatement(block);
   if (callback != null) {
     Map<Variable, VariableState> state = getState();
     for (VariableExpression declaredFinalVariable : declaredFinalVariables) {
       VariableState variableState = state.get(declaredFinalVariable.getAccessedVariable());
       if (variableState == null || variableState != VariableState.is_final) {
         callback.variableNotAlwaysInitialized(declaredFinalVariable);
       }
     }
   }
   declaredFinalVariables = old;
 }
 @Override
 public void visitBlockStatement(final BlockStatement block) {
   pushContext(block);
   super.visitBlockStatement(block);
   popContext();
 }
 public void visitBlockStatement(BlockStatement block) {
   pushState();
   block.setVariableScope(currentScope);
   super.visitBlockStatement(block);
   popState();
 }
 @Override
 public final void visitBlockStatement(BlockStatement block) {
   super.visitBlockStatement(block);
 }