| // 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/>. |
| |
| #include "rust-hir-dump.h" |
| |
| namespace Rust { |
| namespace HIR { |
| |
| Dump::Dump (std::ostream &stream) : stream (stream), indent (0) {} |
| |
| void |
| Dump::go (HIR::Crate &crate) |
| { |
| stream << "Crate" |
| << " " |
| << "{" << std::endl; |
| // |
| |
| indent++; |
| stream << std::string (indent, indent_char); |
| stream << "inner_attrs" |
| << ":" |
| << " " |
| << "["; |
| for (auto &attr : crate.inner_attrs) |
| stream << attr.as_string (); |
| stream << "]" |
| << "," << std::endl; |
| indent--; |
| |
| indent++; |
| stream << std::string (indent, indent_char); |
| // |
| |
| stream << "items" |
| << ":" |
| << " " |
| << "["; |
| |
| stream << std::string (indent, indent_char); |
| for (const auto &item : crate.items) |
| { |
| stream << std::endl; |
| item->accept_vis (*this); |
| } |
| stream << std::string (indent, indent_char); |
| stream << "]" |
| << "," << std::endl; |
| indent--; |
| // |
| |
| indent++; |
| stream << std::string (indent, indent_char); |
| stream << "node_mappings" |
| << ":" |
| << " " |
| << "["; |
| // TODO: print crate mapping attrs |
| stream << "]" << std::endl; |
| indent--; |
| |
| stream << "}" << std::endl; |
| } |
| |
| void |
| Dump::visit (Lifetime &) |
| {} |
| void |
| Dump::visit (LifetimeParam &) |
| {} |
| void |
| Dump::visit (PathInExpression &) |
| {} |
| void |
| Dump::visit (TypePathSegment &) |
| {} |
| void |
| Dump::visit (TypePathSegmentGeneric &) |
| {} |
| void |
| Dump::visit (TypePathSegmentFunction &) |
| {} |
| void |
| Dump::visit (TypePath &) |
| {} |
| void |
| Dump::visit (QualifiedPathInExpression &) |
| {} |
| void |
| Dump::visit (QualifiedPathInType &) |
| {} |
| |
| void |
| Dump::visit (LiteralExpr &literal_expr) |
| { |
| indent++; |
| stream << std::string (indent, indent_char); |
| stream << "( " + literal_expr.get_literal ().as_string () + " (" |
| + literal_expr.get_mappings ().as_string () + "))"; |
| stream << "\n"; |
| } |
| void |
| Dump::visit (BorrowExpr &) |
| {} |
| void |
| Dump::visit (DereferenceExpr &) |
| {} |
| void |
| Dump::visit (ErrorPropagationExpr &) |
| {} |
| void |
| Dump::visit (NegationExpr &) |
| {} |
| void |
| Dump::visit (ArithmeticOrLogicalExpr &) |
| {} |
| void |
| Dump::visit (ComparisonExpr &) |
| {} |
| void |
| Dump::visit (LazyBooleanExpr &) |
| {} |
| void |
| Dump::visit (TypeCastExpr &) |
| {} |
| void |
| Dump::visit (AssignmentExpr &) |
| {} |
| void |
| Dump::visit (CompoundAssignmentExpr &) |
| {} |
| void |
| Dump::visit (GroupedExpr &) |
| {} |
| |
| void |
| Dump::visit (ArrayElemsValues &) |
| {} |
| void |
| Dump::visit (ArrayElemsCopied &) |
| {} |
| void |
| Dump::visit (ArrayExpr &) |
| {} |
| void |
| Dump::visit (ArrayIndexExpr &) |
| {} |
| void |
| Dump::visit (TupleExpr &) |
| {} |
| void |
| Dump::visit (TupleIndexExpr &) |
| {} |
| void |
| Dump::visit (StructExprStruct &) |
| {} |
| |
| void |
| Dump::visit (StructExprFieldIdentifier &) |
| {} |
| void |
| Dump::visit (StructExprFieldIdentifierValue &) |
| {} |
| |
| void |
| Dump::visit (StructExprFieldIndexValue &) |
| {} |
| void |
| Dump::visit (StructExprStructFields &) |
| {} |
| void |
| Dump::visit (StructExprStructBase &) |
| {} |
| |
| void |
| Dump::visit (CallExpr &) |
| {} |
| void |
| Dump::visit (MethodCallExpr &) |
| {} |
| void |
| Dump::visit (FieldAccessExpr &) |
| {} |
| void |
| Dump::visit (ClosureExpr &) |
| {} |
| void |
| Dump::visit (BlockExpr &) |
| { |
| stream << "BlockExpr" |
| << ":" |
| << " " |
| << "["; |
| indent++; |
| // TODO: print statements |
| // TODO: print tail expression if exists |
| stream << "]"; |
| indent--; |
| } |
| |
| void |
| Dump::visit (ContinueExpr &) |
| {} |
| void |
| Dump::visit (BreakExpr &) |
| {} |
| void |
| Dump::visit (RangeFromToExpr &) |
| {} |
| void |
| Dump::visit (RangeFromExpr &) |
| {} |
| void |
| Dump::visit (RangeToExpr &) |
| {} |
| void |
| Dump::visit (RangeFullExpr &) |
| {} |
| void |
| Dump::visit (RangeFromToInclExpr &) |
| {} |
| void |
| Dump::visit (RangeToInclExpr &) |
| {} |
| void |
| Dump::visit (ReturnExpr &) |
| {} |
| void |
| Dump::visit (UnsafeBlockExpr &) |
| {} |
| void |
| Dump::visit (LoopExpr &) |
| {} |
| void |
| Dump::visit (WhileLoopExpr &) |
| {} |
| void |
| Dump::visit (WhileLetLoopExpr &) |
| {} |
| void |
| Dump::visit (ForLoopExpr &) |
| {} |
| void |
| Dump::visit (IfExpr &) |
| {} |
| void |
| Dump::visit (IfExprConseqElse &) |
| {} |
| void |
| Dump::visit (IfExprConseqIf &) |
| {} |
| void |
| Dump::visit (IfExprConseqIfLet &) |
| {} |
| void |
| Dump::visit (IfLetExpr &) |
| {} |
| void |
| Dump::visit (IfLetExprConseqElse &) |
| {} |
| void |
| Dump::visit (IfLetExprConseqIf &) |
| {} |
| void |
| Dump::visit (IfLetExprConseqIfLet &) |
| {} |
| |
| void |
| Dump::visit (MatchExpr &) |
| {} |
| void |
| Dump::visit (AwaitExpr &) |
| {} |
| void |
| Dump::visit (AsyncBlockExpr &) |
| {} |
| |
| void |
| Dump::visit (TypeParam &) |
| {} |
| |
| void |
| Dump::visit (ConstGenericParam &) |
| {} |
| |
| void |
| Dump::visit (LifetimeWhereClauseItem &) |
| {} |
| void |
| Dump::visit (TypeBoundWhereClauseItem &) |
| {} |
| void |
| Dump::visit (Module &) |
| {} |
| void |
| Dump::visit (ExternCrate &) |
| {} |
| |
| void |
| Dump::visit (UseTreeGlob &) |
| {} |
| void |
| Dump::visit (UseTreeList &) |
| {} |
| void |
| Dump::visit (UseTreeRebind &) |
| {} |
| void |
| Dump::visit (UseDeclaration &) |
| {} |
| void |
| Dump::visit (Function &) |
| { |
| indent++; |
| stream << std::string (indent, indent_char); |
| stream << "Function" |
| << " "; |
| stream << "{" << std::endl; |
| // TODO: print function params |
| stream << std::string (indent, indent_char); |
| stream << "}" << std::endl; |
| // TODO: get function definition and visit block |
| |
| stream << std::endl; |
| indent--; |
| } |
| void |
| Dump::visit (TypeAlias &) |
| {} |
| void |
| Dump::visit (StructStruct &) |
| {} |
| void |
| Dump::visit (TupleStruct &) |
| {} |
| void |
| Dump::visit (EnumItem &) |
| {} |
| void |
| Dump::visit (EnumItemTuple &) |
| {} |
| void |
| Dump::visit (EnumItemStruct &) |
| {} |
| void |
| Dump::visit (EnumItemDiscriminant &) |
| {} |
| void |
| Dump::visit (Enum &) |
| {} |
| void |
| Dump::visit (Union &) |
| {} |
| void |
| Dump::visit (ConstantItem &) |
| {} |
| void |
| Dump::visit (StaticItem &) |
| {} |
| void |
| Dump::visit (TraitItemFunc &) |
| {} |
| void |
| Dump::visit (TraitItemConst &) |
| {} |
| void |
| Dump::visit (TraitItemType &) |
| {} |
| void |
| Dump::visit (Trait &) |
| {} |
| void |
| Dump::visit (ImplBlock &) |
| {} |
| |
| void |
| Dump::visit (ExternalStaticItem &) |
| {} |
| void |
| Dump::visit (ExternalFunctionItem &) |
| {} |
| void |
| Dump::visit (ExternBlock &) |
| {} |
| |
| void |
| Dump::visit (LiteralPattern &) |
| {} |
| void |
| Dump::visit (IdentifierPattern &) |
| {} |
| void |
| Dump::visit (WildcardPattern &) |
| {} |
| |
| void |
| Dump::visit (RangePatternBoundLiteral &) |
| {} |
| void |
| Dump::visit (RangePatternBoundPath &) |
| {} |
| void |
| Dump::visit (RangePatternBoundQualPath &) |
| {} |
| void |
| Dump::visit (RangePattern &) |
| {} |
| void |
| Dump::visit (ReferencePattern &) |
| {} |
| |
| void |
| Dump::visit (StructPatternFieldTuplePat &) |
| {} |
| void |
| Dump::visit (StructPatternFieldIdentPat &) |
| {} |
| void |
| Dump::visit (StructPatternFieldIdent &) |
| {} |
| void |
| Dump::visit (StructPattern &) |
| {} |
| |
| void |
| Dump::visit (TupleStructItemsNoRange &) |
| {} |
| void |
| Dump::visit (TupleStructItemsRange &) |
| {} |
| void |
| Dump::visit (TupleStructPattern &) |
| {} |
| |
| void |
| Dump::visit (TuplePatternItemsMultiple &) |
| {} |
| void |
| Dump::visit (TuplePatternItemsRanged &) |
| {} |
| void |
| Dump::visit (TuplePattern &) |
| {} |
| void |
| Dump::visit (SlicePattern &) |
| {} |
| |
| void |
| Dump::visit (EmptyStmt &) |
| {} |
| void |
| Dump::visit (LetStmt &) |
| {} |
| void |
| Dump::visit (ExprStmtWithoutBlock &) |
| {} |
| void |
| Dump::visit (ExprStmtWithBlock &) |
| {} |
| |
| void |
| Dump::visit (TraitBound &) |
| {} |
| void |
| Dump::visit (ImplTraitType &) |
| {} |
| void |
| Dump::visit (TraitObjectType &) |
| {} |
| void |
| Dump::visit (ParenthesisedType &) |
| {} |
| void |
| Dump::visit (ImplTraitTypeOneBound &) |
| {} |
| void |
| Dump::visit (TupleType &) |
| {} |
| void |
| Dump::visit (NeverType &) |
| {} |
| void |
| Dump::visit (RawPointerType &) |
| {} |
| void |
| Dump::visit (ReferenceType &) |
| {} |
| void |
| Dump::visit (ArrayType &) |
| {} |
| void |
| Dump::visit (SliceType &) |
| {} |
| void |
| Dump::visit (InferredType &) |
| {} |
| void |
| Dump::visit (BareFunctionType &) |
| {} |
| } // namespace HIR |
| } // namespace Rust |