summaryrefslogtreecommitdiff
path: root/webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/modules/api.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/modules/api.py')
-rwxr-xr-xwebapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/modules/api.py987
1 files changed, 0 insertions, 987 deletions
diff --git a/webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/modules/api.py b/webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/modules/api.py
deleted file mode 100755
index d636205dba..0000000000
--- a/webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/modules/api.py
+++ /dev/null
@@ -1,987 +0,0 @@
-#!/usr/bin/env python
-################################################################################
-#
-# qooxdoo - the new era of web development
-#
-# http://qooxdoo.org
-#
-# Copyright:
-# 2006-2007 1&1 Internet AG, Germany, http://www.1and1.org
-#
-# License:
-# LGPL: http://www.gnu.org/licenses/lgpl.html
-# EPL: http://www.eclipse.org/org/documents/epl-v10.php
-# See the LICENSE file in the project's top-level directory for details.
-#
-# Authors:
-# * Sebastian Werner (wpbasti)
-# * Andreas Ecker (ecker)
-# * Fabian Jakobs (fjakobs)
-#
-################################################################################
-
-import sys, os, re, optparse
-import tree, treegenerator, tokenizer, comment
-
-
-
-########################################################################################
-#
-# MAIN
-#
-########################################################################################
-
-class DocException (Exception):
- def __init__ (self, msg, syntaxItem):
- Exception.__init__(self, msg)
- self.node = syntaxItem
-
-
-
-def createDoc(syntaxTree, docTree = None):
- if not docTree:
- docTree = tree.Node("doctree")
-
- try:
- currClassNode = None
- if not syntaxTree.hasChildren():
- return docTree
-
- for item in syntaxTree.children:
- if item.type == "assignment":
- leftItem = item.getFirstListChild("left")
- rightItem = item.getFirstListChild("right")
- if leftItem.type == "variable":
- if currClassNode and len(leftItem.children) == 3 and leftItem.children[0].get("name") == "qx":
-
- if leftItem.children[1].get("name") == "Proto" and rightItem.type == "function":
- # It's a method definition
- handleMethodDefinitionOld(item, False, currClassNode)
-
- elif leftItem.children[1].get("name") == "Class":
- if rightItem.type == "function":
- handleMethodDefinitionOld(item, True, currClassNode)
-
- elif leftItem.children[2].get("name").isupper():
- handleConstantDefinition(item, currClassNode)
-
- elif currClassNode and assembleVariable(leftItem).startswith(currClassNode.get("fullName")):
- # This is definition of the type "mypackage.MyClass.bla = ..."
- if rightItem.type == "function":
- handleMethodDefinitionOld(item, True, currClassNode)
-
- elif leftItem.children[len(leftItem.children) - 1].get("name").isupper():
- handleConstantDefinition(item, currClassNode)
-
- elif item.type == "call":
- operand = item.getChild("operand", False)
- if operand:
- var = operand.getChild("variable", False)
-
- # qooxdoo < 0.7 (DEPRECATED)
- if var and len(var.children) == 3 and var.children[0].get("name") == "qx" and var.children[1].get("name") == "OO":
- methodName = var.children[2].get("name")
-
- if methodName == "defineClass":
- currClassNode = handleClassDefinitionOld(docTree, item)
-
- elif methodName in [ "addProperty", "addFastProperty" ]:
- # these are private and should be marked if listed, otherwise just hide them (wpbasti)
- #or methodName == "addCachedProperty" or methodName == "changeProperty":
- handlePropertyDefinitionOld(item, currClassNode)
-
- # qooxdoo >= 0.7
- elif var and len(var.children) == 3 and var.children[0].get("name") == "qx" and var.children[1].get("name") in [ "Class", "Clazz", "Locale", "Interface", "Mixin" ] and var.children[2].get("name") == "define":
- currClassNode = handleClassDefinition(docTree, item, var.children[1].get("name").lower())
-
-
- except Exception:
- exc = sys.exc_info()[1]
- msg = ""
-
- if hasattr(exc, "node"):
- (line, column) = getLineAndColumnFromSyntaxItem(exc.node)
- file = getFileFromSyntaxItem(exc.node)
- if line != None or file != None:
- msg = str(exc) + "\n " + str(file) + ", Line: " + str(line) + ", Column: " + str(column)
-
- if msg == "":
- raise exc
-
- else:
- print
- print " - Failed: %s" % msg
- sys.exit(1)
-
- return docTree
-
-
-
-
-
-
-
-
-
-
-########################################################################################
-#
-# COMPATIBLE TO 0.7 STYLE ONLY!
-#
-########################################################################################
-
-def handleClassDefinition(docTree, item, variant):
- params = item.getChild("params")
-
- className = params.children[0].get("value")
- classMap = params.children[1]
- classNode = getClassNode(docTree, className)
-
- #print className
-
- try:
- children = classMap.children
- except AttributeError:
- return
-
- for keyvalueItem in children:
- key = keyvalueItem.get("key")
- valueItem = keyvalueItem.getChild("value").getFirstChild()
-
- # print "KEY: %s = %s" % (key, valueItem.type)
-
- if key == "extend":
- if variant in [ "class", "clazz" ]:
- superClassName = assembleVariable(valueItem)
- superClassNode = getClassNode(docTree, superClassName)
- childClasses = superClassNode.get("childClasses", False)
-
- if childClasses:
- childClasses += "," + className
- else:
- childClasses = className
-
- superClassNode.set("childClasses", childClasses)
-
- classNode.set("superClass", superClassName)
-
- elif variant == "interface":
- pass
-
- elif variant == "mixin":
- pass
-
- elif key == "include":
- handleMixins(valueItem, classNode)
-
- elif key == "implement":
- handleInterfaces(valueItem, classNode)
-
- elif key == "init":
- handleConstructor(valueItem, classNode)
-
- elif key == "statics":
- handleStatics(valueItem, classNode)
-
- elif key == "properties":
- handleProperties(valueItem, classNode)
-
- elif key == "members":
- handleMembers(valueItem, classNode)
-
-def handleMixins(item, classNode):
- #print " - Found Mixin"
- pass
-
-def handleInterfaces(item, classNode):
- #print " - Found Interface"
- pass
-
-def handleConstructor(item, classNode):
- #print " - Found Constructor"
- pass
-
-def handleStatics(item, classNode):
- if item.hasChildren():
- for keyvalue in item.children:
- key = keyvalue.get("key")
- value = keyvalue.getFirstChild(True, True).getFirstChild(True, True)
- commentAttributes = comment.parseNode(keyvalue)
-
- # print " - Found Static: %s = %s" % (key, value.type)
-
- # Function
- if value.type == "function":
- node = handleFunction(value, commentAttributes, classNode)
- node.set("name", key)
- node.set("isStatic", True)
-
- classNode.addListChild("methods-static", node)
-
- # Constant
- elif key.isupper():
- handleConstantDefinition(keyvalue, classNode)
-
-def handleProperties(item, classNode):
- if item.hasChildren():
- for keyvalue in item.children:
- key = keyvalue.get("key")
- value = keyvalue.getFirstChild(True, True).getFirstChild(True, True)
- # print " - Found Property: %s" % key
-
- # TODO: New handling for new properties needed
- handlePropertyDefinitionOldCommon(keyvalue, classNode, key, value)
-
-def handleMembers(item, classNode):
- if item.hasChildren():
- for keyvalue in item.children:
- key = keyvalue.get("key")
- value = keyvalue.getFirstChild(True, True).getFirstChild(True, True)
- commentAttributes = comment.parseNode(keyvalue)
-
- # print " - Found Member: %s = %s" % (key, value.type)
-
- # Function
- if value.type == "function":
-
- node = handleFunction(value, commentAttributes, classNode)
- node.set("name", key)
-
- classNode.addListChild("methods", node)
-
-
-
-
-
-
-########################################################################################
-#
-# COMPATIBLE TO 0.6 STYLE ONLY!
-#
-########################################################################################
-
-def handleClassDefinitionOld(docTree, item):
- params = item.getChild("params")
-
- paramsLen = len(params.children);
- if paramsLen == 1:
- superClassName = "Object"
- ctorItem = None
- elif paramsLen == 2:
- superClassName = "Object"
- ctorItem = params.children[1]
- elif paramsLen == 3:
- superClassName = assembleVariable(params.children[1])
- ctorItem = params.children[2]
- else:
- raise DocException("defineClass call has more than three parameters: " + str(len(params.children)), item)
-
- className = params.children[0].get("value")
- classNode = getClassNode(docTree, className)
-
- if superClassName != "Object":
- superClassNode = getClassNode(docTree, superClassName)
- childClasses = superClassNode.get("childClasses", False)
- if childClasses:
- childClasses += "," + className
- else:
- childClasses = className
- superClassNode.set("childClasses", childClasses)
-
- classNode.set("superClass", superClassName)
-
- commentAttributes = comment.parseNode(item)
-
- for attrib in commentAttributes:
- if attrib["category"] == "event":
- # Add the event
- if comment.attribHas(attrib, "name") and comment.attribHas(attrib, "type"):
- addEventNode(classNode, item, attrib);
- else:
- addError(classNode, "Documentation contains malformed event attribute.", item)
- elif attrib["category"] == "description":
- if attrib.has_key("text"):
- descNode = tree.Node("desc").set("text", attrib["text"])
- classNode.addChild(descNode)
-
- # Add the constructor
- if ctorItem and ctorItem.type == "function":
- ctor = handleFunction(ctorItem, commentAttributes, classNode)
- ctor.set("isCtor", True)
- classNode.addListChild("constructor", ctor)
-
- # Check for methods defined in the constructor
- # (for method definition style that supports real private methods)
- ctorBlock = ctorItem.getChild("body").getChild("block")
-
- if ctorBlock.hasChildren():
- for item in ctorBlock.children:
- if item.type == "assignment":
- leftItem = item.getFirstListChild("left")
- rightItem = item.getFirstListChild("right")
-
- # It's a method definition
- if leftItem.type == "variable" and len(leftItem.children) == 2 and (leftItem.children[0].get("name") == "this" or leftItem.children[0].get("name") == "self") and rightItem.type == "function":
- handleMethodDefinitionOld(item, False, classNode)
-
- elif ctorItem and ctorItem.type == "map":
- for keyvalueItem in ctorItem.children:
- if keyvalueItem.type == "keyvalue":
- valueItem = keyvalueItem.getChild("value").getFirstChild()
- if (valueItem.type == "function"):
- handleMethodDefinitionOld(keyvalueItem, True, classNode)
- else:
- handleConstantDefinition(keyvalueItem, classNode)
-
- return classNode
-
-def handlePropertyDefinitionOld(item, classNode):
- paramsMap = item.getChild("params").getChild("map")
- propertyName = paramsMap.getChildByAttribute("key", "name").getChild("value").getChild("constant").get("value")
-
- handlePropertyDefinitionOldCommon(item, classNode, propertyName, paramsMap)
-
-def handlePropertyDefinitionOldCommon(item, classNode, propertyName, paramsMap):
- node = tree.Node("property")
- node.set("name", propertyName)
-
- propType = paramsMap.getChildByAttribute("key", "type", False)
- if propType:
- node.set("type", getType(propType.getChild("value").getFirstChild()))
-
- allowNull = paramsMap.getChildByAttribute("key", "allowNull", False)
- if allowNull:
- node.set("allowNull", allowNull.getChild("value").getChild("constant").get("value"))
-
- defaultValue = paramsMap.getChildByAttribute("key", "defaultValue", False)
- if defaultValue:
- node.set("defaultValue", getValue(defaultValue.getFirstListChild("value")))
-
- getAlias = paramsMap.getChildByAttribute("key", "getAlias", False)
- if getAlias:
- node.set("getAlias", getAlias.getChild("value").getChild("constant").get("value"))
-
- setAlias = paramsMap.getChildByAttribute("key", "setAlias", False)
- if setAlias:
- node.set("setAlias", setAlias.getChild("value").getChild("constant").get("value"))
-
- unitDetection = paramsMap.getChildByAttribute("key", "unitDetection", False)
- if unitDetection:
- node.set("unitDetection", unitDetection.getChild("value").getChild("constant").get("value"))
-
- instance = paramsMap.getChildByAttribute("key", "instance", False)
- if instance:
- node.set("instance", instance.getChild("value").getChild("constant").get("value"))
-
- classname = paramsMap.getChildByAttribute("key", "classname", False)
- if classname:
- node.set("classname", classname.getChild("value").getChild("constant").get("value"))
-
- possibleValues = paramsMap.getChildByAttribute("key", "possibleValues", False)
- if possibleValues:
- array = possibleValues.getChild("value").getChild("array")
- values = ""
- for arrayItem in array.children:
- if len(values) != 0:
- values += ", "
- values += getValue(arrayItem)
- node.set("possibleValues", values)
-
- # If the description has a type specified then take this type
- # (and not the one extracted from the paramsMap)
- commentAttributes = comment.parseNode(item)
- addTypeInfo(node, comment.getAttrib(commentAttributes, "description"), item)
-
- classNode.addListChild("properties", node)
-
-def handleMethodDefinitionOld(item, isStatic, classNode):
- if item.type == "assignment":
- # This is a "normal" method definition
- leftItem = item.getFirstListChild("left")
- name = leftItem.children[len(leftItem.children) - 1].get("name")
- functionItem = item.getFirstListChild("right")
- elif item.type == "keyvalue":
- # This is a method definition of a map-style class (like qx.Const)
- name = item.get("key")
- functionItem = item.getFirstListChild("value")
-
- commentAttributes = comment.parseNode(item)
-
- node = handleFunction(functionItem, commentAttributes, classNode)
- node.set("name", name)
-
- isPublic = name[0] != "_"
- listName = "methods"
- if isStatic:
- node.set("isStatic", True)
- listName += "-static"
-
- classNode.addListChild(listName, node)
-
-
-
-
-
-
-
-
-########################################################################################
-#
-# COMPATIBLE TO BOTH, 0.6 and 0.7 style
-#
-########################################################################################
-
-def handleConstantDefinition(item, classNode):
- if (item.type == "assignment"):
- # This is a "normal" constant definition
- leftItem = item.getFirstListChild("left")
- name = leftItem.children[len(leftItem.children) - 1].get("name")
- valueNode = item.getChild("right")
- elif (item.type == "keyvalue"):
- # This is a constant definition of a map-style class (like qx.Const)
- name = item.get("key")
- valueNode = item.getChild("value")
-
- if not name.isupper():
- return
-
- node = tree.Node("constant")
- node.set("name", name)
-
- value = None
- if valueNode.hasChild("constant"):
- node.set("value", valueNode.getChild("constant").get("value"))
- node.set("type", valueNode.getChild("constant").get("constantType").capitalize())
-
- commentAttributes = comment.parseNode(item)
- description = comment.getAttrib(commentAttributes, "description")
- addTypeInfo(node, description, item)
-
- classNode.addListChild("constants", node)
-
-def handleFunction(funcItem, commentAttributes, classNode):
- if funcItem.type != "function":
- raise DocException("'funcItem' is no function", funcItem)
-
- node = tree.Node("method")
-
- # Read the parameters
- params = funcItem.getChild("params", False)
- if params and params.hasChildren():
- for param in params.children:
- paramNode = tree.Node("param")
- paramNode.set("name", param.getFirstChild().get("name"))
- node.addListChild("params", paramNode)
-
- # Check whether the function is abstract
- bodyBlockItem = funcItem.getChild("body").getFirstChild();
- if bodyBlockItem.type == "block" and bodyBlockItem.hasChildren():
- firstStatement = bodyBlockItem.children[0];
- if firstStatement.type == "throw":
- # The first statement of the function is a throw statement
- # -> The function is abstract
- node.set("isAbstract", True)
-
- if len(commentAttributes) == 0:
- addError(node, "Documentation is missing.", funcItem)
- return node
-
- # Read all description, param and return attributes
- for attrib in commentAttributes:
- # Add description
- if attrib["category"] == "description":
- if attrib.has_key("text"):
- descNode = tree.Node("desc").set("text", attrib["text"])
- node.addChild(descNode)
-
- elif attrib["category"] == "see":
- if not attrib.has_key("name"):
- raise DocException("Missing target for see.", funcItem)
-
- seeNode = tree.Node("see").set("name", attrib["name"])
- node.addChild(seeNode)
-
- elif attrib["category"] == "param":
- if not attrib.has_key("name"):
- raise DocException("Missing name of parameter.", funcItem)
-
- # Find the matching param node
- paramName = attrib["name"]
- paramNode = node.getListChildByAttribute("params", "name", paramName, False)
-
- if not paramNode:
- addError(node, "Contains information for a non-existing parameter <code>%s</code>." % paramName, funcItem)
- continue
-
- addTypeInfo(paramNode, attrib, funcItem)
-
- elif attrib["category"] == "return":
- returnNode = tree.Node("return")
- node.addChild(returnNode)
-
- addTypeInfo(returnNode, attrib, funcItem)
-
- # Check for documentation errors
- # Check whether all parameters have been documented
- if node.hasChild("params"):
- paramsListNode = node.getChild("params");
- for paramNode in paramsListNode.children:
- if not paramNode.getChild("desc", False):
- addError(node, "Parameter %s is not documented." % paramNode.get("name"), funcItem)
-
- return node
-
-
-
-
-
-
-
-
-
-
-########################################################################################
-#
-# COMMON STUFF
-#
-#######################################################################################
-
-
-def variableIsClassName(varItem):
- length = len(varItem.children)
- for i in range(length):
- varChild = varItem.children[i]
- if not varChild.type == "identifier":
- return False
- if i < length - 1:
- # This is not the last identifier -> It must a package (= lowercase)
- if not varChild.get("name").islower():
- return False
- else:
- # This is the last identifier -> It must the class name (= first letter uppercase)
- if not varChild.get("name")[0].isupper():
- return False
- return True
-
-
-
-def assembleVariable(variableItem):
- if variableItem.type != "variable":
- raise DocException("'variableItem' is no variable", variableItem)
-
- assembled = ""
- for child in variableItem.children:
- if len(assembled) != 0:
- assembled += "."
- assembled += child.get("name")
-
- return assembled
-
-
-
-def getValue(item):
- value = None
- if item.type == "constant":
- if item.get("constantType") == "string":
- value = '"' + item.get("value") + '"'
- else:
- value = item.get("value")
- elif item.type == "variable":
- value = assembleVariable(item)
- elif item.type == "operation" and item.get("operator") == "SUB":
- # E.g. "-1" or "-Infinity"
- value = "-" + getValue(item.getChild("first").getFirstChild())
- if value == None:
- value = "[Unsupported item type: " + item.type + "]"
-
- return value
-
-
-
-def addTypeInfo(node, commentAttrib=None, item=None):
- if commentAttrib == None:
- if node.type == "constant" and node.get("value", False):
- pass
-
- elif node.type == "param":
- addError(node, "Parameter <code>%s</code> in not documented." % commentAttrib.get("name"), item)
-
- elif node.type == "return":
- addError(node, "Return value is not documented.", item)
-
- else:
- addError(node, "Documentation is missing.", item)
-
- return
-
- # add description
- if commentAttrib.has_key("text"):
- node.addChild(tree.Node("desc").set("text", commentAttrib["text"]))
-
- # add types
- if commentAttrib.has_key("type"):
- typesNode = tree.Node("types")
- node.addChild(typesNode)
-
- for item in commentAttrib["type"]:
- itemNode = tree.Node("entry")
- typesNode.addChild(itemNode)
-
- itemNode.set("type", item["type"])
-
- if item["dimensions"] != 0:
- itemNode.set("dimensions", item["dimensions"])
-
- # add default value
- if commentAttrib.has_key("default"):
- defaultValue = commentAttrib["default"]
- if defaultValue != None:
- # print "defaultValue: %s" % defaultValue
- node.set("defaultValue", defaultValue)
-
-
-
-def addEventNode(classNode, classItem, commentAttrib):
- node = tree.Node("event")
-
- node.set("name", commentAttrib["name"])
-
- if commentAttrib.has_key("text"):
- node.addChild(tree.Node("desc").set("text", commentAttrib["text"]))
-
- # add types
- if commentAttrib.has_key("type"):
- typesNode = tree.Node("types")
- node.addChild(typesNode)
-
- for item in commentAttrib["type"]:
- itemNode = tree.Node("entry")
- typesNode.addChild(itemNode)
-
- itemNode.set("type", item["type"])
-
- if item["dimensions"] != 0:
- itemNode.set("dimensions", item["dimensions"])
-
- classNode.addListChild("events", node)
-
-
-
-def addError(node, msg, syntaxItem):
- # print ">>> %s" % msg
-
- errorNode = tree.Node("error")
- errorNode.set("msg", msg)
-
- (line, column) = getLineAndColumnFromSyntaxItem(syntaxItem)
- if line:
- errorNode.set("line", line)
-
- if column:
- errorNode.set("column", column)
-
- node.addListChild("errors", errorNode)
- node.set("hasError", True)
-
-
-
-def getLineAndColumnFromSyntaxItem(syntaxItem):
- line = None
- column = None
-
- while line == None and column == None and syntaxItem:
- line = syntaxItem.get("line", False)
- column = syntaxItem.get("column", False)
-
- if syntaxItem.hasParent():
- syntaxItem = syntaxItem.parent
- else:
- syntaxItem = None
-
- return line, column
-
-
-def getFileFromSyntaxItem(syntaxItem):
- file = None
- while file == None and syntaxItem:
- file = syntaxItem.get("file", False)
- if hasattr(syntaxItem, "parent"):
- syntaxItem = syntaxItem.parent
- else:
- syntaxItem = None
- return file
-
-
-def getType(item):
- if item.type == "constant" and item.get("constantType") == "string":
- val = item.get("value").capitalize()
- return val
-
- else:
- raise DocException("Can't gess type. type is neither string nor variable: " + item.type, item)
-
-
-def getClassNode(docTree, className):
- splits = className.split(".")
-
- currPackage = docTree
- length = len(splits)
- for i in range(length):
- split = splits[i]
-
- if (i < length - 1):
- # This is a package name -> Get the right package
- childPackage = currPackage.getListChildByAttribute("packages", "name", split, False)
- if not childPackage:
- childPackageName = ".".join(splits[:-(length-i-1)])
-
- # The package does not exist -> Create it
- childPackage = tree.Node("package")
- childPackage.set("name", split)
- childPackage.set("fullName", childPackageName)
- childPackage.set("packageName", childPackageName.replace("." + split, ""))
-
- currPackage.addListChild("packages", childPackage)
-
- # Update current package
- currPackage = childPackage
-
- else:
- # This is a class name -> Get the right class
- classNode = currPackage.getListChildByAttribute("classes", "name", split, False)
- if not classNode:
- # The class does not exist -> Create it
- classNode = tree.Node("class")
- classNode.set("name", split)
- classNode.set("fullName", className)
- classNode.set("packageName", className.replace("." + split, ""))
- currPackage.addListChild("classes", classNode)
-
- return classNode
-
-
-
-def postWorkPackage(docTree, packageNode):
- childHasError = False
-
- packages = packageNode.getChild("packages", False)
- if packages:
- packages.children.sort(nameComparator)
- for node in packages.children:
- hasError = postWorkPackage(docTree, node)
- if hasError:
- childHasError = True
-
- classes = packageNode.getChild("classes", False)
- if classes:
- classes.children.sort(nameComparator)
- for node in classes.children:
- hasError = postWorkClass(docTree, node)
- if hasError:
- childHasError = True
-
- if childHasError:
- packageNode.set("hasWarning", True)
-
- return childHasError
-
-
-
-def postWorkClass(docTree, classNode):
- # Sort child classes
- childClasses = classNode.get("childClasses", False)
- if childClasses:
- classArr = childClasses.split(",")
- classArr.sort()
- childClasses = ",".join(classArr)
- classNode.set("childClasses", childClasses)
-
- # Remove the property-modifier-methods
- removePropertyModifiers(classNode)
-
- # Mark overridden items
- postWorkItemList(docTree, classNode, "properties", True)
- postWorkItemList(docTree, classNode, "events", False)
- postWorkItemList(docTree, classNode, "methods", True)
- postWorkItemList(docTree, classNode, "methods-static", False)
-
- # Check whether the class is static
- superClassName = classNode.get("superClass", False)
- if (superClassName == None or superClassName == "qx.core.Object") \
- and classNode.getChild("properties", False) == None \
- and classNode.getChild("methods", False) == None:
- # This class is static
- classNode.set("isStatic", True)
-
- # Check whether the class is abstract
- if isClassAbstract(docTree, classNode, {}):
- classNode.set("isAbstract", True)
-
- # Check for errors
- childHasError = listHasError(classNode, "constructor") or listHasError(classNode, "properties") \
- or listHasError(classNode, "methods") or listHasError(classNode, "methods-static") \
- or listHasError(classNode, "constants")
-
- if childHasError:
- classNode.set("hasWarning", True)
-
- return childHasError
-
-
-
-def isClassAbstract(docTree, classNode, visitedMethodNames):
- if containsAbstractMethods(classNode.getChild("methods", False), visitedMethodNames):
- # One of the methods is abstract
- return True
-
- # No abstract methods found -> Check whether the super class has abstract
- # methods that haven't been overridden
- superClassName = classNode.get("superClass", False)
- if superClassName:
- superClassNode = getClassNode(docTree, superClassName)
- return isClassAbstract(docTree, superClassNode, visitedMethodNames)
-
-
-
-def containsAbstractMethods(methodListNode, visitedMethodNames):
- if methodListNode:
- for methodNode in methodListNode.children:
- name = methodNode.get("name")
- if not name in visitedMethodNames:
- visitedMethodNames[name] = True
- if methodNode.get("isAbstract", False):
- return True
-
- return False
-
-
-
-def removePropertyModifiers(classNode):
- propertiesList = classNode.getChild("properties", False)
- methodsList = classNode.getChild("methods", False)
- if propertiesList and methodsList:
- for propNode in propertiesList.children:
- name = propNode.get("name")
- upperName = name[0].upper() + name[1:]
-
- modifyNode = methodsList.getChildByAttribute("name", "_modify" + upperName, False)
- if modifyNode:
- methodsList.removeChild(modifyNode);
-
- changeNode = methodsList.getChildByAttribute("name", "_change" + upperName, False)
- if changeNode:
- methodsList.removeChild(changeNode);
-
- checkNode = methodsList.getChildByAttribute("name", "_check" + upperName, False)
- if checkNode:
- methodsList.removeChild(checkNode);
-
- if not methodsList.hasChildren():
- classNode.removeChild(methodsList)
-
-
-
-def postWorkItemList(docTree, classNode, listName, overridable):
- """Does the post work for a list of properties or methods."""
-
- # Sort the list
- sortByName(classNode, listName)
-
- # Post work all items
- listNode = classNode.getChild(listName, False)
- if listNode:
- for itemNode in listNode.children:
- name = itemNode.get("name")
-
- # Check whether this item is overridden and try to inherit the
- # documentation from the next matching super class
- if overridable:
- superClassName = classNode.get("superClass", False)
- overriddenFound = False
- docFound = (itemNode.getChild("desc", False) != None)
- while superClassName and (not overriddenFound or not docFound):
- superClassNode = getClassNode(docTree, superClassName)
- superItemNode = superClassNode.getListChildByAttribute(listName, "name", name, False)
-
- if superItemNode:
- if not docFound:
- # This super item has a description
- # -> Check whether the parameters match
- # NOTE: paramsMatch works for properties, too
- # (Because both compared properties always have no params)
- if paramsMatch(itemNode, superItemNode):
- # The parameters match -> We can use the documentation of the super class
- itemNode.set("docFrom", superClassName)
- docFound = (superItemNode.getChild("desc", False) != None)
-
- # Remove previously recorded documentation errors from the item
- # (Any documentation errors will be recorded in the super class)
- removeErrors(itemNode)
- if not overriddenFound:
- # This super class has the item defined -> Add a overridden attribute
- itemNode.set("overriddenFrom", superClassName)
- overriddenFound = True
-
- # Check the next superclass
- superClassName = superClassNode.get("superClass", False)
-
- if not docFound and itemNode.get("overriddenFrom", False):
- # This item is overridden, but we didn't find any documentation in the
- # super classes -> Add a warning
- itemNode.set("hasWarning", True)
-
-
-
-def paramsMatch(methodNode1, methodNode2):
- params1 = methodNode1.getChild("params1", False)
- params2 = methodNode1.getChild("params2", False)
-
- if params1 == None or params2 == None:
- # One method has no parameters -> The params match if both are None
- return params1 == params2
- elif len(params1.children) != len(params2.children):
- # The param count is different -> The params don't match
- return False
- else:
- for i in range(len(params1.children)):
- par1 = params1.children[i]
- par2 = params2.children[i]
- if (par1.get("name") != par2.get("name")):
- # These parameters don't match
- return False
-
- # All tests passed
- return True
-
-
-
-def removeErrors(node):
- errors = node.getChild("errors", False)
- if errors:
- node.removeChild(errors)
- node.remove("hasError")
-
-
-
-def sortByName(node, listName):
- listNode = node.getChild(listName, False)
- if listNode:
- listNode.children.sort(nameComparator)
-
-
-
-def nameComparator(node1, node2):
- name1 = node1.get("name").lower()
- name2 = node2.get("name").lower()
- return cmp(name1, name2)
-
-
-
-def listHasError(node, listName):
- listNode = node.getChild(listName, False)
- if listNode:
- for childNode in listNode.children:
- if childNode.get("hasError", False):
- return True
-
- return False