LCOV - code coverage report
Current view: top level - home/yyan7/compiler/rexompiler/src/frontend/SageIII - attachPreprocessingInfoTraversal.h (source / functions) Hit Total Coverage
Test: ROSE Lines: 5 5 100.0 %
Date: 2022-12-08 13:48:47 Functions: 0 0 -
Legend: Lines: hit not hit

          Line data    Source code
       1             : #ifndef _ATTACH_PREPROCESSING_INFO_TRAVERSAL_H_
       2             : #define _ATTACH_PREPROCESSING_INFO_TRAVERSAL_H_
       3             : 
       4             : // DQ (4/5/2006): Andreas has removed this code!
       5             : 
       6             : // void printOutComments ( SgLocatedNode* locatedNode );
       7             : 
       8             : // Need dummy classes and the actual tree traversal class
       9             : // DQ: Renamed classes, can't have DI and DS polluting the global name space (potential for strange errors)
      10             : // class DI : public SgInheritedAttribute {};
      11             : // class DS : public SgSynthesizedAttribute {};
      12             : 
      13             : // DQ (4/30/2020): We no long need this in the new simplified support for CPP directivces and comments and unparsing of header files.
      14             : // DQ (12/12/2008): This is the type use to hold all the CPP directives and comments for each of many files.
      15             : // typedef std::map<int, ROSEAttributesList*> AttributeMapType;
      16             : // typedef std::map<int, int> StartingIndexAttributeMapType;
      17             : // typedef std::map<int, SgLocatedNode*> previousLocatedNodeInFileType;
      18             : 
      19             : // DQ (11/29/2008): I don't think these are required to be derived from a special class any more!
      20             : // class AttachPreprocessingInfoTreeTraversalInheritedAttrribute  : public AstInheritedAttribute {};
      21             : // class AttachPreprocessingInfoTreeTraversalSynthesizedAttribute : public AstSynthesizedAttribute {};
      22             : class AttachPreprocessingInfoTreeTraversalInheritedAttrribute
      23             :    {
      24             :   // DQ (11/30/2008): I want to permit different list of directives and comments to be woven into the AST.
      25             :   // Comments and directives from the original source file need to be inserted into the AST for C/C++/Fortran.
      26             :   // However, for Fortran we also need to gather and insert the linemarker directives into the AST so that
      27             :   // we can support an analysis of the AST that will mark where code has been included from for the case of 
      28             :   // Fortran using CPP directives (e.g. #include directives).  To support this the mechanism for weaving
      29             :   // the ROSEAttributesList has to be used twice (just for CPP Fortran code) and we need to use this
      30             :   // weaving implementation with two different lists of directives.  By moving the ROSEAttributesList
      31             :   // into the inherited attribute we can set it differently for the two times we require it to be done.
      32             : 
      33             :      public:
      34             :        // DQ (12/12/2008): Make this a map to handle the attributes from more than one file (even if we 
      35             :        // only handle a single file, this added flexability is easier to support directly than to have 
      36             :        // an outer traversal vll an inner traversal).  This more general interface supports the case
      37             :        // where we save all comments and CPP directives used from include files in addition to the main 
      38             :        // source file.
      39             :        // ROSEAttributesList* currentListOfAttributes;
      40             :        // AttributeMapType* attributeMapForAllFiles;
      41             : 
      42             : #if 0
      43             :        // Constructor.
      44             :           AttachPreprocessingInfoTreeTraversalInheritedAttrribute(ROSEAttributesList* listOfAttributes)
      45             :              : currentListOfAttributes(listOfAttributes)
      46             :              {
      47             :             // Nothing else to do here.
      48             :              }
      49             : #else
      50             :        // AttachPreprocessingInfoTreeTraversalInheritedAttrribute(AttributeMapType* attributeMap) : attributeMapForAllFiles(attributeMap)
      51         353 :           AttachPreprocessingInfoTreeTraversalInheritedAttrribute()
      52         353 :              {
      53             :             // Nothing else to do here.
      54             : 
      55             :             // DQ (8/6/2012): This is a part of fixing the CPP directives for templates until they are no longer unparsed as strings.
      56         353 :                isPartOfTemplateDeclaration = false;
      57             : 
      58             :             // DQ (7/1/2014): We need to make sure that CPP directives will not be attached to template instantiations that might 
      59             :             // not be unparsed (see test2014_68.C).
      60         353 :                isPartOfTemplateInstantiationDeclaration = false;
      61             : 
      62             :             // Pei-Hung (09/17/2020): We need to check if SgInitializedName is part of SgFunctionParameterList and the comment
      63             :             // will not be attached to it. 
      64         353 :                isPartOfFunctionParameterList = false;
      65             :              }
      66             : #endif
      67             : 
      68             :        // DQ (8/6/2012): Added copy constructor.
      69             :           AttachPreprocessingInfoTreeTraversalInheritedAttrribute(const AttachPreprocessingInfoTreeTraversalInheritedAttrribute & X);
      70             : 
      71             :        // DQ (8/6/2012): This is a part of fixing the CPP directives for templates until they are no longer unparsed as strings.
      72             :           bool isPartOfTemplateDeclaration;
      73             : 
      74             :        // DQ (7/1/2014): We need to make sure that CPP directives will not be attached to template instantiations that might 
      75             :        // not be unparsed (see test2014_68.C).
      76             :           bool isPartOfTemplateInstantiationDeclaration;
      77             : 
      78             :       // Pei-Hung (09/17/2020): We need to check if SgInitializedName is part of SgFunctionParameterList and the comment
      79             :       // will not be attached to it. 
      80             :          bool isPartOfFunctionParameterList;
      81             :    };
      82             : 
      83             : // This is an empty class, meaning that we could likely just have implemented just a TopDownProcessing traversal.
      84             : class AttachPreprocessingInfoTreeTraversalSynthesizedAttribute {};
      85             : 
      86             : class AttachPreprocessingInfoTreeTrav 
      87             :    : public SgTopDownBottomUpProcessing<AttachPreprocessingInfoTreeTraversalInheritedAttrribute,
      88             :                                         AttachPreprocessingInfoTreeTraversalSynthesizedAttribute>
      89             :    {
      90             :      // negara1 (08/12/2011): These lists contain correspondingly pairs of <include_stmt_to_be_inserted, stmt_before_which_should_insert>
      91             :      //                       and <include_stmt_to_be_inserted, stmt_after_which_should_insert>
      92             :      private:
      93             :          std::list<std::pair<SgIncludeDirectiveStatement*, SgStatement*> > statementsToInsertBefore;
      94             :          std::list<std::pair<SgIncludeDirectiveStatement*, SgStatement*> > statementsToInsertAfter;
      95             :          
      96             :      protected: // Pi-- private:
      97             :        //! accumulator attribute
      98             :        // SgLocatedNode *previousLocNodePtr;
      99             : 
     100             :        // DQ (4/30/2020): We no longer need this in the new simplified support for CPP directivces and comments and unparsing of header files.
     101             :        // Store the location in the AST of the previous node associated with each file.
     102             :        // previousLocatedNodeInFileType previousLocatedNodeMap;
     103             :           SgLocatedNode* previousLocatedNode;
     104             : 
     105             :        // DQ (4/30/2020): We no long need this in the new simplified support for CPP directivces and comments and unparsing of header files.
     106             :        // DQ (11/30/2008): This is now stored in the inherited attribute (so that it can be set external to the traversal).
     107             :        // List of all comments and CPP directives
     108             :        // ROSEAttributesList *currentListOfAttributes;
     109             :        // AttributeMapType attributeMapForAllFiles;
     110             : 
     111             :        // DQ (4/30/2020): Adding back the original simile level of support for a single ROSEAttributesList data member.
     112             :           ROSEAttributesList *currentListOfAttributes;
     113             : 
     114             :        // DQ (12/12/2008): I don't think this is required since it is just the list size!
     115             :        // size of list?
     116             :        // int sizeOfCurrentListOfAttributes;
     117             : 
     118             :        // DQ (12/12/2008): This allows buildCommentAndCppDirectiveList() to get information about what language 
     119             :        // and version of language (fixed or free format for Fortran) as required to gather CPP directives and 
     120             :        // comments (more for comments than for CPP directives).  This is required even if processing other files
     121             :        // (include files).
     122             :       //! current source file name id (only handle strings from current file)
     123             :        // int currentFileNameId;
     124             :          SgSourceFile* sourceFile;
     125             : 
     126             :       // DQ (6/23/2020): We only want to process located nodes that are associated with this file id.
     127             :          int target_source_file_id;
     128             : 
     129             :       // DQ (2/28/2019): We need to return the line that is associated with the source file where this can be a node shared between multiple ASTs.
     130             :          int source_file_id;
     131             : 
     132             :       //! AS(011306) Map of ROSEAttributesLists mapped to filename from Wave
     133             :        // DQ (12./12/2008): this should be updated to use int instead of strings.
     134             :        // For now I will not touch the Wave specific implementation.
     135             :        // std::map<std::string,ROSEAttributesList*>* currentMapOfAttributes;
     136             : 
     137             :       //! Use_Wave == true specifies if a wave preprocessor is used
     138             :           bool use_Wave;
     139             : 
     140             :       //  The mapOfAttributes declaration is specific to wave usage.
     141             :       //! Map of filenames to list of attributes as found by WAVE.  
     142             :        //   std::map<std::string,ROSEAttributesList*>* mapOfAttributes; 
     143             : 
     144             :        // DQ (4/30/2020): We no long need this in the new simplified support for CPP directivces and comments and unparsing of header files.
     145             :       //! AS(092107) Optimization variable to avoid n^2 complexity in 
     146             :       //! iterateOverListAndInsertPreviouslyUninsertedElementsAppearingBeforeLineNumber()         
     147             :        // int start_index;
     148             :        // StartingIndexAttributeMapType startIndexMap;
     149             : 
     150             :        // DQ (4/30/2020): Adding back the original simile level of support for a single ROSEAttributesList data member.
     151             :           int start_index;
     152             : 
     153             :        // DQ (12/16/2008): Added support to collect CPP directives and comments from all 
     154             :        // include files (except should specified using exclusion lists via the command line).
     155             :           bool processAllIncludeFiles;
     156             : 
     157             :      public:
     158             :        // DQ (9/24/2007): Moved function definition to source file from header file.
     159             :        // AS(011306) Constructor for use of Wave Preprocessor
     160             :           AttachPreprocessingInfoTreeTrav( std::map<std::string,ROSEAttributesList*>* attrMap);
     161             : 
     162             :      public:
     163             : 
     164             :        // Destructor
     165             :           ~AttachPreprocessingInfoTreeTrav();
     166             : 
     167             :        // DQ (6/2/2020): Change the API for this function.
     168             :        // DQ (9/24/2007): Moved function definition to source file from header file.
     169             :        // Constructor
     170             :        // AttachPreprocessingInfoTreeTrav( SgSourceFile* file, bool includeDirectivesAndCommentsFromAllFiles );
     171             :           AttachPreprocessingInfoTreeTrav( SgSourceFile* file, ROSEAttributesList* listOfAttributes );
     172             : #if 0
     173             :           AttachPreprocessingInfoTreeTrav();
     174             : #endif
     175             :           void setupPointerToPreviousNode (SgLocatedNode* currentLocNodePtr );
     176             : 
     177             :           void iterateOverListAndInsertPreviouslyUninsertedElementsAppearingBeforeLineNumber
     178             :              ( SgLocatedNode* locatedNode, int lineNumber, PreprocessingInfo::RelativePositionType location,
     179             :                bool reset_start_index, ROSEAttributesList *currentListOfAttributes );
     180             : 
     181             :        // DQ (2/16/2021): This function supports iterateOverListAndInsertPreviouslyUninsertedElementsAppearingBeforeLineNumber().
     182             :        // It seperates the case where comments and CPP directives are put in the scope or attached to the bottom of the previous statement.
     183             :           void handleBracedScopes(SgLocatedNode* previousLocatedNode, SgStatement* bracedScope, int lineOfClosingBrace, bool reset_start_index, ROSEAttributesList *currentListOfAttributes);
     184             : 
     185             :        // Member function to be executed on each node of the AST
     186             :        // in the course of its traversal
     187             :           AttachPreprocessingInfoTreeTraversalInheritedAttrribute
     188             :              evaluateInheritedAttribute( SgNode *n, AttachPreprocessingInfoTreeTraversalInheritedAttrribute inh);
     189             : 
     190             :           AttachPreprocessingInfoTreeTraversalSynthesizedAttribute
     191             :              evaluateSynthesizedAttribute( SgNode *n, AttachPreprocessingInfoTreeTraversalInheritedAttrribute inh, SubTreeSynthesizedAttributes st);
     192             : 
     193             :        // DQ (10/27/2007): Added display function to output information gather durring the collection of 
     194             :        // comments and CPP directives across all files.
     195             :           void display(const std::string & label) const;
     196             : 
     197             :        // DQ (4/30/2020): We no long need this in the new simplified support for CPP directivces and comments and unparsing of header files.
     198             :        // AttributeMapType & get_attributeMapForAllFiles() { return attributeMapForAllFiles; }
     199             :        
     200             :        // Access function for elements in the map of attribute lists.
     201             :           ROSEAttributesList* getListOfAttributes ( int currentFileNameId );
     202             : 
     203             :           void setMapOfAttributes();
     204             : 
     205             :        // output for debugging.
     206             :        // void display_static_data( const std::string & label ) const;
     207             : 
     208             :        // DQ (1/4/2021): Adding support for comments and CPP directives and tokens to use new_filename.
     209             :        // DQ (7/4/2020): Make this a static function to support Fortran handling.
     210             :        // DQ (11/30/2008): Refactored code to isolate this from the inherited attribute evaluation.
     211             :        // static ROSEAttributesList* buildCommentAndCppDirectiveList ( SgFile *currentFilePtr, std::map<std::string,ROSEAttributesList*>* mapOfAttributes, bool use_Wave );
     212             :        // ROSEAttributesList* buildCommentAndCppDirectiveList ( bool use_Wave, std::string currentFilename );
     213             :        // static ROSEAttributesList* buildCommentAndCppDirectiveList ( bool use_Wave, std::string currentFilename );
     214             :        // static ROSEAttributesList* buildCommentAndCppDirectiveList ( bool use_Wave, SgSourceFile* sourceFile, std::string currentFilename );
     215             :           static ROSEAttributesList* buildCommentAndCppDirectiveList ( bool use_Wave, SgSourceFile* sourceFile, std::string currentFilename, std::string new_filename );
     216             :    };
     217             : 
     218             : #endif
     219             : 
     220             : // EOF

Generated by: LCOV version 1.14