anchor.diff:        .addStmt(callDetectHostPropertiesExpr.toStmt());
   }
   
  -void bindDirectiveInputs(
  -    List<ir.Binding> inputs,
  -    CompileDirectiveMetadata directive,
  -    o.Expression directiveInstance,
  -    CompileElement compileElement,
  -    {bool isHostComponent = false}) {
  -  if (directive.inputs.isEmpty) {
  -    return;
  -  }
  -
  -  var view = compileElement.view;
  -  var detectChangesInInputsMethod = view.detectChangesInInputsMethod;
  -  var lifecycleHooks = directive.lifecycleHooks;
  -  bool calcChangesMap = lifecycleHooks.contains(LifecycleHooks.onChanges);
  -  bool afterChanges = lifecycleHooks.contains(LifecycleHooks.afterChanges);
  -  var isOnPushComp = directive.isComponent &&
  -      directive.changeDetection == ChangeDetectionStrategy.OnPush;
  -  var calcChanged = isOnPushComp || afterChanges;
  -
  -  if (calcChangesMap) {
  -    // We need to reinitialize changes, otherwise a second change
  -    // detection cycle would cause extra ngOnChanges call.
  -    view.requiresOnChangesCall = true;
  -    detectChangesInInputsMethod
  -        .addStmt(DetectChangesVars.changes.set(o.NULL_EXPR).toStmt());
  -  }
  -  if (afterChanges) {
  -    view.requiresAfterChangesCall = true;
  -  }
  -
  -  // We want to call AfterChanges lifecycle only if we detect a change,
  -  // unlike OnChanges, we don't need to collect a map of SimpleChange(s)
  -  // therefore we keep track of changes using bool changed variable.
  -  // At the beginning of change detecting inputs we reset this flag to false,
  -  // and then set it to true if any of it's inputs change.
  -  if (calcChanged && !isHostComponent) {
  -    detectChangesInInputsMethod
  -        .addStmt(DetectChangesVars.changed.set(o.literal(false)).toStmt());
  -  }
  -  bindAndWriteToRenderer(
  -    inputs,
  -    BoundValueConverter.forView(view, DetectChangesVars.cachedCtx),
  -    directiveInstance,
  -    null,
  -    false,
  -    view.nameResolver,
  -    view.storage,
  -    detectChangesInInputsMethod,
  -    isHostComponent: isHostComponent,
  -    calcChanged: calcChanged,
  -    calcChangesMap: calcChangesMap,
  -  );
  -  if (isOnPushComp) {
  -    detectChangesInInputsMethod.addStmt(o.IfStmt(DetectChangesVars.changed, [
  -      compileElement.componentView.callMethod('markAsCheckOnce', []).toStmt()
  -    ]));
  -  }
  -}
  -
   List<o.Statement> _changesMap(String inputName, o.ReadClassMemberExpr fieldExpr,
           o.ReadVarExpr currValExpr) =>
       [
  
positive.code:   );
  }
  
  void bindRenderInputs(
      List<ir.Binding> bindings, CompileElement compileElement) {
    var appViewInstance = compileElement.component == null
        ? o.THIS_EXPR
        : compileElement.componentView;
    var renderNode = compileElement.renderNode;
    var view = compileElement.view;
    var implicitReceiver = DetectChangesVars.cachedCtx;
    var converter = BoundValueConverter.forView(view, implicitReceiver);
    bindAndWriteToRenderer(
      bindings,
      converter,
      appViewInstance,
      renderNode,
      compileElement.isHtmlElement,
      view.nameResolver,
      view.storage,
      view.detectChangesRenderPropertiesMethod,
    );
  }
  
  // Component or directive level host properties are change detected inside
  
negative.code: import 'update_statement_visitor.dart' show bindingToUpdateStatement;
  import 'view_compiler_utils.dart' show unwrapDirective, unwrapDirectiveInstance;
  import 'view_name_resolver.dart';
  
  /// For each binding, creates code to update the binding.
  ///
  