ROSE  0.11.50.0
attachPreprocessingInfoTraversal.h
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 {};
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.
45  : currentListOfAttributes(listOfAttributes)
46  {
47  // Nothing else to do here.
48  }
49 #else
50  // AttachPreprocessingInfoTreeTraversalInheritedAttrribute(AttributeMapType* attributeMap) : attributeMapForAllFiles(attributeMap)
52  {
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  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  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  isPartOfFunctionParameterList = false;
65  }
66 #endif
67 
68  // DQ (8/6/2012): Added copy constructor.
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.
85 
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:
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;
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).
123  // int currentFileNameId;
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 
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 
138  bool use_Wave;
139 
140  // The mapOfAttributes declaration is specific to wave usage.
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.
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.
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
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 );
172 #if 0
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
189 
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
SgLocatedNode * previousLocatedNode
accumulator attribute
bool use_Wave
AS(011306) Map of ROSEAttributesLists mapped to filename from Wave.
AttachPreprocessingInfoTreeTraversalSynthesizedAttribute evaluateSynthesizedAttribute(SgNode *n, AttachPreprocessingInfoTreeTraversalInheritedAttrribute inh, SubTreeSynthesizedAttributes st)
pure virtual function which must be implemented to compute the synthesized attribute at a node...
RelativePositionType
MK: Enum type to store if the directive goes before or after the corresponding line of source code...
This class represents the base class for all IR nodes within Sage III.
Definition: Cxx_Grammar.h:9555
SgSourceFile * sourceFile
current source file name id (only handle strings from current file)
This class represents the notion of a statement.
This class represents the notion of an expression or statement which has a position within the source...
int start_index
Map of filenames to list of attributes as found by WAVE.
AttachPreprocessingInfoTreeTraversalInheritedAttrribute evaluateInheritedAttribute(SgNode *n, AttachPreprocessingInfoTreeTraversalInheritedAttrribute inh)
pure virtual function which must be implemented to compute the inherited attribute at a node ...