anchor.diff:        }
   
         if (stringExpression == '') return;
  +      if (stringExpression.startsWith('_')) {
  +        logger.warning('private symbols cannot be used in event handlers',
  +            span: span);
  +        return;
  +      }
         generator.addGetter(stringExpression);
         generator.addSymbol(stringExpression);
       }
  -    visitor.run(pe.parse(stringExpression), isTwoWay);
  +    visitor.run(pe.parse(stringExpression), isTwoWay, span);
     }
   }
   
  
positive.code: /// be needed to evaluate a single expression at runtime.
  class _SubExpressionVisitor extends pe.RecursiveVisitor {
    final SmokeCodeGenerator generator;
    bool _includeSetter;
  
    _SubExpressionVisitor(this.generator);
  
    /// Visit [exp], and record getters and setters that are needed in order to
    /// evaluate it at runtime. [includeSetter] is only true if this expression
    /// occured in a context where it could be updated, for example in two-way
    /// bindings such as `<input value={{exp}}>`.
    void run(pe.Expression exp, bool includeSetter) {
      _includeSetter = includeSetter;
      visit(exp);
    }
  
    /// Adds a getter and symbol for [name], and optionally a setter.
    _add(String name) {
      generator.addGetter(name);
      generator.addSymbol(name);
      if (_includeSetter) generator.addSetter(name);
  
negative.code: import 'package:analyzer/src/generated/element.dart' as analyzer show Element;
  import 'package:barback/barback.dart';
  import 'package:path/path.dart' as path;
  import 'package:source_maps/span.dart' show SourceFile, Span;
  import 'package:smoke/codegen/generator.dart';
  import 'package:smoke/codegen/recorder.dart';
  import 'package:code_transformers/resolver.dart';
  