ParseError.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. #include "DiagnosticEngine.h"
  8. namespace JSSpecCompiler {
  9. NonnullRefPtr<ParseError> ParseError::create(String message, XML::Node const* node)
  10. {
  11. return make_ref_counted<ParseError>(move(message), node);
  12. }
  13. NonnullRefPtr<ParseError> ParseError::create(StringView message, XML::Node const* node)
  14. {
  15. return create(MUST(String::from_utf8(message)), node);
  16. }
  17. // FIXME: Remove once String::formatted becomes infallible.
  18. NonnullRefPtr<ParseError> ParseError::create(ErrorOr<String> message, XML::Node const* node)
  19. {
  20. return create(MUST(message), node);
  21. }
  22. String ParseError::to_string() const
  23. {
  24. StringBuilder builder;
  25. builder.appendff("{}\n", m_message);
  26. XML::Node const* current = m_node;
  27. while (current != nullptr) {
  28. builder.appendff(" at {}:{} ", current->offset.line + 1, current->offset.column + 1);
  29. if (current->is_element()) {
  30. builder.append("<"sv);
  31. builder.append(current->as_element().name);
  32. for (auto [key, value] : current->as_element().attributes)
  33. builder.appendff(" {}=\"{}\"", key, value);
  34. builder.append(">\n"sv);
  35. } else if (current->is_text()) {
  36. builder.appendff("text \"{}\"\n", current->as_text().builder.string_view().trim_whitespace());
  37. } else {
  38. builder.appendff("comment");
  39. }
  40. current = current->parent;
  41. }
  42. return MUST(builder.to_string());
  43. }
  44. XML::Offset ParseError::offset() const
  45. {
  46. return m_node->offset;
  47. }
  48. }