anchor.diff:                  evaluateNamedArguments(init.arguments));
             } else if (init is AssertInitializer) {
               if (enableAsserts) {
  -              final Constant condition = init.statement.condition.accept(this);
  +              final Constant condition =
  +                  _evaluateSubexpression(init.statement.condition);
   
                 if (condition is BoolConstant) {
                   if (!condition.value) {
  -                  final Constant message = init.statement.message?.accept(this);
  -                  if (message == null) {
  +                  if (init.statement.message == null) {
                       throw new _AbortCurrentEvaluation(
                           errorReporter.failedAssertion(
                               contextChain, init.statement.condition, null));
  -                  } else if (message is StringConstant) {
  +                  }
  +                  final Constant message =
  +                      _evaluateSubexpression(init.statement.message);
  +                  if (message is StringConstant) {
                       throw new _AbortCurrentEvaluation(
                           errorReporter.failedAssertion(contextChain,
                               init.statement.condition, message.value));
  
positive.code:     final List<ConstantMapEntry> entries =
          new List<ConstantMapEntry>(node.entries.length);
      for (int i = 0; i < node.entries.length; ++i) {
        final key = node.entries[i].key.accept(this);
        final value = node.entries[i].value.accept(this);
        if (!usedKeys.add(key)) {
          // TODO(kustermann): We should change the context handling from just
          // capturing the `TreeNode`s to a `(TreeNode, String message)` tuple and
  
negative.code:   visitLet(Let node) {
      env.addVariableValue(
          node.variable, _evaluateSubexpression(node.variable.initializer));
      return _evaluateSubexpression(node.body);
    }
  
    visitVariableGet(VariableGet node) {
  