1  // Copyright (C) 2020-2023 Free Software Foundation, Inc.
       2  
       3  // This file is part of GCC.
       4  
       5  // GCC is free software; you can redistribute it and/or modify it under
       6  // the terms of the GNU General Public License as published by the Free
       7  // Software Foundation; either version 3, or (at your option) any later
       8  // version.
       9  
      10  // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      11  // WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12  // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      13  // for more details.
      14  
      15  // You should have received a copy of the GNU General Public License
      16  // along with GCC; see the file COPYING3.  If not see
      17  // <http://www.gnu.org/licenses/>.
      18  
      19  #ifndef RUST_PRIVACY_REPORTER_H
      20  #define RUST_PRIVACY_REPORTER_H
      21  
      22  #include "rust-hir-map.h"
      23  #include "rust-hir-visitor.h"
      24  #include "rust-mapping-common.h"
      25  #include "rust-name-resolver.h"
      26  
      27  namespace Rust {
      28  namespace Privacy {
      29  
      30  /**
      31   * This visitor visits all items and expressions of a crate and reports privacy
      32   * violations. It should be started after using the `VisibilityResolver` visitor
      33   * which resolves the visibilities of all items of a crate.
      34   */
      35  class PrivacyReporter : public HIR::HIRExpressionVisitor,
      36  			public HIR::HIRStmtVisitor
      37  {
      38  public:
      39    PrivacyReporter (Analysis::Mappings &mappings,
      40  		   Rust::Resolver::Resolver &resolver,
      41  		   const Rust::Resolver::TypeCheckContext &ty_ctx);
      42  
      43    /**
      44     * Perform privacy error reporting on an entire crate
      45     */
      46    void go (HIR::Crate &crate);
      47  
      48  private:
      49    /**
      50     * Check if a given item's visibility is accessible from the current module.
      51     *
      52     * This function reports the errors it finds.
      53     *
      54     * @param use_id NodeId of the expression/statement referencing an item with
      55     * 		a visibility
      56     * @param locus Location of said expression/statement
      57     */
      58    void check_for_privacy_violation (const NodeId &use_id,
      59  				    const Location &locus);
      60  
      61    /**
      62     * Internal function used by `check_type_privacy` when dealing with complex
      63  types
      64     * such as references or arrays
      65     */
      66    void check_base_type_privacy (Analysis::NodeMapping &node_mappings,
      67  				const TyTy::BaseType *ty,
      68  				const Location &locus);
      69  
      70    /**
      71     * Check the privacy of an explicit type.
      72     *
      73     * This function reports the errors it finds.
      74     *
      75     * @param type Reference to an explicit type used in a statement, expression
      76     * 		or parameter
      77     */
      78    void check_type_privacy (const HIR::Type *type);
      79  
      80    virtual void visit (HIR::StructExprFieldIdentifier &field);
      81    virtual void visit (HIR::StructExprFieldIdentifierValue &field);
      82    virtual void visit (HIR::StructExprFieldIndexValue &field);
      83  
      84    virtual void visit (HIR::QualifiedPathInExpression &expr);
      85    virtual void visit (HIR::PathInExpression &expr);
      86    virtual void visit (HIR::ClosureExpr &expr);
      87    virtual void visit (HIR::StructExprStructFields &);
      88    virtual void visit (HIR::StructExprStruct &);
      89    virtual void visit (HIR::LiteralExpr &expr);
      90    virtual void visit (HIR::BorrowExpr &expr);
      91    virtual void visit (HIR::DereferenceExpr &expr);
      92    virtual void visit (HIR::ErrorPropagationExpr &expr);
      93    virtual void visit (HIR::NegationExpr &expr);
      94    virtual void visit (HIR::ArithmeticOrLogicalExpr &expr);
      95    virtual void visit (HIR::ComparisonExpr &expr);
      96    virtual void visit (HIR::LazyBooleanExpr &expr);
      97    virtual void visit (HIR::TypeCastExpr &expr);
      98    virtual void visit (HIR::AssignmentExpr &expr);
      99    virtual void visit (HIR::CompoundAssignmentExpr &expr);
     100    virtual void visit (HIR::GroupedExpr &expr);
     101    virtual void visit (HIR::ArrayExpr &expr);
     102    virtual void visit (HIR::ArrayIndexExpr &expr);
     103    virtual void visit (HIR::TupleExpr &expr);
     104    virtual void visit (HIR::TupleIndexExpr &expr);
     105    virtual void visit (HIR::CallExpr &expr);
     106    virtual void visit (HIR::MethodCallExpr &expr);
     107    virtual void visit (HIR::FieldAccessExpr &expr);
     108    virtual void visit (HIR::BlockExpr &expr);
     109    virtual void visit (HIR::ContinueExpr &expr);
     110    virtual void visit (HIR::BreakExpr &expr);
     111    virtual void visit (HIR::RangeFromToExpr &expr);
     112    virtual void visit (HIR::RangeFromExpr &expr);
     113    virtual void visit (HIR::RangeToExpr &expr);
     114    virtual void visit (HIR::RangeFullExpr &expr);
     115    virtual void visit (HIR::RangeFromToInclExpr &expr);
     116    virtual void visit (HIR::RangeToInclExpr &expr);
     117    virtual void visit (HIR::ReturnExpr &expr);
     118    virtual void visit (HIR::UnsafeBlockExpr &expr);
     119    virtual void visit (HIR::LoopExpr &expr);
     120    virtual void visit (HIR::WhileLoopExpr &expr);
     121    virtual void visit (HIR::WhileLetLoopExpr &expr);
     122    virtual void visit (HIR::ForLoopExpr &expr);
     123    virtual void visit (HIR::IfExpr &expr);
     124    virtual void visit (HIR::IfExprConseqElse &expr);
     125    virtual void visit (HIR::IfExprConseqIf &expr);
     126    virtual void visit (HIR::IfExprConseqIfLet &expr);
     127    virtual void visit (HIR::IfLetExpr &expr);
     128    virtual void visit (HIR::IfLetExprConseqElse &expr);
     129    virtual void visit (HIR::IfLetExprConseqIf &expr);
     130    virtual void visit (HIR::IfLetExprConseqIfLet &expr);
     131    virtual void visit (HIR::MatchExpr &expr);
     132    virtual void visit (HIR::AwaitExpr &expr);
     133    virtual void visit (HIR::AsyncBlockExpr &expr);
     134  
     135    virtual void visit (HIR::EnumItemTuple &);
     136    virtual void visit (HIR::EnumItemStruct &);
     137    virtual void visit (HIR::EnumItem &item);
     138    virtual void visit (HIR::TupleStruct &tuple_struct);
     139    virtual void visit (HIR::EnumItemDiscriminant &);
     140    virtual void visit (HIR::TypePathSegmentFunction &segment);
     141    virtual void visit (HIR::TypePath &path);
     142    virtual void visit (HIR::QualifiedPathInType &path);
     143    virtual void visit (HIR::Module &module);
     144    virtual void visit (HIR::ExternCrate &crate);
     145    virtual void visit (HIR::UseDeclaration &use_decl);
     146    virtual void visit (HIR::Function &function);
     147    virtual void visit (HIR::TypeAlias &type_alias);
     148    virtual void visit (HIR::StructStruct &struct_item);
     149    virtual void visit (HIR::Enum &enum_item);
     150    virtual void visit (HIR::Union &union_item);
     151    virtual void visit (HIR::ConstantItem &const_item);
     152    virtual void visit (HIR::StaticItem &static_item);
     153    virtual void visit (HIR::Trait &trait);
     154    virtual void visit (HIR::ImplBlock &impl);
     155    virtual void visit (HIR::ExternBlock &block);
     156    virtual void visit (HIR::EmptyStmt &stmt);
     157    virtual void visit (HIR::LetStmt &stmt);
     158    virtual void visit (HIR::ExprStmtWithoutBlock &stmt);
     159    virtual void visit (HIR::ExprStmtWithBlock &stmt);
     160  
     161    Analysis::Mappings &mappings;
     162    Rust::Resolver::Resolver &resolver;
     163    const Rust::Resolver::TypeCheckContext &ty_ctx;
     164  
     165    // `None` means we're in the root module - the crate
     166    Optional<NodeId> current_module;
     167  };
     168  
     169  } // namespace Privacy
     170  } // namespace Rust
     171  
     172  #endif // !RUST_PRIVACY_REPORTER_H