visitAssertStatement method

  1. @override
Object? visitAssertStatement(
  1. SAssertStatement node
)
override

Visit a SAssertStatement.

Implementation

@override
Object? visitAssertStatement(SAssertStatement node) {
  // Assertions are always enabled in this interpreter for now.
  final conditionValue = node.condition!.accept<Object?>(this);

  final bridgedInstance = toBridgedInstance(conditionValue);
  bool conditionResult;
  if (conditionValue is bool) {
    conditionResult = conditionValue;
  } else if (bridgedInstance.$2 && bridgedInstance.$1?.nativeObject is bool) {
    conditionResult = bridgedInstance.$1!.nativeObject as bool;
  } else {
    throw RuntimeD4rtException(
      "Assertion condition must be a boolean, but was ${conditionValue?.runtimeType}.",
    );
  }

  if (!conditionResult) {
    // Condition is false, evaluate the message and throw.
    String assertionMessage = "Assertion failed";
    if (node.message != null) {
      final messageValue = node.message!.accept<Object?>(this);
      assertionMessage = "Assertion failed: ${stringify(messageValue)}";
    }
    // Mimic Dart's AssertionError by throwing a RuntimeError.
    throw RuntimeD4rtException(assertionMessage);
  }

  return null; // Assert statements don't produce a value.
}