anchor.diff:    FunctionElement(FunctionDeclaration this.ast, SourceElement this.source);
   }
   
  +abstract class ElementVisitior<R> {
  +  R visitElementAnalysis(ElementAnalysis node);
  +  
  +  R visitSourceElement(SourceElement node);
  +  
  +  R visitClassElement(ClassElement node);
  +  R visitFunctionElement(FunctionElement node);
  +  R visitVariableElement(VariableElement node);
  +  
  +  R visitFieldElement(FieldElement node);
  +  R visitMethodElement(MethodElement node);
  +}
  +
  +abstract class RecursiveElementVisitor<A> implements ElementVisitior<A> {
  +  A visitElementAnalysis(ElementAnalysis node) {
  +    A res = null;
  +    node.libraries.values.forEach((SourceElement source) => res = this.visitSourceElement(source));
  +    return res;
  +  }
  +  
  +  A visitSourceElement(SourceElement node) {
  +    A res = null;
  +    node.variables.values.forEach((VariableElement varDecl) => res = this.visitVariableElement(varDecl));
  +    node.functions.forEach((FunctionElement func) => res = this.visitFunctionElement(func));
  +    node.classes.forEach((ClassElement classDecl) => res = this.visitClassElement(classDecl));
  +    return res;
  +  }
  +  
  +  A visitClassElement(ClassElement node) {
  +    A res = null;
  +    node.fields.forEach((FieldElement field) => res = this.visitFieldElement(field));
  +    node.methods.forEach((MethodElement method) => res = this.visitMethodElement(method));
  +    return res;
  +  }
  +  
  +  A visitFunctionElement(FunctionElement node) {
  +    A res = null;
  +    node.variables.values.forEach((VariableElement varDecl) => res = this.visitVariableElement(varDecl));
  +    return res;
  +  }
  +  
  +  A visitMethodElement(MethodElement node) {
  +    A res = null;
  +    node.variables.values.forEach((VariableElement varDecl) => res = this.visitVariableElement(varDecl));
  +    return res;
  +  }
  +}
  +
   class ElementGenerator extends GeneralizingAstVisitor {
     
     SourceElement element;
  
positive.code:   List<Source> exports = <Source>[];
    List<ClassElement> classes = <ClassElement>[];
    List<FunctionElement> functions = <FunctionElement>[];
    List<VariableElement> top_variables = <VariableElement>[];
    
    SourceElement(Source this.source, CompilationUnit this.ast);
    
  
negative.code:     }
      
      if (_currentBlock != null) {
        VariableElement variable = new VariableElement(node, _currentBlock);
        _currentBlock.addVariable(variable.ident, variable);
        return;
      }
    }
    
    visitFunctionDeclaration(FunctionDeclaration node) {
  