bixbite 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. data/LICENSE +20 -0
  2. data/README.markdown +49 -0
  3. data/VERSION +1 -0
  4. data/bin/bixbite +73 -0
  5. data/lib/bixbite.rb +13 -0
  6. data/lib/bixbite/command.rb +14 -0
  7. data/lib/bixbite/create.rb +76 -0
  8. data/template/Rakefile +25 -0
  9. data/template/assets/bixbite/Rakefile.rb +297 -0
  10. data/template/assets/naturaldocs/NaturalDocs/Config/Languages.txt +286 -0
  11. data/template/assets/naturaldocs/NaturalDocs/Config/Topics.txt +382 -0
  12. data/template/assets/naturaldocs/NaturalDocs/Help/customizinglanguages.html +52 -0
  13. data/template/assets/naturaldocs/NaturalDocs/Help/customizingtopics.html +74 -0
  14. data/template/assets/naturaldocs/NaturalDocs/Help/documenting.html +58 -0
  15. data/template/assets/naturaldocs/NaturalDocs/Help/documenting/reference.html +146 -0
  16. data/template/assets/naturaldocs/NaturalDocs/Help/documenting/walkthrough.html +180 -0
  17. data/template/assets/naturaldocs/NaturalDocs/Help/example/Default.css +528 -0
  18. data/template/assets/naturaldocs/NaturalDocs/Help/example/NaturalDocs.js +204 -0
  19. data/template/assets/naturaldocs/NaturalDocs/Help/examples.css +90 -0
  20. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/background.png +0 -0
  21. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/leftside.png +0 -0
  22. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/logo.png +0 -0
  23. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overbody.png +0 -0
  24. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overbodybg.png +0 -0
  25. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overleftmargin.png +0 -0
  26. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overmenu.png +0 -0
  27. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overmenubg.png +0 -0
  28. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/rightside.png +0 -0
  29. data/template/assets/naturaldocs/NaturalDocs/Help/images/logo.gif +0 -0
  30. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/about.png +0 -0
  31. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/background.png +0 -0
  32. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/bottomleft.png +0 -0
  33. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/bottomright.png +0 -0
  34. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/community.png +0 -0
  35. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/customizing.png +0 -0
  36. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/using.png +0 -0
  37. data/template/assets/naturaldocs/NaturalDocs/Help/index.html +9 -0
  38. data/template/assets/naturaldocs/NaturalDocs/Help/javascript/BrowserStyles.js +77 -0
  39. data/template/assets/naturaldocs/NaturalDocs/Help/javascript/PNGHandling.js +72 -0
  40. data/template/assets/naturaldocs/NaturalDocs/Help/keywords.html +38 -0
  41. data/template/assets/naturaldocs/NaturalDocs/Help/languages.html +32 -0
  42. data/template/assets/naturaldocs/NaturalDocs/Help/menu.html +79 -0
  43. data/template/assets/naturaldocs/NaturalDocs/Help/output.html +84 -0
  44. data/template/assets/naturaldocs/NaturalDocs/Help/running.html +40 -0
  45. data/template/assets/naturaldocs/NaturalDocs/Help/styles.css +290 -0
  46. data/template/assets/naturaldocs/NaturalDocs/Help/styles.html +52 -0
  47. data/template/assets/naturaldocs/NaturalDocs/Help/troubleshooting.html +18 -0
  48. data/template/assets/naturaldocs/NaturalDocs/Info/CSSGuide.txt +947 -0
  49. data/template/assets/naturaldocs/NaturalDocs/Info/File Parsing.txt +83 -0
  50. data/template/assets/naturaldocs/NaturalDocs/Info/HTMLTestCases.pm +269 -0
  51. data/template/assets/naturaldocs/NaturalDocs/Info/Languages.txt +107 -0
  52. data/template/assets/naturaldocs/NaturalDocs/Info/NDMarkup.txt +91 -0
  53. data/template/assets/naturaldocs/NaturalDocs/Info/Symbol Management.txt +59 -0
  54. data/template/assets/naturaldocs/NaturalDocs/Info/images/Logo.png +0 -0
  55. data/template/assets/naturaldocs/NaturalDocs/JavaScript/NaturalDocs.js +836 -0
  56. data/template/assets/naturaldocs/NaturalDocs/License-GPL.txt +341 -0
  57. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/BinaryFile.pm +294 -0
  58. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder.pm +280 -0
  59. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/Base.pm +348 -0
  60. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/FramedHTML.pm +345 -0
  61. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/HTML.pm +398 -0
  62. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/HTMLBase.pm +3693 -0
  63. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy.pm +860 -0
  64. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy/Class.pm +412 -0
  65. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy/File.pm +157 -0
  66. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ConfigFile.pm +497 -0
  67. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Constants.pm +165 -0
  68. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/DefineMembers.pm +100 -0
  69. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Error.pm +305 -0
  70. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/File.pm +540 -0
  71. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable.pm +383 -0
  72. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable/Reference.pm +44 -0
  73. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable/String.pm +110 -0
  74. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages.pm +1475 -0
  75. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/ActionScript.pm +1473 -0
  76. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Ada.pm +38 -0
  77. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced.pm +828 -0
  78. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced/Scope.pm +95 -0
  79. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced/ScopeChange.pm +70 -0
  80. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Base.pm +832 -0
  81. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/CSharp.pm +1484 -0
  82. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/PLSQL.pm +319 -0
  83. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Pascal.pm +143 -0
  84. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Perl.pm +1370 -0
  85. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Prototype.pm +92 -0
  86. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Prototype/Parameter.pm +87 -0
  87. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Simple.pm +503 -0
  88. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Tcl.pm +219 -0
  89. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Menu.pm +3406 -0
  90. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Menu/Entry.pm +201 -0
  91. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/NDMarkup.pm +76 -0
  92. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser.pm +1331 -0
  93. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/JavaDoc.pm +464 -0
  94. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/Native.pm +1060 -0
  95. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/ParsedTopic.pm +253 -0
  96. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project.pm +1402 -0
  97. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project/ImageFile.pm +160 -0
  98. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project/SourceFile.pm +113 -0
  99. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ReferenceString.pm +334 -0
  100. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Settings.pm +1418 -0
  101. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Settings/BuildTarget.pm +66 -0
  102. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB.pm +678 -0
  103. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/Extension.pm +84 -0
  104. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/File.pm +129 -0
  105. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/Item.pm +201 -0
  106. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/ItemDefinition.pm +45 -0
  107. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/WatchedFileDefinitions.pm +159 -0
  108. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/StatusMessage.pm +102 -0
  109. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolString.pm +212 -0
  110. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable.pm +1984 -0
  111. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/File.pm +186 -0
  112. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/IndexElement.pm +522 -0
  113. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/Reference.pm +273 -0
  114. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/ReferenceTarget.pm +97 -0
  115. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/Symbol.pm +428 -0
  116. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/SymbolDefinition.pm +96 -0
  117. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Topics.pm +1319 -0
  118. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Topics/Type.pm +151 -0
  119. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Version.pm +384 -0
  120. data/template/assets/naturaldocs/NaturalDocs/NaturalDocs +400 -0
  121. data/template/assets/naturaldocs/NaturalDocs/NaturalDocs.bat +17 -0
  122. data/template/assets/naturaldocs/NaturalDocs/Styles/Default.css +767 -0
  123. data/template/assets/naturaldocs/NaturalDocs/Styles/Roman.css +765 -0
  124. data/template/assets/naturaldocs/NaturalDocs/Styles/Small.css +763 -0
  125. data/template/assets/utilities/pngout +0 -0
  126. data/template/deploy/public_html/.htaccess +0 -0
  127. data/template/documentation/js/.htaccess +0 -0
  128. data/template/src/html/.htaccess +76 -0
  129. data/template/src/html/css/cmn/global.css +96 -0
  130. data/template/src/html/css/cmn/ie.css +15 -0
  131. data/template/src/html/css/cmn/ie6.css +15 -0
  132. data/template/src/html/images/cmn/.htaccess +0 -0
  133. data/template/src/html/images/tmp/.htaccess +0 -0
  134. data/template/src/html/includes/debug.inc +5 -0
  135. data/template/src/html/includes/footer.inc +52 -0
  136. data/template/src/html/includes/header.inc +61 -0
  137. data/template/src/html/includes/html.inc +3 -0
  138. data/template/src/html/includes/namespace.inc +19 -0
  139. data/template/src/html/includes/page.inc +151 -0
  140. data/template/src/html/index.html +35 -0
  141. data/template/src/html/js/cmn/bootstrap.js +74 -0
  142. data/template/src/html/js/cmn/global.js +142 -0
  143. data/template/src/html/js/cmn/lib/LAB.js +348 -0
  144. data/template/src/html/min/.htaccess +4 -0
  145. data/template/src/html/min/MinifyCLI.php +19 -0
  146. data/template/src/html/min/README.txt +132 -0
  147. data/template/src/html/min/builder/_index.js +242 -0
  148. data/template/src/html/min/builder/bm.js +36 -0
  149. data/template/src/html/min/builder/index.php +182 -0
  150. data/template/src/html/min/builder/ocCheck.php +36 -0
  151. data/template/src/html/min/builder/rewriteTest.js +1 -0
  152. data/template/src/html/min/config.php +187 -0
  153. data/template/src/html/min/groupsConfig.php +34 -0
  154. data/template/src/html/min/index.php +66 -0
  155. data/template/src/html/min/lib/FirePHP.php +1370 -0
  156. data/template/src/html/min/lib/HTTP/ConditionalGet.php +348 -0
  157. data/template/src/html/min/lib/HTTP/Encoder.php +326 -0
  158. data/template/src/html/min/lib/JSMin.php +314 -0
  159. data/template/src/html/min/lib/JSMinPlus.php +1872 -0
  160. data/template/src/html/min/lib/Minify.php +532 -0
  161. data/template/src/html/min/lib/Minify/Build.php +103 -0
  162. data/template/src/html/min/lib/Minify/CSS.php +83 -0
  163. data/template/src/html/min/lib/Minify/CSS/Compressor.php +250 -0
  164. data/template/src/html/min/lib/Minify/CSS/UriRewriter.php +270 -0
  165. data/template/src/html/min/lib/Minify/Cache/APC.php +130 -0
  166. data/template/src/html/min/lib/Minify/Cache/File.php +125 -0
  167. data/template/src/html/min/lib/Minify/Cache/Memcache.php +137 -0
  168. data/template/src/html/min/lib/Minify/ClosureCompiler.php +85 -0
  169. data/template/src/html/min/lib/Minify/CommentPreserver.php +90 -0
  170. data/template/src/html/min/lib/Minify/Controller/Base.php +202 -0
  171. data/template/src/html/min/lib/Minify/Controller/Files.php +78 -0
  172. data/template/src/html/min/lib/Minify/Controller/Groups.php +94 -0
  173. data/template/src/html/min/lib/Minify/Controller/MinApp.php +132 -0
  174. data/template/src/html/min/lib/Minify/Controller/Page.php +82 -0
  175. data/template/src/html/min/lib/Minify/Controller/Version1.php +118 -0
  176. data/template/src/html/min/lib/Minify/HTML.php +245 -0
  177. data/template/src/html/min/lib/Minify/ImportProcessor.php +157 -0
  178. data/template/src/html/min/lib/Minify/Lines.php +131 -0
  179. data/template/src/html/min/lib/Minify/Logger.php +45 -0
  180. data/template/src/html/min/lib/Minify/Packer.php +37 -0
  181. data/template/src/html/min/lib/Minify/Source.php +187 -0
  182. data/template/src/html/min/lib/Minify/YUICompressor.php +139 -0
  183. data/template/src/html/min/lib/Solar/Dir.php +199 -0
  184. data/template/src/html/min/lib/closure-compiler.jar +0 -0
  185. data/template/src/html/min/lib/yuicompressor-2.4.2.jar +0 -0
  186. data/template/src/html/min/utils.php +90 -0
  187. data/template/src/templates/css/template.css +7 -0
  188. data/template/src/templates/js/template.js +72 -0
  189. data/template/src/templates/template.html +18 -0
  190. data/template/src/yaml/config.yml +46 -0
  191. data/template/src/yaml/deploy.yml +35 -0
  192. data/test/bixbite_test.rb +7 -0
  193. data/test/test_helper.rb +10 -0
  194. metadata +278 -0
@@ -0,0 +1,860 @@
1
+ ###############################################################################
2
+ #
3
+ # Package: NaturalDocs::ClassHierarchy
4
+ #
5
+ ###############################################################################
6
+ #
7
+ # A package that handles all the gory details of managing the class hierarchy. It handles the hierarchy itself, which files define
8
+ # them, rebuilding the files that are affected by changes, and loading and saving them to a file.
9
+ #
10
+ # Usage and Dependencies:
11
+ #
12
+ # - <NaturalDocs::Settings> and <NaturalDocs::Project> must be initialized before use.
13
+ #
14
+ # - <NaturalDocs::SymbolTable> must be initialized before <Load()> is called. It must reflect the state as of the last time
15
+ # Natural Docs was run.
16
+ #
17
+ # - <Load()> must be called to initialize the package. At this point, the <Information Functions> will return the state as
18
+ # of the last time Natural Docs was run. You are free to resolve <NaturalDocs::SymbolTable()> afterwards.
19
+ #
20
+ # - <Purge()> must be called, and then <NaturalDocs::Parser->ParseForInformation()> must be called on all files that
21
+ # have changed so it can fully resolve the hierarchy via the <Modification Functions()>. Afterwards the
22
+ # <Information Functions> will reflect the current state of the code.
23
+ #
24
+ # - <Save()> must be called to commit any changes to the symbol table back to disk.
25
+ #
26
+ ###############################################################################
27
+
28
+ # This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure
29
+ # Natural Docs is licensed under the GPL
30
+
31
+
32
+ use strict;
33
+ use integer;
34
+
35
+ use NaturalDocs::ClassHierarchy::Class;
36
+ use NaturalDocs::ClassHierarchy::File;
37
+
38
+ package NaturalDocs::ClassHierarchy;
39
+
40
+
41
+ ###############################################################################
42
+ # Group: Variables
43
+
44
+ #
45
+ # handle: CLASS_HIERARCHY_FILEHANDLE
46
+ # The file handle used with <ClassHierarchy.nd>.
47
+ #
48
+
49
+ #
50
+ # hash: classes
51
+ #
52
+ # A hash of all the classes. The keys are the class <SymbolStrings> and the values are <NaturalDocs::ClassHierarchy::Classes>.
53
+ #
54
+ my %classes;
55
+
56
+ #
57
+ # hash: files
58
+ #
59
+ # A hash of the hierarchy information referenced by file. The keys are the <FileNames>, and the values are
60
+ # <NaturalDocs::ClassHierarchy::File>s.
61
+ #
62
+ my %files;
63
+
64
+ #
65
+ # hash: parentReferences
66
+ #
67
+ # A hash of all the parent reference strings and what they resolve to. The keys are the <ReferenceStrings> and the values are
68
+ # the class <SymbolStrings> that they resolve to.
69
+ #
70
+ my %parentReferences;
71
+
72
+ #
73
+ # object: watchedFile
74
+ #
75
+ # A <NaturalDocs::ClassHierarchy::File> object of the file being watched for changes. This is compared to the version in <files>
76
+ # to see if anything was changed since the last parse.
77
+ #
78
+ my $watchedFile;
79
+
80
+ #
81
+ # string: watchedFileName
82
+ #
83
+ # The <FileName> of the watched file, if any. If there is no watched file, this will be undef.
84
+ #
85
+ my $watchedFileName;
86
+
87
+ #
88
+ # bool: dontRebuildFiles
89
+ #
90
+ # A bool to set if you don't want changes in the hierarchy to cause files to be rebuilt.
91
+ #
92
+ my $dontRebuildFiles;
93
+
94
+
95
+
96
+ ###############################################################################
97
+ # Group: Files
98
+
99
+
100
+ #
101
+ # File: ClassHierarchy.nd
102
+ #
103
+ # Stores the class hierarchy on disk.
104
+ #
105
+ # Format:
106
+ #
107
+ # > [BINARY_FORMAT]
108
+ # > [VersionInt: app version]
109
+ #
110
+ # The standard <BINARY_FORMAT> and <VersionInt> header.
111
+ #
112
+ # > [SymbolString: class or undef to end]
113
+ #
114
+ # Next we begin a class segment with its <SymbolString>. These continue until the end of the file. Only defined classes are
115
+ # included.
116
+ #
117
+ # > [UInt32: number of files]
118
+ # > [AString16: file] [AString16: file] ...
119
+ #
120
+ # Next there is the number of files that define that class. It's a UInt32, which seems like overkill, but I could imagine every
121
+ # file in a huge C++ project being under the same namespace, and thus contributing its own definition. It's theoretically
122
+ # possible.
123
+ #
124
+ # Following the number is that many file names. You must remember the index of each file, as they will be important later.
125
+ # Indexes start at one because zero has a special meaning.
126
+ #
127
+ # > [UInt8: number of parents]
128
+ # > ( [ReferenceString (no type): parent]
129
+ # > [UInt32: file index] [UInt32: file index] ... [UInt32: 0] ) ...
130
+ #
131
+ # Next there is the number of parents defined for this class. For each one, we define a parent segment, which consists of
132
+ # its <ReferenceString>, and then a zero-terminated string of indexes of the files that define that parent as part of that class.
133
+ # The indexes start at one, and are into the list of files we saw previously.
134
+ #
135
+ # Note that we do store class segments for classes without parents, but not for undefined classes.
136
+ #
137
+ # This concludes a class segment. These segments continue until an undef <SymbolString>.
138
+ #
139
+ # See Also:
140
+ #
141
+ # <File Format Conventions>
142
+ #
143
+ # Revisions:
144
+ #
145
+ # 1.22:
146
+ #
147
+ # - Classes and parents switched from AString16s to <SymbolStrings> and <ReferenceStrings>.
148
+ # - A ending undef <SymbolString> was added to the end. Previously it stopped when the file ran out.
149
+ #
150
+ # 1.2:
151
+ #
152
+ # - This file was introduced in 1.2.
153
+ #
154
+
155
+
156
+ ###############################################################################
157
+ # Group: File Functions
158
+
159
+
160
+ #
161
+ # Function: Load
162
+ #
163
+ # Loads the class hierarchy from disk.
164
+ #
165
+ sub Load
166
+ {
167
+ my ($self) = @_;
168
+
169
+ $dontRebuildFiles = 1;
170
+
171
+ my $fileIsOkay;
172
+ my $fileName = NaturalDocs::Project->DataFile('ClassHierarchy.nd');
173
+
174
+ if (!NaturalDocs::Settings->RebuildData() && open(CLASS_HIERARCHY_FILEHANDLE, '<' . $fileName))
175
+ {
176
+ # See if it's binary.
177
+ binmode(CLASS_HIERARCHY_FILEHANDLE);
178
+
179
+ my $firstChar;
180
+ read(CLASS_HIERARCHY_FILEHANDLE, $firstChar, 1);
181
+
182
+ if ($firstChar != ::BINARY_FORMAT())
183
+ {
184
+ close(CLASS_HIERARCHY_FILEHANDLE);
185
+ }
186
+ else
187
+ {
188
+ my $version = NaturalDocs::Version->FromBinaryFile(\*CLASS_HIERARCHY_FILEHANDLE);
189
+
190
+ # Minor bugs were fixed in 1.33 that may affect the stored data.
191
+
192
+ if (NaturalDocs::Version->CheckFileFormat( $version, NaturalDocs::Version->FromString('1.33') ))
193
+ { $fileIsOkay = 1; }
194
+ else
195
+ { close(CLASS_HIERARCHY_FILEHANDLE); };
196
+ };
197
+ };
198
+
199
+
200
+ if (!$fileIsOkay)
201
+ {
202
+ NaturalDocs::Project->ReparseEverything();
203
+ }
204
+ else
205
+ {
206
+ my $raw;
207
+
208
+ for (;;)
209
+ {
210
+ # [SymbolString: class or undef to end]
211
+
212
+ my $class = NaturalDocs::SymbolString->FromBinaryFile(\*CLASS_HIERARCHY_FILEHANDLE);
213
+
214
+ if (!defined $class)
215
+ { last; };
216
+
217
+ # [UInt32: number of files]
218
+
219
+ read(CLASS_HIERARCHY_FILEHANDLE, $raw, 4);
220
+ my $numberOfFiles = unpack('N', $raw);
221
+
222
+ my @files;
223
+
224
+ while ($numberOfFiles)
225
+ {
226
+ # [AString16: file]
227
+
228
+ read(CLASS_HIERARCHY_FILEHANDLE, $raw, 2);
229
+ my $fileLength = unpack('n', $raw);
230
+
231
+ my $file;
232
+ read(CLASS_HIERARCHY_FILEHANDLE, $file, $fileLength);
233
+
234
+ push @files, $file;
235
+ $self->AddClass($file, $class, NaturalDocs::Languages->LanguageOf($file)->Name());
236
+
237
+ $numberOfFiles--;
238
+ };
239
+
240
+ # [UInt8: number of parents]
241
+
242
+ read(CLASS_HIERARCHY_FILEHANDLE, $raw, 1);
243
+ my $numberOfParents = unpack('C', $raw);
244
+
245
+ while ($numberOfParents)
246
+ {
247
+ # [ReferenceString (no type): parent]
248
+
249
+ my $parent = NaturalDocs::ReferenceString->FromBinaryFile(\*CLASS_HIERARCHY_FILEHANDLE,
250
+ ::BINARYREF_NOTYPE(),
251
+ ::REFERENCE_CH_PARENT());
252
+
253
+ for (;;)
254
+ {
255
+ # [UInt32: file index or 0]
256
+
257
+ read(CLASS_HIERARCHY_FILEHANDLE, $raw, 4);
258
+ my $fileIndex = unpack('N', $raw);
259
+
260
+ if ($fileIndex == 0)
261
+ { last; }
262
+
263
+ $self->AddParentReference( $files[$fileIndex - 1], $class, $parent );
264
+ };
265
+
266
+ $numberOfParents--;
267
+ };
268
+ };
269
+
270
+ close(CLASS_HIERARCHY_FILEHANDLE);
271
+ };
272
+
273
+ $dontRebuildFiles = undef;
274
+ };
275
+
276
+
277
+ #
278
+ # Function: Save
279
+ #
280
+ # Saves the class hierarchy to disk.
281
+ #
282
+ sub Save
283
+ {
284
+ my ($self) = @_;
285
+
286
+ open (CLASS_HIERARCHY_FILEHANDLE, '>' . NaturalDocs::Project->DataFile('ClassHierarchy.nd'))
287
+ or die "Couldn't save " . NaturalDocs::Project->DataFile('ClassHierarchy.nd') . ".\n";
288
+
289
+ binmode(CLASS_HIERARCHY_FILEHANDLE);
290
+
291
+ print CLASS_HIERARCHY_FILEHANDLE '' . ::BINARY_FORMAT();
292
+ NaturalDocs::Version->ToBinaryFile(\*CLASS_HIERARCHY_FILEHANDLE, NaturalDocs::Settings->AppVersion());
293
+
294
+ while (my ($class, $classObject) = each %classes)
295
+ {
296
+ if ($classObject->IsDefined())
297
+ {
298
+ # [SymbolString: class or undef to end]
299
+
300
+ NaturalDocs::SymbolString->ToBinaryFile(\*CLASS_HIERARCHY_FILEHANDLE, $class);
301
+
302
+ # [UInt32: number of files]
303
+
304
+ my @definitions = $classObject->Definitions();
305
+ my %definitionIndexes;
306
+
307
+ print CLASS_HIERARCHY_FILEHANDLE pack('N', scalar @definitions);
308
+
309
+ for (my $i = 0; $i < scalar @definitions; $i++)
310
+ {
311
+ # [AString16: file]
312
+ print CLASS_HIERARCHY_FILEHANDLE pack('nA*', length($definitions[$i]), $definitions[$i]);
313
+ $definitionIndexes{$definitions[$i]} = $i + 1;
314
+ };
315
+
316
+ # [UInt8: number of parents]
317
+
318
+ my @parents = $classObject->ParentReferences();
319
+ print CLASS_HIERARCHY_FILEHANDLE pack('C', scalar @parents);
320
+
321
+ foreach my $parent (@parents)
322
+ {
323
+ # [ReferenceString (no type): parent]
324
+
325
+ NaturalDocs::ReferenceString->ToBinaryFile(\*CLASS_HIERARCHY_FILEHANDLE, $parent, ::BINARYREF_NOTYPE());
326
+
327
+ # [UInt32: file index]
328
+
329
+ my @parentDefinitions = $classObject->ParentReferenceDefinitions($parent);
330
+
331
+ foreach my $parentDefinition (@parentDefinitions)
332
+ {
333
+ print CLASS_HIERARCHY_FILEHANDLE pack('N', $definitionIndexes{$parentDefinition});
334
+ };
335
+
336
+ # [UInt32: 0]
337
+ print CLASS_HIERARCHY_FILEHANDLE pack('N', 0);
338
+ };
339
+ };
340
+ };
341
+
342
+ # [SymbolString: class or undef to end]
343
+
344
+ NaturalDocs::SymbolString->ToBinaryFile(\*CLASS_HIERARCHY_FILEHANDLE, undef);
345
+
346
+ close(CLASS_HIERARCHY_FILEHANDLE);
347
+ };
348
+
349
+
350
+ #
351
+ # Function: Purge
352
+ #
353
+ # Purges the hierarchy of files that no longer have Natural Docs content.
354
+ #
355
+ sub Purge
356
+ {
357
+ my ($self) = @_;
358
+
359
+ my $filesToPurge = NaturalDocs::Project->FilesToPurge();
360
+
361
+ foreach my $file (keys %$filesToPurge)
362
+ {
363
+ $self->DeleteFile($file);
364
+ };
365
+ };
366
+
367
+
368
+
369
+ ###############################################################################
370
+ # Group: Interface Functions
371
+
372
+
373
+ #
374
+ # Function: OnInterpretationChange
375
+ #
376
+ # Called by <NaturalDocs::SymbolTable> whenever a class hierarchy reference's intepretation changes, meaning it switched
377
+ # from one symbol to another.
378
+ #
379
+ # reference - The <ReferenceString> whose current interpretation changed.
380
+ #
381
+ sub OnInterpretationChange #(reference)
382
+ {
383
+ my ($self, $reference) = @_;
384
+
385
+ if (NaturalDocs::ReferenceString->TypeOf($reference) == ::REFERENCE_CH_PARENT())
386
+ {
387
+ # The approach here is simply to completely delete the reference and readd it. This is less than optimal efficiency, since it's
388
+ # being removed and added from %files too, even though that isn't required. However, the simpler code is worth it
389
+ # considering this will only happen when a parent reference becomes defined or undefined, or on the rare languages (like C#)
390
+ # that allow relative parent references.
391
+
392
+ my $oldTargetSymbol = $parentReferences{$reference};
393
+ my $oldTargetObject = $classes{$oldTargetSymbol};
394
+
395
+ my @classesWithReferenceParent = $oldTargetObject->Children();
396
+
397
+ # Each entry is an arrayref of file names. Indexes are the same as classesWithReferenceParent's.
398
+ my @filesDefiningReferenceParent;
399
+
400
+ foreach my $classWithReferenceParent (@classesWithReferenceParent)
401
+ {
402
+ my $fileList = [ $classes{$classWithReferenceParent}->ParentReferenceDefinitions($reference) ];
403
+ push @filesDefiningReferenceParent, $fileList;
404
+
405
+ foreach my $fileDefiningReferenceParent (@$fileList)
406
+ {
407
+ $self->DeleteParentReference($fileDefiningReferenceParent, $classWithReferenceParent, $reference);
408
+ };
409
+ };
410
+
411
+
412
+ # This will force the reference to be reinterpreted on the next add.
413
+
414
+ delete $parentReferences{$reference};
415
+
416
+
417
+ # Now we can just readd it.
418
+
419
+ for (my $i = 0; $i < scalar @classesWithReferenceParent; $i++)
420
+ {
421
+ foreach my $file (@{$filesDefiningReferenceParent[$i]})
422
+ {
423
+ $self->AddParentReference($file, $classesWithReferenceParent[$i], $reference);
424
+ };
425
+ };
426
+ };
427
+
428
+ # The only way for a REFERENCE_CH_CLASS reference to change is if the symbol is deleted. That will be handled by
429
+ # <AnalyzeChanges()>, so we don't need to do anything here.
430
+ };
431
+
432
+
433
+ #
434
+ # Function: OnTargetSymbolChange
435
+ #
436
+ # Called by <NaturalDocs::SymbolTable> whenever a class hierarchy reference's target symbol changes, but the reference
437
+ # still resolves to the same symbol.
438
+ #
439
+ # Parameters:
440
+ #
441
+ # reference - The <ReferenceString> that was affected by the change.
442
+ #
443
+ sub OnTargetSymbolChange #(reference)
444
+ {
445
+ my ($self, $reference) = @_;
446
+
447
+ my $type = NaturalDocs::ReferenceString->TypeOf($reference);
448
+ my $class;
449
+
450
+ if ($type == ::REFERENCE_CH_PARENT())
451
+ { $class = $parentReferences{$reference}; }
452
+ else # ($type == ::REFERENCE_CH_CLASS())
453
+ {
454
+ # Class references are global absolute, so we can just yank the symbol.
455
+ (undef, $class, undef, undef, undef, undef) = NaturalDocs::ReferenceString->InformationOf($reference);
456
+ };
457
+
458
+ $self->RebuildFilesFor($class, 1, 0, 1);
459
+ };
460
+
461
+
462
+
463
+ ###############################################################################
464
+ # Group: Modification Functions
465
+
466
+
467
+ #
468
+ # Function: AddClass
469
+ #
470
+ # Adds a class to the hierarchy.
471
+ #
472
+ # Parameters:
473
+ #
474
+ # file - The <FileName> the class was defined in.
475
+ # class - The class <SymbolString>.
476
+ # languageName - The name of the language this applies to.
477
+ #
478
+ # Note:
479
+ #
480
+ # The file parameter must be defined when using this function externally. It may be undef for internal use only.
481
+ #
482
+ sub AddClass #(file, class, languageName)
483
+ {
484
+ my ($self, $file, $class, $languageName) = @_;
485
+
486
+ if (!exists $classes{$class})
487
+ {
488
+ $classes{$class} = NaturalDocs::ClassHierarchy::Class->New();
489
+ NaturalDocs::SymbolTable->AddReference($self->ClassReferenceOf($class, $languageName), $file)
490
+ };
491
+
492
+ if (defined $file)
493
+ {
494
+ # If this was the first definition for this class...
495
+ if ($classes{$class}->AddDefinition($file))
496
+ { $self->RebuildFilesFor($class, 1, 1, 1); };
497
+
498
+ if (!exists $files{$file})
499
+ { $files{$file} = NaturalDocs::ClassHierarchy::File->New(); };
500
+
501
+ $files{$file}->AddClass($class);
502
+
503
+ if (defined $watchedFileName)
504
+ { $watchedFile->AddClass($class); };
505
+ };
506
+ };
507
+
508
+
509
+ #
510
+ # Function: AddParentReference
511
+ #
512
+ # Adds a class-parent relationship to the hierarchy. The classes will be created if they don't already exist.
513
+ #
514
+ # Parameters:
515
+ #
516
+ # file - The <FileName> the reference was defined in.
517
+ # class - The class <SymbolString>.
518
+ # symbol - The parent class <SymbolString>.
519
+ # scope - The package <SymbolString> that the reference appeared in.
520
+ # using - An arrayref of package <SymbolStrings> that the reference has access to via "using" statements.
521
+ # resolvingFlags - Any <Resolving Flags> to be used when resolving the reference.
522
+ #
523
+ # Alternate Parameters:
524
+ #
525
+ # file - The <FileName> the reference was defined in.
526
+ # class - The class <SymbolString>.
527
+ # reference - The parent <ReferenceString>.
528
+ #
529
+ sub AddParentReference #(file, class, symbol, scope, using, resolvingFlags) or (file, class, reference)
530
+ {
531
+ my ($self, $file, $class, $symbol, $parentReference);
532
+
533
+ if (scalar @_ == 7)
534
+ {
535
+ my ($scope, $using, $resolvingFlags);
536
+ ($self, $file, $class, $symbol, $scope, $using, $resolvingFlags) = @_;
537
+
538
+ $parentReference = NaturalDocs::ReferenceString->MakeFrom(::REFERENCE_CH_PARENT(), $symbol,
539
+ NaturalDocs::Languages->LanguageOf($file)->Name(),
540
+ $scope, $using, $resolvingFlags);
541
+ }
542
+ else
543
+ {
544
+ ($self, $file, $class, $parentReference) = @_;
545
+ $symbol = (NaturalDocs::ReferenceString->InformationOf($parentReference))[1];
546
+ };
547
+
548
+
549
+ # In case it doesn't already exist.
550
+ $self->AddClass($file, $class);
551
+
552
+ my $parent;
553
+ if (exists $parentReferences{$parentReference})
554
+ {
555
+ $parent = $parentReferences{$parentReference};
556
+ }
557
+ else
558
+ {
559
+ NaturalDocs::SymbolTable->AddReference($parentReference, $file);
560
+ my $parentTarget = NaturalDocs::SymbolTable->References($parentReference);
561
+
562
+ if (defined $parentTarget)
563
+ { $parent = $parentTarget->Symbol(); }
564
+ else
565
+ { $parent = $symbol; };
566
+
567
+ # In case it doesn't already exist.
568
+ $self->AddClass(undef, $parent);
569
+
570
+ $parentReferences{$parentReference} = $parent;
571
+ };
572
+
573
+
574
+ # If this defined a new parent...
575
+ if ($classes{$class}->AddParentReference($parentReference, $file, \%parentReferences))
576
+ {
577
+ $classes{$parent}->AddChild($class);
578
+
579
+ $self->RebuildFilesFor($class, 0, 1, 0);
580
+ $self->RebuildFilesFor($parent, 0, 1, 0);
581
+ };
582
+
583
+ $files{$file}->AddParentReference($class, $parentReference);
584
+
585
+ if (defined $watchedFileName)
586
+ { $watchedFile->AddParentReference($class, $parentReference); };
587
+ };
588
+
589
+
590
+ #
591
+ # Function: WatchFileForChanges
592
+ #
593
+ # Watches a file for changes, which can then be applied by <AnalyzeChanges()>. Definitions are not deleted via a DeleteClass()
594
+ # function. Instead, a file is watched for changes, reparsed, and then a comparison is made to look for definitions that
595
+ # disappeared and any other relevant changes.
596
+ #
597
+ # Parameters:
598
+ #
599
+ # file - The <FileName> to watch.
600
+ #
601
+ sub WatchFileForChanges #(file)
602
+ {
603
+ my ($self, $file) = @_;
604
+
605
+ $watchedFile = NaturalDocs::ClassHierarchy::File->New();
606
+ $watchedFileName = $file;
607
+ };
608
+
609
+
610
+ #
611
+ # Function: AnalyzeChanges
612
+ #
613
+ # Checks the watched file for any changes that occured since the last time is was parsed, and updates the hierarchy as
614
+ # necessary. Also sends any files that are affected to <NaturalDocs::Project->RebuildFile()>.
615
+ #
616
+ sub AnalyzeChanges
617
+ {
618
+ my ($self) = @_;
619
+
620
+ # If the file didn't have any classes before, and it still doesn't, it wont be in %files.
621
+ if (exists $files{$watchedFileName})
622
+ {
623
+ my @originalClasses = $files{$watchedFileName}->Classes();
624
+
625
+ foreach my $originalClass (@originalClasses)
626
+ {
627
+ # If the class isn't there the second time around...
628
+ if (!$watchedFile->HasClass($originalClass))
629
+ { $self->DeleteClass($watchedFileName, $originalClass); }
630
+
631
+ else
632
+ {
633
+ my @originalParents = $files{$watchedFileName}->ParentReferencesOf($originalClass);
634
+
635
+ foreach my $originalParent (@originalParents)
636
+ {
637
+ # If the parent reference wasn't there the second time around...
638
+ if (!$watchedFile->HasParentReference($originalClass, $originalParent))
639
+ { $self->DeleteParentReference($watchedFileName, $originalClass, $originalParent); };
640
+ };
641
+ };
642
+ };
643
+ };
644
+
645
+
646
+ $watchedFile = undef;
647
+ $watchedFileName = undef;
648
+ };
649
+
650
+
651
+
652
+ ###############################################################################
653
+ # Group: Information Functions
654
+
655
+
656
+ #
657
+ # Function: ParentsOf
658
+ # Returns a <SymbolString> array of the passed class' parents, or an empty array if none. Note that not all of them may be
659
+ # defined.
660
+ #
661
+ sub ParentsOf #(class)
662
+ {
663
+ my ($self, $class) = @_;
664
+
665
+ if (exists $classes{$class})
666
+ { return $classes{$class}->Parents(); }
667
+ else
668
+ { return ( ); };
669
+ };
670
+
671
+ #
672
+ # Function: ChildrenOf
673
+ # Returns a <SymbolString> array of the passed class' children, or an empty array if none. Note that not all of them may be
674
+ # defined.
675
+ #
676
+ sub ChildrenOf #(class)
677
+ {
678
+ my ($self, $class) = @_;
679
+
680
+ if (exists $classes{$class})
681
+ { return $classes{$class}->Children(); }
682
+ else
683
+ { return ( ); };
684
+ };
685
+
686
+
687
+
688
+ ###############################################################################
689
+ # Group: Support Functions
690
+
691
+
692
+ #
693
+ # Function: DeleteFile
694
+ #
695
+ # Deletes a file and everything defined in it.
696
+ #
697
+ # Parameters:
698
+ #
699
+ # file - The <FileName>.
700
+ #
701
+ sub DeleteFile #(file)
702
+ {
703
+ my ($self, $file) = @_;
704
+
705
+ if (!exists $files{$file})
706
+ { return; };
707
+
708
+ my @classes = $files{$file}->Classes();
709
+ foreach my $class (@classes)
710
+ {
711
+ $self->DeleteClass($file, $class);
712
+ };
713
+
714
+ delete $files{$file};
715
+ };
716
+
717
+ #
718
+ # Function: DeleteClass
719
+ #
720
+ # Deletes a class definition from a file. Will also delete any parent references from this class and file. Will rebuild any file
721
+ # affected unless <dontRebuildFiles> is set.
722
+ #
723
+ # Parameters:
724
+ #
725
+ # file - The <FileName> that defines the class.
726
+ # class - The class <SymbolString>.
727
+ #
728
+ sub DeleteClass #(file, class)
729
+ {
730
+ my ($self, $file, $class) = @_;
731
+
732
+ my @parents = $files{$file}->ParentReferencesOf($class);
733
+ foreach my $parent (@parents)
734
+ {
735
+ $self->DeleteParentReference($file, $class, $parent);
736
+ };
737
+
738
+ $files{$file}->DeleteClass($class);
739
+
740
+ # If we're deleting the last definition of this class.
741
+ if ($classes{$class}->DeleteDefinition($file))
742
+ {
743
+ if (!$classes{$class}->HasChildren())
744
+ {
745
+ delete $classes{$class};
746
+
747
+ if (!$dontRebuildFiles)
748
+ { NaturalDocs::Project->RebuildFile($file); };
749
+ }
750
+ else
751
+ { $self->RebuildFilesFor($class, 0, 1, 1); };
752
+
753
+ };
754
+ };
755
+
756
+
757
+ #
758
+ # Function: DeleteParentReference
759
+ #
760
+ # Deletes a class' parent reference and returns whether it resulted in the loss of a parent class. Will rebuild any file affected
761
+ # unless <dontRebuildFiles> is set.
762
+ #
763
+ # Parameters:
764
+ #
765
+ # file - The <FileName> that defines the reference.
766
+ # class - The class <SymbolString>.
767
+ # reference - The parent <ReferenceString>.
768
+ #
769
+ # Returns:
770
+ #
771
+ # If the class lost a parent as a result of this, it will return its <SymbolString>. It will return undef otherwise.
772
+ #
773
+ sub DeleteParentReference #(file, class, reference)
774
+ {
775
+ my ($self, $file, $class, $reference) = @_;
776
+
777
+ if (!exists $classes{$class})
778
+ { return; };
779
+
780
+ $files{$file}->DeleteParentReference($class, $reference);
781
+
782
+ my $deletedParent = $classes{$class}->DeleteParentReference($reference, $file, \%parentReferences);
783
+
784
+ if (defined $deletedParent)
785
+ {
786
+ my $deletedParentObject = $classes{$deletedParent};
787
+
788
+ $deletedParentObject->DeleteChild($class);
789
+
790
+ $self->RebuildFilesFor($deletedParent, 0, 1, 0);
791
+ $self->RebuildFilesFor($class, 0, 1, 0);
792
+
793
+ if (!$deletedParentObject->HasChildren() && !$deletedParentObject->IsDefined())
794
+ {
795
+ delete $classes{$deletedParent};
796
+ NaturalDocs::SymbolTable->DeleteReference(
797
+ $self->ClassReferenceOf($class, NaturalDocs::Languages->LanguageOf($file)->Name()) );
798
+ };
799
+
800
+ return $deletedParent;
801
+ };
802
+
803
+ return undef;
804
+ };
805
+
806
+
807
+ #
808
+ # Function: ClassReferenceOf
809
+ #
810
+ # Returns the <REFERENCE_CH_CLASS> <ReferenceString> of the passed class <SymbolString>.
811
+ #
812
+ sub ClassReferenceOf #(class, languageName)
813
+ {
814
+ my ($self, $class, $languageName) = @_;
815
+
816
+ return NaturalDocs::ReferenceString->MakeFrom(::REFERENCE_CH_CLASS(), $class, $languageName, undef, undef,
817
+ ::RESOLVE_ABSOLUTE() | ::RESOLVE_NOPLURAL());
818
+ };
819
+
820
+
821
+ #
822
+ # Function: RebuildFilesFor
823
+ #
824
+ # Calls <NaturalDocs::Project->RebuildFile()> for every file defining the passed class, its parents, and/or its children.
825
+ # Returns without doing anything if <dontRebuildFiles> is set.
826
+ #
827
+ # Parameters:
828
+ #
829
+ # class - The class <SymbolString>.
830
+ # rebuildParents - Whether to rebuild the class' parents.
831
+ # rebuildSelf - Whether to rebuild the class.
832
+ # rebuildChildren - Whether to rebuild the class' children.
833
+ #
834
+ sub RebuildFilesFor #(class, rebuildParents, rebuildSelf, rebuildChildren)
835
+ {
836
+ my ($self, $class, $rebuildParents, $rebuildSelf, $rebuildChildren) = @_;
837
+
838
+ if ($dontRebuildFiles)
839
+ { return; };
840
+
841
+ my @classesToBuild;
842
+
843
+ if ($rebuildParents)
844
+ { @classesToBuild = $classes{$class}->Parents(); };
845
+ if ($rebuildSelf)
846
+ { push @classesToBuild, $class; };
847
+ if ($rebuildChildren)
848
+ { push @classesToBuild, $classes{$class}->Children(); };
849
+
850
+ foreach my $classToBuild (@classesToBuild)
851
+ {
852
+ my @definitions = $classes{$classToBuild}->Definitions();
853
+
854
+ foreach my $definition (@definitions)
855
+ { NaturalDocs::Project->RebuildFile($definition); };
856
+ };
857
+ };
858
+
859
+
860
+ 1;