yql_issue_message_impl.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #pragma once
  2. #include "yql_issue_message.h"
  3. #include <util/generic/deque.h>
  4. #include <util/string/join.h>
  5. #include <util/stream/output.h>
  6. namespace NYql {
  7. using namespace NIssue::NProto;
  8. template<typename TIssueMessage>
  9. TIssue IssueFromMessage(const TIssueMessage& issueMessage) {
  10. TIssue topIssue;
  11. TDeque<std::pair<TIssue*, const TIssueMessage*>> queue;
  12. queue.push_front(std::make_pair(&topIssue, &issueMessage));
  13. while (!queue.empty()) {
  14. TIssue& issue = *queue.back().first;
  15. const auto& message = *queue.back().second;
  16. queue.pop_back();
  17. TPosition position(message.position().column(), message.position().row(), message.position().file());
  18. TPosition endPosition(message.end_position().column(), message.end_position().row());
  19. if (position.HasValue()) {
  20. if (endPosition.HasValue()) {
  21. issue = TIssue(position, endPosition, message.message());
  22. } else {
  23. issue = TIssue(position, message.message());
  24. }
  25. } else {
  26. issue = TIssue(message.message());
  27. }
  28. for (const auto& subMessage : message.issues()) {
  29. auto subIssue = new TIssue();
  30. issue.AddSubIssue(subIssue);
  31. queue.push_front(std::make_pair(subIssue, &subMessage));
  32. }
  33. issue.SetCode(message.issue_code(), static_cast<ESeverity>(message.severity()));
  34. }
  35. return topIssue;
  36. }
  37. template<typename TIssueMessage>
  38. void IssuesFromMessage(const ::google::protobuf::RepeatedPtrField<TIssueMessage> &message, TIssues &issues) {
  39. issues.Clear();
  40. if (message.size()) {
  41. issues.Reserve(message.size());
  42. for (auto &x : message)
  43. issues.AddIssue(IssueFromMessage(x));
  44. }
  45. }
  46. template<typename TIssueMessage>
  47. void IssueToMessage(const TIssue& topIssue, TIssueMessage* issueMessage) {
  48. TDeque<std::pair<const TIssue*, TIssueMessage*>> queue;
  49. queue.push_front(std::make_pair(&topIssue, issueMessage));
  50. while (!queue.empty()) {
  51. const TIssue& issue = *queue.back().first;
  52. auto& message = *queue.back().second;
  53. queue.pop_back();
  54. if (issue.Position) {
  55. auto& position = *message.mutable_position();
  56. position.set_row(issue.Position.Row);
  57. position.set_column(issue.Position.Column);
  58. position.set_file(issue.Position.File);
  59. }
  60. if (issue.EndPosition) {
  61. auto& endPosition = *message.mutable_end_position();
  62. endPosition.set_row(issue.EndPosition.Row);
  63. endPosition.set_column(issue.EndPosition.Column);
  64. }
  65. message.set_message(issue.GetMessage());
  66. message.set_issue_code(issue.GetCode());
  67. message.set_severity(issue.GetSeverity());
  68. for (auto subIssue : issue.GetSubIssues()) {
  69. TIssueMessage* subMessage = message.add_issues();
  70. queue.push_front(std::make_pair(subIssue.Get(), subMessage));
  71. }
  72. }
  73. }
  74. template<typename TIssueMessage>
  75. void IssuesToMessage(const TIssues& issues, ::google::protobuf::RepeatedPtrField<TIssueMessage> *message) {
  76. message->Clear();
  77. if (!issues)
  78. return;
  79. message->Reserve(issues.Size());
  80. for (const auto &issue : issues) {
  81. IssueToMessage(issue, message->Add());
  82. }
  83. }
  84. }