anchor.diff:  import 'package:meta/meta.dart';
   import 'package:source_span/source_span.dart';
  +import 'package:angular/src/compiler/i18n/message.dart';
   
   import '../analyzed_class.dart' as analyzer;
   import '../compile_metadata.dart' show CompileDirectiveMetadata;
  
positive.code: 
  /// Converts values bound by a directive change detector.
  class _DirectiveBoundValueConverter extends BoundValueConverter {
    final o.Expression _implicitReceiver;
    final CompileDirectiveMetadata _metadata;
    final NameResolver _nameResolver;
  
    _DirectiveBoundValueConverter(
      this._metadata,
      this._implicitReceiver,
      this._nameResolver,
    ) : super(_metadata.analyzedClass);
  
    @override
    o.Expression convertToExpression(
      BoundValue value,
      SourceSpan sourceSpan,
      o.OutputType type,
    ) {
      if (value is BoundExpression) {
        return convertCdExpressionToIr(
          _nameResolver,
          _implicitReceiver,
          value.expression,
          sourceSpan,
          _metadata,
          type,
        );
      } else if (value is BoundI18nMessage) {
        throw UnsupportedError(
            'Cannot create internationalized message expression without a view');
      }
      _throwUnrecognized(value);
    }
  }
  
  // Converts values bound in a view.
  class _ViewBoundValueConverter extends BoundValueConverter {
    final o.Expression _implicitReceiver;
    final CompileView _view;
  
    _ViewBoundValueConverter(this._view, this._implicitReceiver)
        : super(_view.component.analyzedClass);
  
    @override
    o.Expression convertToExpression(
      BoundValue value,
      SourceSpan sourceSpan,
      o.OutputType type,
    ) {
      if (value is BoundExpression) {
        final expression =
            analyzer.rewriteInterpolate(value.expression, _analyzedClass);
        return convertCdExpressionToIr(
          _view.nameResolver,
          _implicitReceiver,
          expression,
          sourceSpan,
          _view.component,
          type,
        );
      } else if (value is BoundI18nMessage) {
        return _view.createI18nMessage(value.message);
      }
      _throwUnrecognized(value);
    }
  }
  
negative.code:   /// Returns whether [value] is a string.
    bool isString(BoundValue value) {
      if (value is BoundExpression) {
        return analyzer.isString(value.expression, analyzedClass);
      } else if (value is BoundI18nMessage) {
        return true;
      }
  