anchor.diff:      _hostListeners[eventName] = '$methodName(${methodArgs.join(', ')})';
     }
   
  +  /// Adds a property binding for [element] to [bindings].
  +  ///
  +  /// The property binding maps [element]'s display name to a binding name. By
  +  /// default, [element]'s name is used as the binding name. However, if
  +  /// [annotation] has a `bindingPropertyName` field, its value is used instead.
  +  ///
  +  /// Property bindings are immutable by default, to prevent derived classes
  +  /// from overriding inherited binding names. The optional [immutableBindings]
  +  /// may be provided to restrict a different set of property bindings than
  +  /// [bindings].
     void _addPropertyBindingTo(
       Map<String, String> bindings,
       ElementAnnotation annotation,
  -    Element element,
  -  ) {
  +    Element element, {
  +    Map<String, String> immutableBindings,
  +  }) {
  +    immutableBindings ??= bindings;
  +
       final value = annotation.computeConstantValue();
       final propertyName = element.displayName;
       final bindingName =
           coerceString(value, 'bindingPropertyName', defaultTo: propertyName);
   
  -    if (bindings.containsKey(propertyName) &&
  -        bindings[propertyName] != bindingName) {
  +    if (immutableBindings.containsKey(propertyName) &&
  +        immutableBindings[propertyName] != bindingName) {
         log.severe("'${element.enclosingElement.name}' overwrites the binding "
  -          "name of property '$propertyName' from '${bindings[propertyName]}' "
  -          "to '$bindingName'.");
  +          "name of property '$propertyName' from "
  +          "'${immutableBindings[propertyName]}' to '$bindingName'.");
       }
   
       bindings[propertyName] = bindingName;
  
positive.code:       // Even for directives, we want change detection set to the default.
        changeDetection:
            _changeDetection(element, annotationValue, 'changeDetection'),
        inputs: new Map.from(_fieldInputs)..addAll(_setterInputs),
        inputTypes: _inputTypes,
        outputs: _outputs,
        hostListeners: _hostListeners,
  
negative.code:             typeName = element.parameters.first.type?.name;
            }
            _addPropertyBindingTo(
                isField ? _fieldInputs : _setterInputs, annotation, element,
                immutableBindings: _inputs);
            if (typeName != null) {
              _inputTypes[element.displayName] = typeName;
            }
  