3 * Analyses a modulegroup.
\r
5 * @version $Id: PhpdocModuleAnalyser.php,v 1.4 2000/12/03 22:37:36 uw Exp $
\r
7 class PhpdocModuleAnalyser extends PhpdocAnalyser {
\r
13 var $modulegroup = array();
\r
16 * List of all modules in the modulegroup
\r
19 var $modulelist = array();
\r
22 * Puuuh - findUndocumented() needs this.
\r
24 * @see findUndocumented()
\r
26 var $undocumentedFields = array(
\r
27 "functions" => "function",
\r
28 "uses" => "included file",
\r
29 "consts" => "constant"
\r
33 * Sets the data of the modulegroup to analyse.
\r
35 * @param array Raw modulegroup data from the parser.
\r
38 function setModulegroup($modulegroup) {
\r
40 $this->modulegroup = $modulegroup;
\r
42 } // end func setModulegroup
\r
44 function analyse() {
\r
46 $this->flag_get = false;
\r
48 $this->buildModulelist();
\r
50 $this->updateAccessReturn();
\r
51 $this->updateBrothersSisters();
\r
54 $this->checkFunctionArgs();
\r
55 $this->findUndocumented();
\r
57 } // end func analyse
\r
60 * Returns a module from the modulegroup or false if there are no more modules.
\r
62 * @return mixed False if there no more modules in the modulegroup otherwise
\r
63 * an array with the data of a module.
\r
66 function getModule() {
\r
68 if (!$this->flag_get) {
\r
69 reset($this->modulelist);
\r
70 $this->flag_get = true;
\r
73 if (list($modulename, $group) = each($this->modulelist)) {
\r
75 $module = $this->modulegroup[$group][$modulename];
\r
76 unset($this->modulegroup[$group][$modulename]);
\r
85 } // end func getModule
\r
87 function findUndocumented() {
\r
89 reset($this->modulegroup);
\r
90 while (list($group, $modules) = each($this->modulegroup)) {
\r
93 while (list($name, $module) = each($modules)) {
\r
95 reset($this->undocumentedFields);
\r
96 while (list($index, $eltype) = each($this->undocumentedFields)) {
\r
97 if (!isset($module[$index]))
\r
100 $file = $module["filename"];
\r
102 reset($module[$index]);
\r
103 while (list($elname, $data) = each($module[$index]))
\r
104 if (isset($data["undoc"]) && $data["undoc"])
\r
105 $this->warn->addDocWarning($file, $eltype, $elname, "Undocumented element.", "missing");
\r
112 } // end func findUndocumented
\r
114 function checkFunctionArgs() {
\r
116 reset($this->modulegroup);
\r
117 while (list($group, $modules) = each($this->modulegroup)) {
\r
120 while (list($name, $module) = each($modules)) {
\r
121 if (!isset($module["functions"]))
\r
124 $file = $module["filename"];
\r
126 reset($module["functions"]);
\r
127 while (list($fname, $function) = each($module["functions"])) {
\r
128 $this->modulegroup[$group][$name]["functions"][$fname]["params"] = $this->checkArgDocs($function["args"], $function["params"], $fname, $file, false);
\r
129 unset($this->modulegroup[$group][$name]["functions"][$fname]["args"]);
\r
136 } // end func checkFunctionArgs
\r
139 * Builds an internal list of all modules in the modulegroup.
\r
140 * @see $modulelist, $modulegroup
\r
142 function buildModulelist() {
\r
144 $this->modulelist = array();
\r
146 reset($this->modulegroup);
\r
147 while (list($group, $modules) = each($this->modulegroup)) {
\r
150 while (list($modulename, $data) = each($modules))
\r
151 $this->modulelist[$modulename] = $group;
\r
158 function updateBrothersSisters() {
\r
160 reset($this->modulelist);
\r
161 while (list($modulename, $group) = each($this->modulelist)) {
\r
162 $this->updateBrotherSisterElements($group, $modulename, "functions");
\r
163 $this->updateBrotherSisterElements($group, $modulename, "variables");
\r
166 } // end func updateBrothersSisters
\r
169 * @param string Modulegroupname
\r
170 * @param string Modulename
\r
171 * @param string Elementtype: functions, variables.
\r
174 function updateBrotherSisterElements($group, $modulename, $type) {
\r
176 if (!isset($this->modulegroup[$group][$modulename][$type]))
\r
179 reset($this->modulegroup[$group][$modulename][$type]);
\r
180 while (list($elementname, $data) = each($this->modulegroup[$group][$modulename][$type])) {
\r
182 if (isset($data["brother"])) {
\r
184 $name = ("functions" == $type) ? substr($data["brother"], 0, -2) : substr($data["brother"], 1);
\r
185 $name = strtolower($name);
\r
187 if (!isset($this->modulegroup[$group][$modulename][$type][$name])) {
\r
189 $this->warn->addDocWarning($this->modulegroup[$group][$modulename]["filename"], $type, $elementname, "Brother '$name' is unknown. Tags gets ignored.", "mismatch");
\r
190 unset($this->modulegroup[$group][$modulename][$type][$elementname]["brother"]);
\r
194 $this->modulegroup[$group][$modulename][$type][$elementname]["brother"] = $name;
\r
195 $this->modulegroup[$group][$modulename][$type][$elementname] = $this->copyBrotherSisterFields($this->modulegroup[$group][$modulename][$type][$elementname], $this->modulegroup[$group][$modulename][$type][$name]);
\r
203 } // end func updateBrotherSistersElements
\r
205 function updateAccessReturn() {
\r
207 reset($this->modulelist);
\r
208 while (list($modulename, $group) = each($this->modulelist)) {
\r
210 if (!isset($this->modulegroup[$group][$modulename]["access"]))
\r
211 $this->modulegroup[$group][$modulename]["access"] = "private";
\r
213 $this->updateAccessReturnElements($group, $modulename, "functions");
\r
214 $this->updateAccessReturnElements($group, $modulename, "variables");
\r
215 $this->updateAccessElements($group, $modulename, "consts");
\r
219 } // end func updateAccessReturn
\r
222 * @param string Modulegroup
\r
223 * @param string Modulename
\r
224 * @param string Elementtype: functions, variables, consts.
\r
227 function updateAccessReturnElements($group, $modulename, $type) {
\r
229 if (!isset($this->modulegroup[$group][$modulename][$type]))
\r
232 reset($this->modulegroup[$group][$modulename][$type]);
\r
233 while (list($elementname, $data) = each($this->modulegroup[$group][$modulename][$type])) {
\r
235 if (!isset($data["access"]))
\r
236 $this->modulegroup[$group][$modulename][$type][$elementname]["access"] = "private";
\r
238 if (!isset($data["return"]))
\r
239 $this->modulegroup[$group][$modulename][$type][$elementname]["return"] = "void";
\r
243 } // end func updateAccessReturnElements
\r
246 * @param string Modulegroup
\r
247 * @param string Modulename
\r
248 * @param string Elementtype: functions, variables, consts.
\r
251 function updateAccessElements($group, $modulename, $type) {
\r
253 if (!isset($this->modulegroup[$group][$modulename][$type]))
\r
256 reset($this->modulegroup[$group][$modulename][$type]);
\r
257 while (list($elementname, $data) = each($this->modulegroup[$group][$modulename][$type])) {
\r
259 if (!isset($data["access"]))
\r
260 $this->modulegroup[$group][$modulename][$type][$elementname]["access"] = "private";
\r
264 } // end func updateAccessElements
\r
266 function checkSee() {
\r
268 reset($this->modulegroup);
\r
269 while (list($group, $modules) = each($this->modulegroup)) {
\r
271 while (list($modulename, $module) = each($modules)) {
\r
273 $this->buildElementlist($group, $modulename);
\r
275 if (isset($module["functions"]))
\r
276 $this->checkSeeElements($module["functions"], $group, $modulename, "functions");
\r
278 if (isset($module["variables"]))
\r
279 $this->checkSeeElements($module["variables"], $group, $modulename, "variables");
\r
281 if (isset($module["consts"]))
\r
282 $this->checkSeeElements($module["consts"], $group, $modulename, "consts");
\r
284 if (isset($module["uses"]))
\r
285 $this->checkSeeElements($module["uses"], $group, $modulename, "uses");
\r
291 } // end func checkSee
\r
294 * Checks see references in the given element array (functions, variables...)
\r
296 * References to variables and functions within the same module get checked.
\r
297 * It the references element does not exist, the reference gets deleted and
\r
298 * a doc warning gets generated.
\r
300 * @param array List of functions, variables,...
\r
301 * @param string Name of the modulegroup that contains the given elements.
\r
302 * @param string Name of the module that contains the given elements.
\r
303 * @param string Elementtype: functions, variables, consts, uses.
\r
305 function checkSeeElements($elements, $modulegroup, $modulename, $eltype) {
\r
308 while (list($elname, $element) = each($elements)) {
\r
310 if (isset($element["see"])) {
\r
312 if (isset($element["see"]["var"])) {
\r
314 reset($element["see"]["var"]);
\r
315 while (list($k, $variable) = each($element["see"]["var"]))
\r
316 if (!isset($this->elementlist["variables"][strtolower($variable["name"])])) {
\r
317 $this->warn->addDocWarning($this->modulegroup[$modulegroup][$modulename]["filename"], "variables", $elname, "@see referrs to the variable '" . $variable["name"] . "' which is not defined in the class. Entry gets ignored.", "mismatch");
\r
318 unset($this->modulegroup[$modulegroup][$modulename][$eltype][$elname]["see"]["var"][$k]);
\r
323 if (isset($element["see"]["function"])) {
\r
325 reset($element["see"]["function"]);
\r
326 while (list($k, $function) = each($element["see"]["function"]))
\r
327 if (!isset($this->elementlist["functions"][strtolower(substr($function["name"], 0, -2))])) {
\r
328 $this->warn->addDocWarning($this->modulegroup[$modulename]["filename"], "functions", $elname, "@see referrs to the function '" . $function["name"] . "' which is not defined in the class. Entry gets ignored.", "mismatch");
\r
329 unset($this->modulegroup[$modulegroup][$modulename][$eltype][$elname]["see"]["function"][$k]);
\r
338 } // end func checkSeeElement
\r
341 * Builds an array with all elements of a class and saves it to $this->elementlist.
\r
343 * @param string Name of the modulegroup that contains the module.
\r
344 * @param string Name of the module to scan.
\r
346 function buildElementlist($modulegroup, $modulename) {
\r
348 $elements = array();
\r
349 $fields = array("functions", "variables", "consts", "uses");
\r
352 while (list($k, $field) = each($fields))
\r
353 if (isset($this->modulegroup[$modulegroup][$modulename][$field])) {
\r
355 reset($this->modulegroup[$modulegroup][$modulename][$field]);
\r
356 while (list($element, ) = each($this->modulegroup[$modulegroup][$modulename][$field]))
\r
357 $elements[$field][$element] = true;
\r
361 $this->elementlist = $elements;
\r
363 } // end func buildElementlist
\r
365 } // end class PhpdocModuleAnalyser
\r