File: IncludeExpander.h

package info (click to toggle)
aspectc%2B%2B 1.0pre4~svn.20090918-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 117,308 kB
  • ctags: 410,601
  • sloc: cpp: 1,883,007; ansic: 17,279; sh: 2,190; makefile: 1,088
file content (91 lines) | stat: -rw-r--r-- 2,775 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// This file is part of the AspectC++ compiler 'ac++'.
// Copyright (C) 1999-2003  The 'ac++' developers (see aspectc.org)
//                                                                
// This program 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 2 of 
// the License, or (at your option) any later version.            
//                                                                
// This program 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 this program; if not, write to the Free     
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
// MA  02111-1307  USA                                            

#ifndef __include_expander_h__
#define __include_expander_h__

// Visitor, which expands all project-local includes 

#include "Puma/PreVisitor.h"
#include "Puma/BCStack.h"
#include "Puma/Token.h"
#include "Puma/Unit.h"
#include "ACUnit.h"
using namespace Puma;

namespace Puma {
  class CProject;
  class Token;
  class ErrorStream;
} // namespace Puma

class LineDirectiveMgr;

class IncludeExpander : public PreVisitor {

  struct File {
    Unit *_unit;
    Token *_next;
    File (Unit *u = 0) : _unit (u), _next (0) {
      if (_unit)
        _next = (Token*)_unit->first ();
    }
  };

  ErrorStream &_err;
  CProject &_project;
  LineDirectiveMgr &_line_mgr;
  ACUnit _unit;
  BCStack<File> _files;
  int _depth;
  int _ext_depth;
  Unit *_root;
  bool _forced_includes;

  // Go through the nodes of the syntax tree.
  void iterateNodes (PreTree*);
  
  // expand tokens from a unit (write them into the result unit)
  void write (Unit *unit, Token *first, Token *last);

  // write a string into the unit
  void write (const char *str);

  // print the rest of the topmost unit
  void finish ();

  // pop elements from the include stack until depth 'up_to'
  void rewind (int up_to);

  // Visiting the parts of the preprocessor syntax tree.
  
  void visitPreIncludeDirective_Pre (PreIncludeDirective*);

public:
    
  IncludeExpander (ErrorStream &err, CProject &project,
		   LineDirectiveMgr &ldm) :
    _err (err), _project (project), _line_mgr (ldm), _unit (err), _root (0) {}
 
  virtual ~IncludeExpander () {}

  void expand (const char *file);
  ACUnit &unit () { return _unit; }
};  	    

#endif // __include_expander_h__