anchor.diff:  
     @override
     ng.TemplateAst visitElement(ast.ElementAst astNode, [ParseContext context]) {
  -    var matchedDirectives = _matchElementDirectives(context, astNode);
  -    var directiveAsts = _toAst(matchedDirectives, astNode.sourceSpan);
  -    final elementContext = context.withElementName(astNode.name);
  +    final elementContext = new ParseContext.forElement(astNode, context);
       return new ng.ElementAst(
           astNode.name,
           _visitAll(astNode.attributes, elementContext),
           _visitAll(astNode.properties, elementContext),
           _visitAll(astNode.events, elementContext),
           _visitAll(astNode.references, elementContext),
  -        directiveAsts,
  +        elementContext.boundDirectives,
           [] /* providers */,
           null /* elementProviderUsage */,
           _visitAll(astNode.childNodes, elementContext),
  
positive.code:     return results;
    }
  
    List<CompileDirectiveMetadata> _matchElementDirectives(
            ParseContext context, ast.ElementAst astNode) =>
        _parseDirectives(context.directives, _elementSelector(astNode));
  
    List<CompileDirectiveMetadata> _matchTemplateDirectives(
            ParseContext context, ast.EmbeddedTemplateAst astNode) =>
        _parseDirectives(context.directives, _templateSelector(astNode));
  
    CssSelector _elementSelector(ast.ElementAst astNode) => _selector(
        astNode.name, astNode.attributes, astNode.properties, astNode.events);
  
    CssSelector _templateSelector(ast.EmbeddedTemplateAst astNode) => _selector(
        TEMPLATE_ELEMENT, astNode.attributes, astNode.properties, astNode.events);
  
    CssSelector _selector(String elementName, List<ast.AttributeAst> attributes,
        List<ast.PropertyAst> properties, List<ast.EventAst> events) {
      final matchableAttributes = [];
      for (var attr in attributes) {
        matchableAttributes.add([attr.name, attr.value]);
      }
      for (var property in properties) {
        matchableAttributes.add([property.name, property.value]);
      }
      for (var event in events) {
        matchableAttributes.add([event.name, event.value]);
      }
      return createElementCssSelector(elementName, matchableAttributes);
    }
  
    List<CompileDirectiveMetadata> _parseDirectives(
        List<CompileDirectiveMetadata> directives,
        CssSelector elementCssSelector) {
      var matchedDirectives = new Set();
  
negative.code:     }
      return selectorMatcher;
    }
  }
  
  CssSelector _elementSelector(ast.ElementAst astNode) => _selector(
      astNode.name, astNode.attributes, astNode.properties, astNode.events);
  
  CssSelector _templateSelector(ast.EmbeddedTemplateAst astNode) => _selector(
      TEMPLATE_ELEMENT, astNode.attributes, astNode.properties, astNode.events);
  
  CssSelector _selector(String elementName, List<ast.AttributeAst> attributes,
      List<ast.PropertyAst> properties, List<ast.EventAst> events) {
    final matchableAttributes = [];
    for (var attr in attributes) {
      matchableAttributes.add([attr.name, attr.value]);
    }
    for (var property in properties) {
      matchableAttributes.add([property.name, property.value]);
    }
    for (var event in events) {
      matchableAttributes.add([event.name, event.value]);
    }
    return createElementCssSelector(elementName, matchableAttributes);
  }
  
  /// Visitor which filters elements that are not supported in angular templates.
  