ParseError.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Parser/ParseError.h"
  7. namespace JSSpecCompiler {
  8. NonnullRefPtr<ParseError> ParseError::create(String message, XML::Node const* node)
  9. {
  10. return make_ref_counted<ParseError>(move(message), node);
  11. }
  12. NonnullRefPtr<ParseError> ParseError::create(StringView message, XML::Node const* node)
  13. {
  14. return create(MUST(String::from_utf8(message)), node);
  15. }
  16. // FIXME: Remove once String::formatted becomes infallible.
  17. NonnullRefPtr<ParseError> ParseError::create(ErrorOr<String> message, XML::Node const* node)
  18. {
  19. return create(MUST(message), node);
  20. }
  21. String ParseError::to_string() const
  22. {
  23. StringBuilder builder;
  24. builder.appendff("error: {}\n", m_message);
  25. XML::Node const* current = m_node;
  26. while (current != nullptr) {
  27. builder.appendff(" at {}:{} ", current->offset.line + 1, current->offset.column + 1);
  28. if (current->is_element()) {
  29. builder.append("<"sv);
  30. builder.append(current->as_element().name);
  31. for (auto [key, value] : current->as_element().attributes)
  32. builder.appendff(" {}=\"{}\"", key, value);
  33. builder.append(">\n"sv);
  34. } else if (current->is_text()) {
  35. builder.appendff("text \"{}\"\n", current->as_text().builder.string_view().trim_whitespace());
  36. } else {
  37. builder.appendff("comment");
  38. }
  39. current = current->parent;
  40. }
  41. return MUST(builder.to_string());
  42. }
  43. }