public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] ast: Move pattern implementation out of rust-ast
@ 2023-04-06 21:36 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2023-04-06 21:36 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:f749a7fa0b411b6d71e81ff5a95c3bad54eca09b

commit f749a7fa0b411b6d71e81ff5a95c3bad54eca09b
Author: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Date:   Mon Apr 3 20:44:45 2023 +0200

    ast: Move pattern implementation out of rust-ast
    
    Move rust-pattern implementation out of rust-ast.cc in their own file.
    
    gcc/rust/ChangeLog:
    
            * Make-lang.in: Add two new files to the list of sources.
            * ast/rust-ast-full.h: Add new ast formatting header.
            * ast/rust-ast.cc (enum indent_mode): Move formatting function
            to it's own file.
            (indent_spaces): Likewise.
            (get_string_in_delims): Likewise.
            (enum AttrMode): Likewise.
            (get_mode_dump_desc): Likewise.
            (append_attributes): Likewise.
            (unquote_string): Likewise.
            (GroupedExpr::as_string): Move pattern implementation to it's
            own file.
            (RangePattern::as_string): Likewise.
            (RangePatternBoundLiteral::as_string): Likewise.
            (SlicePattern::as_string): Likewise.
            (AltPattern::as_string): Likewise.
            (TuplePatternItemsMultiple::as_string): Likewise.
            (TuplePatternItemsRanged::as_string): Likewise.
            (TuplePattern::as_string): Likewise.
            (StructPatternField::as_string): Likewise.
            (StructPatternFieldIdent::as_string): Likewise.
            (StructPatternFieldTuplePat::as_string): Likewise.
            (StructPatternFieldIdentPat::as_string): Likewise.
            (StructPatternElements::as_string): Likewise.
            (StructPattern::as_string): Likewise.
            (LiteralPattern::as_string): Likewise.
            (ReferencePattern::as_string): Likewise.
            (IdentifierPattern::as_string): Likewise.
            (TupleStructItemsNoRange::as_string): Likewise.
            (TupleStructItemsRange::as_string): Likewise.
            (TupleStructPattern::as_string): Likewise.
            (GroupedExpr::accept_vis): Likewise.
            (LiteralPattern::accept_vis): Likewise.
            (IdentifierPattern::accept_vis): Likewise.
            (WildcardPattern::accept_vis): Likewise.
            (RestPattern::accept_vis): Likewise.
            (RangePatternBoundLiteral::accept_vis): Likewise.
            (RangePatternBoundPath::accept_vis): Likewise.
            (RangePatternBoundQualPath::accept_vis): Likewise.
            (RangePattern::accept_vis): Likewise.
            (ReferencePattern::accept_vis): Likewise.
            (StructPatternFieldTuplePat::accept_vis): Likewise.
            (StructPatternFieldIdentPat::accept_vis): Likewise.
            (StructPatternFieldIdent::accept_vis): Likewise.
            (StructPattern::accept_vis): Likewise.
            (TupleStructItemsNoRange::accept_vis): Likewise.
            (TupleStructItemsRange::accept_vis): Likewise.
            (TupleStructPattern::accept_vis): Likewise.
            (TuplePatternItemsMultiple::accept_vis): Likewise.
            (TuplePatternItemsRanged::accept_vis): Likewise.
            (TuplePattern::accept_vis): Likewise.
            (GroupedPattern::accept_vis): Likewise.
            (SlicePattern::accept_vis): Likewise.
            (AltPattern::accept_vis): Likewise.
            * ast/rust-ast-formatting.cc: New file.
            * ast/rust-ast-formatting.h: New file.
            * ast/rust-pattern.cc: New file.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>

Diff:
---
 gcc/rust/Make-lang.in               |   2 +
 gcc/rust/ast/rust-ast-formatting.cc | 106 ++++++++
 gcc/rust/ast/rust-ast-formatting.h  |  59 ++++
 gcc/rust/ast/rust-ast-full.h        |   1 +
 gcc/rust/ast/rust-ast.cc            | 530 ------------------------------------
 gcc/rust/ast/rust-pattern.cc        | 468 +++++++++++++++++++++++++++++++
 6 files changed, 636 insertions(+), 530 deletions(-)

diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index 6b5861ac6f7..f02536e8b62 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -73,7 +73,9 @@ GRS_OBJS = \
     rust/rust-cfg-parser.o \
     rust/rust-parse.o \
     rust/rust-ast.o \
+    rust/rust-ast-formatting.o \
     rust/rust-path.o \
+    rust/rust-pattern.o \
     rust/rust-ast-fragment.o \
     rust/rust-ast-dump.o \
     rust/rust-ast-tokenstream.o \
diff --git a/gcc/rust/ast/rust-ast-formatting.cc b/gcc/rust/ast/rust-ast-formatting.cc
new file mode 100644
index 00000000000..4c13ef05dc6
--- /dev/null
+++ b/gcc/rust/ast/rust-ast-formatting.cc
@@ -0,0 +1,106 @@
+/* General AST-related method implementations for Rust frontend.
+   Copyright (C) 2009-2023 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "rust-ast-full.h"
+
+namespace Rust {
+namespace AST {
+
+std::string
+indent_spaces (enum indent_mode mode)
+{
+  static int indent = 0;
+  std::string str = "";
+  if (out == mode)
+    indent--;
+  for (int i = 0; i < indent; i++)
+    str += " ";
+  if (enter == mode)
+    indent++;
+
+  return str;
+}
+
+std::string
+get_string_in_delims (std::string str_input, DelimType delim_type)
+{
+  switch (delim_type)
+    {
+    case PARENS:
+      return "(" + str_input + ")";
+    case SQUARE:
+      return "[" + str_input + "]";
+    case CURLY:
+      return "{" + str_input + "}";
+    default:
+      return "ERROR-MARK-STRING (delims)";
+    }
+  gcc_unreachable ();
+}
+
+std::string
+get_mode_dump_desc (AttrMode mode)
+{
+  switch (mode)
+    {
+    case OUTER:
+      return "outer attributes";
+    case INNER:
+      return "inner attributes";
+    default:
+      gcc_unreachable ();
+      return "";
+    }
+}
+
+std::string
+append_attributes (std::vector<Attribute> attrs, AttrMode mode)
+{
+  indent_spaces (enter);
+
+  std::string str
+    = "\n" + indent_spaces (stay) + get_mode_dump_desc (mode) + ": ";
+  // str += "\n" + indent_spaces (stay) + "inner attributes: ";
+  if (attrs.empty ())
+    {
+      str += "none";
+    }
+  else
+    {
+      /* note that this does not print them with outer or "inner attribute"
+       * syntax - just prints the body */
+      for (const auto &attr : attrs)
+	str += "\n" + indent_spaces (stay) + attr.as_string ();
+    }
+
+  indent_spaces (out);
+
+  return str;
+}
+
+std::string
+unquote_string (std::string input)
+{
+  rust_assert (input.front () == '"');
+  rust_assert (input.back () == '"');
+  return input.substr (1, input.length () - 2);
+}
+
+} // namespace AST
+} // namespace Rust
diff --git a/gcc/rust/ast/rust-ast-formatting.h b/gcc/rust/ast/rust-ast-formatting.h
new file mode 100644
index 00000000000..04e20cc3114
--- /dev/null
+++ b/gcc/rust/ast/rust-ast-formatting.h
@@ -0,0 +1,59 @@
+// Copyright (C) 2020-2023 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef RUST_AST_FORMATTING_H
+#define RUST_AST_FORMATTING_H
+
+namespace Rust {
+namespace AST {
+
+enum indent_mode
+{
+  enter,
+  out,
+  stay
+};
+
+enum AttrMode
+{
+  OUTER,
+  INNER
+};
+
+std::string
+indent_spaces (enum indent_mode mode);
+
+// Gets a string in a certain delim type.
+std::string
+get_string_in_delims (std::string str_input, DelimType delim_type);
+
+std::string
+get_mode_dump_desc (AttrMode mode);
+
+// Adds lines below adding attributes
+std::string
+append_attributes (std::vector<Attribute> attrs, AttrMode mode);
+
+// Removes the beginning and end quotes of a quoted string.
+std::string
+unquote_string (std::string input);
+
+} // namespace AST
+} // namespace Rust
+
+#endif /* ! RUST_AST_FORMATTING_H */
diff --git a/gcc/rust/ast/rust-ast-full.h b/gcc/rust/ast/rust-ast-full.h
index 711039bcc9b..557b71ea7ee 100644
--- a/gcc/rust/ast/rust-ast-full.h
+++ b/gcc/rust/ast/rust-ast-full.h
@@ -20,6 +20,7 @@
 #define RUST_AST_FULL_H
 // Use as a fast way of including all aspects of the AST (i.e. all headers)
 #include "rust-ast.h"
+#include "rust-ast-formatting.h"
 #include "rust-expr.h"
 #include "rust-item.h"
 #include "rust-path.h"
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index c0a54a57638..7ba9be137cc 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -35,102 +35,6 @@ along with GCC; see the file COPYING3.  If not see
 namespace Rust {
 namespace AST {
 
-enum indent_mode
-{
-  enter,
-  out,
-  stay
-};
-
-std::string
-indent_spaces (enum indent_mode mode)
-{
-  static int indent = 0;
-  std::string str = "";
-  if (out == mode)
-    indent--;
-  for (int i = 0; i < indent; i++)
-    str += " ";
-  if (enter == mode)
-    indent++;
-
-  return str;
-}
-
-// Gets a string in a certain delim type.
-std::string
-get_string_in_delims (std::string str_input, DelimType delim_type)
-{
-  switch (delim_type)
-    {
-    case PARENS:
-      return "(" + str_input + ")";
-    case SQUARE:
-      return "[" + str_input + "]";
-    case CURLY:
-      return "{" + str_input + "}";
-    default:
-      return "ERROR-MARK-STRING (delims)";
-    }
-  gcc_unreachable ();
-}
-
-enum AttrMode
-{
-  OUTER,
-  INNER
-};
-
-std::string
-get_mode_dump_desc (AttrMode mode)
-{
-  switch (mode)
-    {
-    case OUTER:
-      return "outer attributes";
-    case INNER:
-      return "inner attributes";
-    default:
-      gcc_unreachable ();
-      return "";
-    }
-}
-
-// Adds lines below adding attributes
-std::string
-append_attributes (std::vector<Attribute> attrs, AttrMode mode)
-{
-  indent_spaces (enter);
-
-  std::string str
-    = "\n" + indent_spaces (stay) + get_mode_dump_desc (mode) + ": ";
-  // str += "\n" + indent_spaces (stay) + "inner attributes: ";
-  if (attrs.empty ())
-    {
-      str += "none";
-    }
-  else
-    {
-      /* note that this does not print them with outer or "inner attribute"
-       * syntax - just prints the body */
-      for (const auto &attr : attrs)
-	str += "\n" + indent_spaces (stay) + attr.as_string ();
-    }
-
-  indent_spaces (out);
-
-  return str;
-}
-
-// Removes the beginning and end quotes of a quoted string.
-std::string
-unquote_string (std::string input)
-{
-  rust_assert (input.front () == '"');
-  rust_assert (input.back () == '"');
-  return input.substr (1, input.length () - 2);
-}
-
 std::string
 Crate::as_string () const
 {
@@ -1471,22 +1375,6 @@ ReturnExpr::as_string () const
   return str;
 }
 
-std::string
-GroupedExpr::as_string () const
-{
-  std::string str ("Grouped expr:");
-
-  // outer attrs
-  str += append_attributes (outer_attrs, OUTER);
-
-  // inner attributes
-  str += append_attributes (inner_attrs, INNER);
-
-  str += "\n Expr in parens: " + expr_in_parens->as_string ();
-
-  return str;
-}
-
 std::string
 RangeToExpr::as_string () const
 {
@@ -2465,286 +2353,6 @@ ForLoopExpr::as_string () const
   return str;
 }
 
-std::string
-RangePattern::as_string () const
-{
-  // TODO: maybe rewrite to work with non-linearisable bounds
-  if (has_ellipsis_syntax)
-    return lower->as_string () + "..." + upper->as_string ();
-  else
-    return lower->as_string () + "..=" + upper->as_string ();
-}
-
-std::string
-RangePatternBoundLiteral::as_string () const
-{
-  std::string str;
-
-  if (has_minus)
-    str += "-";
-
-  str += literal.as_string ();
-
-  return str;
-}
-
-std::string
-SlicePattern::as_string () const
-{
-  std::string str ("SlicePattern: ");
-
-  for (const auto &pattern : items)
-    str += "\n " + pattern->as_string ();
-
-  return str;
-}
-
-std::string
-AltPattern::as_string () const
-{
-  std::string str ("AltPattern: ");
-
-  for (const auto &pattern : alts)
-    str += "\n " + pattern->as_string ();
-
-  return str;
-}
-
-std::string
-TuplePatternItemsMultiple::as_string () const
-{
-  std::string str;
-
-  for (const auto &pattern : patterns)
-    str += "\n " + pattern->as_string ();
-
-  return str;
-}
-
-std::string
-TuplePatternItemsRanged::as_string () const
-{
-  std::string str;
-
-  str += "\n Lower patterns: ";
-  if (lower_patterns.empty ())
-    {
-      str += "none";
-    }
-  else
-    {
-      for (const auto &lower : lower_patterns)
-	str += "\n  " + lower->as_string ();
-    }
-
-  str += "\n Upper patterns: ";
-  if (upper_patterns.empty ())
-    {
-      str += "none";
-    }
-  else
-    {
-      for (const auto &upper : upper_patterns)
-	str += "\n  " + upper->as_string ();
-    }
-
-  return str;
-}
-
-std::string
-TuplePattern::as_string () const
-{
-  return "TuplePattern: " + items->as_string ();
-}
-
-std::string
-StructPatternField::as_string () const
-{
-  // outer attributes
-  std::string str = append_attributes (outer_attrs, OUTER);
-
-  return str;
-}
-
-std::string
-StructPatternFieldIdent::as_string () const
-{
-  std::string str = StructPatternField::as_string ();
-
-  str += "\n";
-
-  if (has_ref)
-    str += "ref ";
-
-  if (has_mut)
-    str += "mut ";
-
-  str += ident;
-
-  return str;
-}
-
-std::string
-StructPatternFieldTuplePat::as_string () const
-{
-  // TODO: maybe rewrite to work with non-linearisable patterns
-  std::string str = StructPatternField::as_string ();
-
-  str += "\n";
-
-  str += std::to_string (index) + " : " + tuple_pattern->as_string ();
-
-  return str;
-}
-
-std::string
-StructPatternFieldIdentPat::as_string () const
-{
-  // TODO: maybe rewrite to work with non-linearisable patterns
-  std::string str = StructPatternField::as_string ();
-
-  str += "\n";
-
-  str += ident + " : " + ident_pattern->as_string ();
-
-  return str;
-}
-
-std::string
-StructPatternElements::as_string () const
-{
-  std::string str ("\n  Fields: ");
-
-  if (!has_struct_pattern_fields ())
-    {
-      str += "none";
-    }
-  else
-    {
-      for (const auto &field : fields)
-	str += "\n   " + field->as_string ();
-    }
-
-  str += "\n  Etc: ";
-  if (has_struct_pattern_etc)
-    str += "true";
-  else
-    str += "false";
-
-  return str;
-}
-
-std::string
-StructPattern::as_string () const
-{
-  std::string str ("StructPattern: \n Path: ");
-
-  str += path.as_string ();
-
-  str += "\n Struct pattern elems: ";
-  if (!has_struct_pattern_elems ())
-    str += "none";
-  else
-    str += elems.as_string ();
-
-  return str;
-}
-
-std::string
-LiteralPattern::as_string () const
-{
-  return lit.as_string ();
-}
-
-std::string
-ReferencePattern::as_string () const
-{
-  // TODO: maybe rewrite to work with non-linearisable patterns
-  std::string str ("&");
-
-  if (has_two_amps)
-    str += "&";
-
-  if (is_mut)
-    str += "mut ";
-
-  str += pattern->as_string ();
-
-  return str;
-}
-
-std::string
-IdentifierPattern::as_string () const
-{
-  // TODO: maybe rewrite to work with non-linearisable patterns
-  std::string str;
-
-  if (is_ref)
-    str += "ref ";
-
-  if (is_mut)
-    str += "mut ";
-
-  str += variable_ident;
-
-  if (has_pattern_to_bind ())
-    str += " @ " + to_bind->as_string ();
-
-  return str;
-}
-
-std::string
-TupleStructItemsNoRange::as_string () const
-{
-  std::string str;
-
-  for (const auto &pattern : patterns)
-    str += "\n  " + pattern->as_string ();
-
-  return str;
-}
-
-std::string
-TupleStructItemsRange::as_string () const
-{
-  std::string str ("\n  Lower patterns: ");
-
-  if (lower_patterns.empty ())
-    {
-      str += "none";
-    }
-  else
-    {
-      for (const auto &lower : lower_patterns)
-	str += "\n   " + lower->as_string ();
-    }
-
-  str += "\n  Upper patterns: ";
-  if (upper_patterns.empty ())
-    {
-      str += "none";
-    }
-  else
-    {
-      for (const auto &upper : upper_patterns)
-	str += "\n   " + upper->as_string ();
-    }
-
-  return str;
-}
-
-std::string
-TupleStructPattern::as_string () const
-{
-  std::string str ("TupleStructPattern: \n Path: ");
-
-  str += path.as_string ();
-
-  str += "\n Tuple struct items: " + items->as_string ();
-
-  return str;
-}
-
 std::string
 LetStmt::as_string () const
 {
@@ -4763,12 +4371,6 @@ CompoundAssignmentExpr::accept_vis (ASTVisitor &vis)
   vis.visit (*this);
 }
 
-void
-GroupedExpr::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
 void
 ArrayElemsValues::accept_vis (ASTVisitor &vis)
 {
@@ -5255,138 +4857,6 @@ MacroInvocation::accept_vis (ASTVisitor &vis)
   vis.visit (*this);
 }
 
-void
-LiteralPattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-IdentifierPattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-WildcardPattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-RestPattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-RangePatternBoundLiteral::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-RangePatternBoundPath::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-RangePatternBoundQualPath::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-RangePattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-ReferencePattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-StructPatternFieldTuplePat::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-StructPatternFieldIdentPat::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-StructPatternFieldIdent::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-StructPattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-TupleStructItemsNoRange::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-TupleStructItemsRange::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-TupleStructPattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-TuplePatternItemsMultiple::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-TuplePatternItemsRanged::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-TuplePattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-GroupedPattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-SlicePattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-AltPattern::accept_vis (ASTVisitor &vis)
-{
-  vis.visit (*this);
-}
-
 void
 EmptyStmt::accept_vis (ASTVisitor &vis)
 {
diff --git a/gcc/rust/ast/rust-pattern.cc b/gcc/rust/ast/rust-pattern.cc
new file mode 100644
index 00000000000..14179ca1027
--- /dev/null
+++ b/gcc/rust/ast/rust-pattern.cc
@@ -0,0 +1,468 @@
+/* General AST-related method implementations for Rust frontend.
+   Copyright (C) 2009-2023 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "rust-system.h"
+#include "rust-ast-full.h"
+#include "rust-diagnostics.h"
+#include "rust-ast-visitor.h"
+#include "rust-macro.h"
+#include "rust-session-manager.h"
+#include "rust-lex.h"
+#include "rust-parse.h"
+#include "rust-operators.h"
+
+namespace Rust {
+namespace AST {
+
+std::string
+LiteralPattern::as_string () const
+{
+  return lit.as_string ();
+}
+
+std::string
+IdentifierPattern::as_string () const
+{
+  // TODO: maybe rewrite to work with non-linearisable patterns
+  std::string str;
+
+  if (is_ref)
+    str += "ref ";
+
+  if (is_mut)
+    str += "mut ";
+
+  str += variable_ident;
+
+  if (has_pattern_to_bind ())
+    str += " @ " + to_bind->as_string ();
+
+  return str;
+}
+
+std::string
+RangePatternBoundLiteral::as_string () const
+{
+  std::string str;
+
+  if (has_minus)
+    str += "-";
+
+  str += literal.as_string ();
+
+  return str;
+}
+
+std::string
+RangePattern::as_string () const
+{
+  // TODO: maybe rewrite to work with non-linearisable bounds
+  if (has_ellipsis_syntax)
+    return lower->as_string () + "..." + upper->as_string ();
+  else
+    return lower->as_string () + "..=" + upper->as_string ();
+}
+
+std::string
+ReferencePattern::as_string () const
+{
+  // TODO: maybe rewrite to work with non-linearisable patterns
+  std::string str ("&");
+
+  if (has_two_amps)
+    str += "&";
+
+  if (is_mut)
+    str += "mut ";
+
+  str += pattern->as_string ();
+
+  return str;
+}
+
+std::string
+StructPatternField::as_string () const
+{
+  // outer attributes
+  std::string str = append_attributes (outer_attrs, OUTER);
+
+  return str;
+}
+
+std::string
+StructPatternFieldTuplePat::as_string () const
+{
+  // TODO: maybe rewrite to work with non-linearisable patterns
+  std::string str = StructPatternField::as_string ();
+
+  str += "\n";
+
+  str += std::to_string (index) + " : " + tuple_pattern->as_string ();
+
+  return str;
+}
+
+std::string
+StructPatternFieldIdentPat::as_string () const
+{
+  // TODO: maybe rewrite to work with non-linearisable patterns
+  std::string str = StructPatternField::as_string ();
+
+  str += "\n";
+
+  str += ident + " : " + ident_pattern->as_string ();
+
+  return str;
+}
+
+std::string
+StructPatternFieldIdent::as_string () const
+{
+  std::string str = StructPatternField::as_string ();
+
+  str += "\n";
+
+  if (has_ref)
+    str += "ref ";
+
+  if (has_mut)
+    str += "mut ";
+
+  str += ident;
+
+  return str;
+}
+
+std::string
+StructPatternElements::as_string () const
+{
+  std::string str ("\n  Fields: ");
+
+  if (!has_struct_pattern_fields ())
+    {
+      str += "none";
+    }
+  else
+    {
+      for (const auto &field : fields)
+	str += "\n   " + field->as_string ();
+    }
+
+  str += "\n  Etc: ";
+  if (has_struct_pattern_etc)
+    str += "true";
+  else
+    str += "false";
+
+  return str;
+}
+
+std::string
+StructPattern::as_string () const
+{
+  std::string str ("StructPattern: \n Path: ");
+
+  str += path.as_string ();
+
+  str += "\n Struct pattern elems: ";
+  if (!has_struct_pattern_elems ())
+    str += "none";
+  else
+    str += elems.as_string ();
+
+  return str;
+}
+
+std::string
+TupleStructItemsNoRange::as_string () const
+{
+  std::string str;
+
+  for (const auto &pattern : patterns)
+    str += "\n  " + pattern->as_string ();
+
+  return str;
+}
+
+std::string
+TupleStructItemsRange::as_string () const
+{
+  std::string str ("\n  Lower patterns: ");
+
+  if (lower_patterns.empty ())
+    {
+      str += "none";
+    }
+  else
+    {
+      for (const auto &lower : lower_patterns)
+	str += "\n   " + lower->as_string ();
+    }
+
+  str += "\n  Upper patterns: ";
+  if (upper_patterns.empty ())
+    {
+      str += "none";
+    }
+  else
+    {
+      for (const auto &upper : upper_patterns)
+	str += "\n   " + upper->as_string ();
+    }
+
+  return str;
+}
+
+std::string
+TupleStructPattern::as_string () const
+{
+  std::string str ("TupleStructPattern: \n Path: ");
+
+  str += path.as_string ();
+
+  str += "\n Tuple struct items: " + items->as_string ();
+
+  return str;
+}
+
+std::string
+TuplePatternItemsMultiple::as_string () const
+{
+  std::string str;
+
+  for (const auto &pattern : patterns)
+    str += "\n " + pattern->as_string ();
+
+  return str;
+}
+
+std::string
+TuplePatternItemsRanged::as_string () const
+{
+  std::string str;
+
+  str += "\n Lower patterns: ";
+  if (lower_patterns.empty ())
+    {
+      str += "none";
+    }
+  else
+    {
+      for (const auto &lower : lower_patterns)
+	str += "\n  " + lower->as_string ();
+    }
+
+  str += "\n Upper patterns: ";
+  if (upper_patterns.empty ())
+    {
+      str += "none";
+    }
+  else
+    {
+      for (const auto &upper : upper_patterns)
+	str += "\n  " + upper->as_string ();
+    }
+
+  return str;
+}
+
+std::string
+TuplePattern::as_string () const
+{
+  return "TuplePattern: " + items->as_string ();
+}
+
+std::string
+GroupedExpr::as_string () const
+{
+  std::string str ("Grouped expr:");
+
+  // outer attrs
+  str += append_attributes (outer_attrs, OUTER);
+
+  // inner attributes
+  str += append_attributes (inner_attrs, INNER);
+
+  str += "\n Expr in parens: " + expr_in_parens->as_string ();
+
+  return str;
+}
+
+std::string
+SlicePattern::as_string () const
+{
+  std::string str ("SlicePattern: ");
+
+  for (const auto &pattern : items)
+    str += "\n " + pattern->as_string ();
+
+  return str;
+}
+
+std::string
+AltPattern::as_string () const
+{
+  std::string str ("AltPattern: ");
+
+  for (const auto &pattern : alts)
+    str += "\n " + pattern->as_string ();
+
+  return str;
+}
+
+void
+AltPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+GroupedPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+GroupedExpr::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+SlicePattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+TuplePatternItemsRanged::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+TuplePattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+TuplePatternItemsMultiple::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+LiteralPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+IdentifierPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+WildcardPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+RestPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+RangePatternBoundLiteral::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+RangePatternBoundPath::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+RangePatternBoundQualPath::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+RangePattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+ReferencePattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+StructPatternFieldTuplePat::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+StructPatternFieldIdentPat::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+StructPatternFieldIdent::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+StructPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+TupleStructItemsNoRange::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+TupleStructItemsRange::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+void
+TupleStructPattern::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
+} // namespace AST
+} // namespace Rust

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-06 21:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-06 21:36 [gcc/devel/rust/master] ast: Move pattern implementation out of rust-ast Thomas Schwinge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).