///|
/// Return whether parsing completed without a syntax error.
pub fn ParseResult::is_valid(self : ParseResult) -> Bool {
  self.errors.length() == 0
}

///|
/// Return the number of modules recovered from the input.
pub fn ParseResult::module_count(self : ParseResult) -> Int {
  self.design.modules.length()
}

///|
/// Return parser error messages in source order.
pub fn ParseResult::error_messages(self : ParseResult) -> Array[String] {
  let messages : Array[String] = []
  for error in self.errors {
    messages.push(error.message)
  }
  messages
}

///|
/// Return the first error span, if recovery produced an error.
pub fn ParseResult::first_error_span(self : ParseResult) -> @source.Span? {
  if self.errors.length() == 0 {
    None
  } else {
    Some(self.errors[0].span)
  }
}

///|
/// Return recovered module names even when later syntax is invalid.
pub fn ParseResult::module_names(self : ParseResult) -> Array[String] {
  self.design.module_names()
}

///|
/// Return whether at least one module was recovered.
pub fn ParseResult::has_modules(self : ParseResult) -> Bool {
  self.module_count() > 0
}