+++ /dev/null
-<?php\r
-/**\r
-* Analyses a class.\r
-* \r
-* @version $Id: PhpdocClassAnalyser.php,v 1.4 2000/12/03 22:37:36 uw Exp $\r
-*/\r
-class PhpdocClassAnalyser extends PhpdocAnalyser {\r
-\r
- /**\r
- * Class data.\r
- *\r
- * @var array\r
- */\r
- var $classes = array();\r
- \r
- /**\r
- * Name of the baseclass of the given classes.\r
- *\r
- * @var string \r
- */\r
- var $baseclass = "";\r
- \r
- /**\r
- * Ordered list of all classes.\r
- *\r
- * @var array\r
- */ \r
- var $classlist = array();\r
- \r
- /**\r
- * List of not inherited elements.\r
- *\r
- * @var array\r
- */\r
- var $notinherited = array(\r
- "class" => array(\r
- "name" => true,\r
- "extends" => true,\r
- "undoc" => true,\r
- "variables" => true,\r
- "functions" => true,\r
- "consts" => true,\r
- "uses" => true,\r
- "filename" => true,\r
- "subclasses"=> true,\r
- "path" => true,\r
- "baseclass" => true,\r
- "abstract" => true\r
- ),\r
- \r
- "functions" => array(\r
- "name" => true,\r
- "undoc" => true,\r
- "inherited" => true,\r
- "overrides" => true,\r
- "abstract" => true\r
- ),\r
- \r
- "variables" => array(\r
- "name" => true,\r
- "undoc" => true,\r
- "inherited" => true,\r
- "overrides" => true,\r
- "abstract" => true\r
- ), \r
- \r
- "uses" => array(\r
- "name" => true,\r
- "undoc" => true,\r
- "inherited" => true,\r
- "overrides" => true\r
- ), \r
- \r
- "consts" => array(\r
- "name" => true,\r
- "undoc" => true,\r
- "inherited" => true,\r
- "overrides" => true\r
- ) \r
- );\r
- \r
-\r
- /**\r
- * Puuuh - findUndocumented() needs this.\r
- *\r
- * @var array\r
- * @see findUndocumented()\r
- */ \r
- var $undocumentedFields = array(\r
- "functions" => "function",\r
- "variables" => "variable",\r
- "uses" => "included file",\r
- "consts" => "constant"\r
- );\r
-\r
- /**\r
- * Sets the class data and the name of the baseclass.\r
- *\r
- * @param array Raw class data from the parser\r
- * @param string Name of the baseclass of the given classes\r
- * @access public\r
- */ \r
- function setClasses($classes, $baseclass) {\r
- \r
- $this->classes = $classes;\r
- $this->baseclass = $baseclass;\r
- \r
- } // end func setClasses\r
- \r
- function analyse() {\r
- \r
- $this->flag_get = false;\r
-\r
- $this->updateAccessReturn();\r
- $this->updateBrothersSisters();\r
- $this->checkSee();\r
- \r
- $this->classlist = array();\r
- \r
- $this->buildBottomUpClasslist($this->baseclass);\r
- \r
- } // end func analyse\r
-\r
- /**\r
- * Returns an analysed class or false if there're no classes any more.\r
- *\r
- * @return mixed False if there no classes anymore, otherwise an array with \r
- * the data of the class.\r
- * @access public\r
- */ \r
- function getClass() {\r
- \r
- if (!$this->flag_get) {\r
- reset($this->classlist);\r
- $this->flag_get = true;\r
- }\r
- if (list($k, $classname)=each($this->classlist)) {\r
-\r
- if (isset($this->classes[$classname]["path"]))\r
- $this->inheritClassElements($classname); \r
- \r
- $this->checkFunctionArgs($classname);\r
- $this->findUndocumented($classname);\r
- \r
- $class = $this->classes[$classname];\r
- unset($this->classes[$classname]);\r
- return $class;\r
- \r
- } else {\r
- \r
- return false;\r
- \r
- }\r
- } // end func getClass\r
-\r
- /**\r
- * Looks for undocumented elements in a certain class\r
- * \r
- * @param string Classname\r
- */\r
- function findUndocumented($classname) {\r
- \r
- $file = $this->classes["filename"];\r
- if ($this->classes["undoc"])\r
- $this->warn->addDocWarning($file, "class", $name, "The class is not documented.", "missing");\r
- \r
- reset($this->undocumentedFields);\r
- while (list($index, $eltype)=each($this->undocumentedFields)) {\r
- if (!isset($this->classes[$index]))\r
- continue;\r
- \r
- reset($this->classes[$index]);\r
- while (list($elname, $data)=each($this->classes[$index]))\r
- if (isset($data["undoc"]) && $data["undoc"])\r
- $this->warn->addDocWarning($file, $eltype, $elname, "Undocumented element.", "missing");\r
- \r
- }\r
- \r
- } // end func findUndocumented\r
- \r
- /**\r
- * Checks the function documentation of a certain class.\r
- *\r
- * @param string Classname\r
- */\r
- function checkFunctionArgs($classname) {\r
-\r
- if (!isset($this->classes[$classname]["functions"]))\r
- return;\r
- \r
- $file = $this->classes[$classname]["filename"];\r
- \r
- reset($this->classes[$classname]["functions"]);\r
- while (list($fname, $function)=each($this->classes[$classname]["functions"])) {\r
-\r
- $inherited = isset($function["paraminherited"]); \r
- $this->classes[$classname]["functions"][$fname]["params"] = $this->checkArgDocs($function["args"], $function["params"], $fname, $file, $inherited);\r
- unset($this->classes[$classname]["functions"][$fname]["args"]);\r
-\r
- if ($inherited)\r
- unset($this->classes[$classname]["functions"][$fname]["paraminherited"]);\r
- \r
- }\r
- } // end func checkFunctionArgs\r
- \r
- /**\r
- * Builds an internal list of all classes.\r
- * \r
- * The analyser needs an ordered list of all classes\r
- * to inherit information effective.\r
- * \r
- * @param string Name of the class that starts the recursive build process. \r
- * @see $classlist\r
- */\r
- function buildBottomUpClasslist($classname) {\r
- \r
- if (isset($this->classes[$classname]["subclasses"])) {\r
- \r
- reset($this->classes[$classname]["subclasses"]);\r
- while (list($subclass, $v)=each($this->classes[$classname]["subclasses"]))\r
- $this->buildBottomUpClasslist($subclass);\r
- \r
- $this->classlist[] = $classname;\r
- \r
- } else {\r
- \r
- $this->classlist[] = $classname;\r
- \r
- }\r
- } // end func buildBottomUpClasslist\r
-\r
- /**\r
- * Adds inherited elements to a class.\r
- * \r
- * @param string Classname\r
- * @return boolean $ok\r
- * @see $classes, $notinherited, addInheritedElements()\r
- */ \r
- function inheritClassElements($classname) {\r
- \r
- if (!isset($this->classes[$classname]["path"]))\r
- return false;\r
-\r
- $undoc = $this->classes[$classname]["undoc"];\r
- \r
- $path = $this->classes[$classname]["path"];\r
- reset($path);\r
- while (list($k, $parentclass)=each($path)) {\r
-\r
- $this->addInheritedElements($classname, $parentclass, "functions");\r
- $this->addInheritedElements($classname, $parentclass, "variables");\r
- $this->addInheritedElements($classname, $parentclass, "consts");\r
- $this->addInheritedElements($classname, $parentclass, "uses");\r
- \r
- reset($this->classes[$parentclass]);\r
- while (list($field, $value)=each($this->classes[$parentclass])) \r
- if (!isset($this->notinherited["class"][$field]) && !isset($this->classes[$classname][$field]))\r
- $this->classes[$classname][$field] = $value;\r
- \r
- if ($undoc && !$this->classes[$parentclass]["undoc"]) {\r
- $this->classes[$classname]["docinherited"] = true;\r
- $this->classes[$classname]["undoc"] = false;\r
- $undoc = false;\r
- }\r
- \r
- } \r
- \r
- return true;\r
- } // end func inheritClassElements\r
- \r
- /**\r
- * Adds inherited functions, variables, constants or included files to a class.\r
- * \r
- * @param string Name of the class that inherits the informations.\r
- * @param string Name of the parentclass\r
- * @param string Type of elements inherited: "functions", "variables", "uses", "consts"\r
- * @return boolean $ok\r
- * @see $classes, $notinherited, isUndocumented()\r
- */\r
- function addInheritedElements($classname, $parentclass, $type) {\r
- \r
- if (!isset($this->classes[$parentclass][$type]))\r
- return false;\r
- \r
- reset($this->classes[$parentclass][$type]);\r
- while (list($elementname, $data)=each($this->classes[$parentclass][$type])) {\r
- \r
- if (!isset($this->classes[$classname][$type][$elementname])) {\r
-\r
- $this->classes[$classname]["inherited"][$type][$parentclass][$elementname] = true; \r
-\r
- } else {\r
- \r
- $this->classes[$classname][$type][$elementname]["overrides"] = $parentclass;\r
- $this->classes[$classname][$type][$elementname]["undoc"] = $this->isUndocumented($parentclass, $type, $elementname);\r
- $this->classes[$classname]["overrides"][$type][$parentclass][$elementname] = true;\r
- \r
- reset($data);\r
- while (list($field, $value)=each($data)) {\r
- \r
- if (!isset($this->classes[$classname][$type][$elementname][$field]) && !isset($this->notinherited[$type][$field])) {\r
- $this->classes[$classname][$type][$elementname][$field] = $value;\r
- if ("params"==$field && "functions"==$type) $this->classes[$classname][$type][$elementname]["paraminherited"] = true;\r
- }\r
- \r
- }\r
- }\r
- \r
- }\r
- \r
- return true;\r
- } // end func addInheritedElements\r
-\r
- /**\r
- * Returns true if the requested element is undocumented and false if it's documented.\r
- *\r
- * The function checks if the element might inherit documentation\r
- * from any parentclass. \r
- *\r
- * @param string Name of the class of the element\r
- * @param string Element type: functions, variables, uses, consts.\r
- * @param string Element name\r
- * @return boolean $ok\r
- */ \r
- function isUndocumented($classname, $type, $elementname) {\r
-\r
- if ( !isset($this->classes[$classname][$type][$elementname]) || $this->classes[$classname][$type][$elementname]["undoc"] || !isset($this->classes[$classname]["path"]) ) \r
- return true;\r
- \r
- $path = $this->classes[$classname]["path"];\r
- while (list($k, $parentclass)=each($path))\r
- if ($this->isUndocumented($parentclass, $type, $elementname))\r
- return true;\r
- \r
- return false;\r
- } // end func isUndocumented\r
- \r
- function updateBrothersSisters() {\r
- \r
- reset($this->classes);\r
- while (list($classname, $data)=each($this->classes)) {\r
- $this->updateBrotherSisterElements($classname, "functions");\r
- $this->updateBrotherSisterElements($classname, "variables");\r
- } \r
- \r
- } // end func updateBrothersSisters\r
- \r
- /**\r
- * @param string Name of the class to update\r
- * @param string Elementtype: functions, variables, ...\r
- * @return boolean\r
- */\r
- function updateBrotherSisterElements($classname, $type) {\r
- \r
- if (!isset($this->classes[$classname][$type])) \r
- return false;\r
- \r
- reset($this->classes[$classname][$type]);\r
- while (list($elementname, $data) = each($this->classes[$classname][$type])) {\r
- \r
- if (isset($data["brother"])) {\r
-\r
- $name = ( "functions" == $type ) ? substr($data["brother"], 0, -2) : substr($data["brother"], 1);\r
- $name = strtolower($name);\r
-\r
- if (!isset($this->classes[$classname][$type][$name])) {\r
- \r
- $this->warn->addDocWarning($this->classes[$classname]["filename"], $type, $elementname, "Brother '$name' is unknown. Tags gets ignored.", "mismatch");\r
- unset($this->classes[$classname][$type][$elementname]["brother"]);\r
- \r
- } else {\r
- \r
- $this->classes[$classname][$type][$elementname]["brother"] = $name;\r
- $this->classes[$classname][$type][$elementname] = $this->copyBrotherSisterFields($this->classes[$classname][$type][$elementname], $this->classes[$classname][$type][$name]);\r
-\r
- }\r
-\r
- }\r
- \r
- }\r
- \r
- } // end func updateBrotherSisterElements\r
- \r
- function updateAccessReturn() {\r
- \r
- reset($this->classes);\r
- while (list($classname, $data)=each($this->classes)) {\r
- \r
- if (!isset($data["access"]))\r
- $this->classes[$classname]["access"] = "private";\r
- \r
- $this->updateAccessReturnElements($classname, "functions");\r
- $this->updateAccessElements($classname, "variables");\r
- $this->updateAccessElements($classname, "consts");\r
- \r
- }\r
- \r
- } // end func updateAccessReturn\r
- \r
- /**\r
- * Updates access and return for certain elements.\r
- * \r
- * This function should only be used to update functions.\r
- * Functions that have the same name as the class (constructors)\r
- * get return void and access public. Functions without \r
- * access get access public and functions without return get\r
- * return void.\r
- * \r
- * @param string Classname\r
- * @param string Element type: functions (, variables, consts, uses)\r
- * @return boolean $ok\r
- * @see updateAccessReturn()\r
- */\r
- function updateAccessReturnElements($classname, $type) {\r
- \r
- if (!isset($this->classes[$classname][$type]))\r
- return false;\r
-\r
- reset($this->classes[$classname][$type]);\r
- while (list($elementname, $data)=each($this->classes[$classname][$type])) {\r
- \r
- if (!isset($data["access"])) \r
- $this->classes[$classname][$type][$elementname]["access"] = ("functions" == $type && strtolower($elementname) == strtolower($classname)) ? "public" : "private";\r
- \r
- if (!isset($data["return"]))\r
- $this->classes[$classname][$type][$elementname]["return"] = "void";\r
- else \r
- if ("functions" == $type && $elementname == $classname) {\r
- $this->warn->addDocWarning($this->classes[$classname]["filename"], "functions", $elementname, "The constructor can't have a return value. @return gets ignored.", "mismatch");\r
- $this->classes[$classname]["functions"][$elementname]["return"] = "void";\r
- }\r
- \r
- }\r
- \r
- } // end func updateAccessReturnElements\r
- \r
- /**\r
- * Updates access tags.\r
- *\r
- * @param string Classname\r
- * @param string Element type: functions, variables, consts (, uses)\r
- * @see updateAccessReturnElements()\r
- */\r
- function updateAccessElements($classname, $type) {\r
- \r
- if (!isset($this->classes[$classname][$type]))\r
- return false;\r
- \r
- reset($this->classes[$classname][$type]);\r
- while (list($elementname, $data)=each($this->classes[$classname][$type])) {\r
- \r
- if (!isset($data["access"])) \r
- $this->classes[$classname][$type][$elementname]["access"] = ("functions" == $type && $elementname == $classname) ? "public" : "private";\r
- \r
- }\r
- \r
- } // end func updateAccessElements\r
- \r
- function checkSee() {\r
- \r
- reset($this->classes);\r
- while (list($classname, $class) = each($this->classes)) {\r
- \r
- $this->buildElementlist($classname);\r
- \r
- if (isset($class["functions"])) \r
- $this->checkSeeElements($class["functions"], $classname, "functions");\r
- \r
- if (isset($class["variables"]))\r
- $this->checkSeeElements($class["variables"], $classname, "variables");\r
- \r
- if (isset($class["consts"])) \r
- $this->checkSeeElements($class["consts"], $classname, "consts");\r
- \r
- if (isset($class["uses"]))\r
- $this->checkSeeElements($class["uses"], $classname, "uses");\r
- \r
- }\r
- \r
- } // end func checkSee\r
-\r
- /**\r
- * Checks see references in the given element array (functions, variables...)\r
- *\r
- * References to variables and functions within the same class get checked.\r
- * It the references element does not exist, the reference gets deleted and \r
- * a doc warning gets generated.\r
- * \r
- * @param array List of functions, variables,...\r
- * @param string Name of the class that contains the given elements.\r
- * @param string Elementtype: functions, variables, consts, uses.\r
- */ \r
- function checkSeeElements($elements, $classname, $eltype) {\r
- \r
- reset($elements);\r
- while (list($elname, $element) = each($elements)) {\r
- \r
- if (isset($element["see"])) {\r
- \r
- if (isset($element["see"]["var"])) {\r
- \r
- reset($element["see"]["var"]);\r
- while (list($k, $variable) = each($element["see"]["var"])) \r
- if (!isset($this->elementlist["variables"][strtolower($variable["name"])])) {\r
- $this->warn->addDocWarning($this->classes[$classname]["filename"], "variables", $elname, "@see referrs to the variable '" . $variable["name"] . "' which is not defined in the class. Entry gets ignored.", "mismatch");\r
- unset($this->classes[$classname][$eltype][$elname]["see"]["var"][$k]);\r
- }\r
-\r
- }\r
- \r
- if (isset($element["see"]["function"])) {\r
- \r
- reset($element["see"]["function"]);\r
- while (list($k, $function) = each($element["see"]["function"]))\r
- if (!isset($this->elementlist["functions"][strtolower(substr($function["name"], 0, -2))])) {\r
- $this->warn->addDocWarning($this->classes[$classname]["filename"], "functions", $elname, "@see referrs to the function '" . $function["name"] . "' which is not defined in the class. Entry gets ignored.", "mismatch");\r
- unset($this->classes[$classname][$eltype][$elname]["see"]["function"][$k]);\r
- }\r
-\r
- }\r
- \r
- }\r
- \r
- } \r
- \r
- } // end func checkSeeElement\r
- \r
- /**\r
- * Builds an array with all elements of a class and saves it to $this->elementlist.\r
- * \r
- * @param string Name of the class to scan.\r
- */\r
- function buildElementlist($classname) {\r
- \r
- $elements = array();\r
- $fields = array("functions", "variables", "consts", "uses");\r
- \r
- reset($fields);\r
- while (list($k, $field) = each($fields)) \r
- if (isset($this->classes[$classname][$field])) {\r
- \r
- reset($this->classes[$classname][$field]);\r
- while (list($element, ) = each($this->classes[$classname][$field])) \r
- $elements[$field][$element] = true;\r
- \r
- }\r
- \r
- $this->elementlist = $elements;\r
- \r
- } // end func buildElementlist\r
-\r
-} // end class PhpdocClassAnalyser\r
-?>
\ No newline at end of file