diff options
Diffstat (limited to 'webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/migration/0.7/patch.py')
-rwxr-xr-x | webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/migration/0.7/patch.py | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/migration/0.7/patch.py b/webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/migration/0.7/patch.py new file mode 100755 index 0000000000..885cafda8d --- /dev/null +++ b/webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/migration/0.7/patch.py @@ -0,0 +1,381 @@ +#!/usr/bin/env python + +import sys, os + +# reconfigure path to import modules from modules subfolder +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "../../modules")) + +import tree, compiler, comment + + + + + + +def getAssignment(elem): + if elem.parent.type == "right" and elem.parent.parent.type == "assignment": + return elem.parent.parent + + return None + + +def getName(elem): + # find last identifier + last = elem.getLastChild(False, True) + + if last.type == "identifier": + return last.get("name") + + +def getMode(var, classname): + # find last identifier + last = var.getLastChild(False, True) + prev = last.getPreviousSibling(False, True) + + if prev.type == "identifier": + mode = prev.get("name") + + if mode == "Proto": + return "members" + elif mode == "Class": + return "statics" + + combined = [] + length = var.getChildrenLength(True) + pos = length - 1 + for iden in var.children: + if iden.type == "identifier": + combined.append(iden.get("name")) + + # if variable starts with the classname and has one unique identifier afterwards + if ".".join(combined) == classname and pos == 1: + return "statics" + + pos -= 1 + + return None + + +def getNameOfAssignment(elem): + name = None + + if elem.hasChild("left"): + left = elem.getChild("left") + + if left.hasChild("variable"): + name = getName(left.getChild("variable")) + + return name + + +def getModeOfAssignment(elem, classname): + mode = None + + if elem.hasChild("left"): + left = elem.getChild("left") + + if left.hasChild("variable"): + var = left.getChild("variable") + mode = getMode(var, classname) + + return mode + + +def getAndRemovePropertyName(definition): + for keyValue in definition.children: + if keyValue.type == "keyvalue" and keyValue.get("key") == "name": + name = keyValue.getChild("value").getChild("constant").get("value") + keyValue.parent.removeChild(keyValue) + return name + + print " * Could not extract property name!" + return None + + +def createPair(key, value, commentParent=None): + par = tree.Node("keyvalue") + sub = tree.Node("value") + + par.set("key", key) + par.addChild(sub) + sub.addChild(value) + + if commentParent and commentParent.hasChild("commentsBefore"): + par.addChild(commentParent.getChild("commentsBefore")) + + return par + + +def patch(id, node): + if not node.hasChildren(): + return False + + classDefine, className, classMap, settingsMap, propertiesMap, membersMap, staticsMap = createClassDefine(id) + errorCounter = 0 + pos = 0 + + while node.hasChildren() and pos < len(node.children): + child = node.children[pos] + breakBefore = child.get("breakBefore") + pos += 1 + + # Add instance and static methods + if child.type == "assignment": + if child.hasChild("right"): + right = child.getChild("right") + elem = right.getFirstChild(True, True) + + name = getNameOfAssignment(child) + mode = getModeOfAssignment(child, id) + + if mode in [ "members", "statics" ]: + if mode == "members": + pair = createPair(name, elem, child) + + if breakBefore: + pair.set("breakBefore", True) + + membersMap.addChild(pair) + + elif mode == "statics": + # Special Handling of old singleton definition + if name == "getInstance": + pair = createPair("singleton", createConstant("boolean", "true")) + pair.addChild(createBlockComment("singleton")) + + if breakBefore: + pair.set("breakBefore", True) + + classMap.addChild(pair, 1) + + else: + pair = createPair(name, elem, child) + + if breakBefore: + pair.set("breakBefore", True) + + staticsMap.addChild(pair) + + node.removeChild(child) + pos -= 1 + + elif child.type == "call": + oper = child.getChild("operand") + var = oper.getChild("variable") + + if var: + lastIdentifier = var.getLastChild(False, True) + if lastIdentifier.type == "identifier": + name = lastIdentifier.get("name") + params = child.getChild("params") + + if name in [ "addProperty", "changeProperty", "addCachedProperty", "addFastProperty" ]: + definition = params.getFirstChild(False, True) + + if definition.type == "map": + if lastIdentifier.get("name") == "addFastProperty": + definition.addChild(createPair("fast", createConstant("boolean", "true"))) + elif lastIdentifier.get("name") == "addCachedProperty": + definition.addChild(createPair("cached", createConstant("boolean", "true"))) + + name = getAndRemovePropertyName(definition) + pair = createPair(name, definition, child) + + if breakBefore: + pair.set("breakBefore", True) + + propertiesMap.addChild(pair) + + node.removeChild(child) + pos -= 1 + + elif name == "setDefault": + nameNode = params.getChildByPosition(0, True) + valueNode = params.getChildByPosition(1, True) + + name = nameNode.get("value") + + pair = createPair(name, valueNode, child) + + if breakBefore: + pair.set("breakBefore", True) + + settingsMap.addChild(pair) + + node.removeChild(child) + pos -= 1 + + elif name == "defineClass": + if params.getFirstChild(False, True).get("value") != id: + print " - The class seems to have a wrong definition!" + + # 3 params = name, superclass, constructor + # 2 params = name, map + # 1 param = name + + # Move class comment + if child.hasChild("commentsBefore"): + classDefine.addChild(child.getChild("commentsBefore")) + + childrenLength = params.getChildrenLength(True) + + if childrenLength == 2: + statics_new = params.getChildByPosition(1, True, True) + + while statics_new.hasChildren(): + staticsMap.addChild(statics_new.getFirstChild()) + + node.removeChild(child) + pos -= 1 + + elif childrenLength == 3: + ext = params.getChildByPosition(1, True, True) + construct = params.getChildByPosition(2, True, True) + + extendPair = createPair("extend", ext) + constructPair = createPair("construct", construct) + + extendPair.addChild(createBlockComment("superclass")) + constructPair.addChild(createBlockComment("constructor")) + + classMap.addChild(extendPair, 0) + classMap.addChild(constructPair, 1) + + node.removeChild(child) + pos -= 1 + + elif name == "define": + print " - Class is already up-to-date." + return False + + # Post-Check + if child.parent == node: + # print " - Could not move element %s at line %s" % (child.type, child.get("line")) + errorCounter += 1 + + + # Remove empty maps + if settingsMap.getChildrenLength() == 0: + keyvalue = settingsMap.parent.parent + classMap.removeChild(keyvalue) + + if propertiesMap.getChildrenLength() == 0: + keyvalue = propertiesMap.parent.parent + classMap.removeChild(keyvalue) + + if membersMap.getChildrenLength() == 0: + keyvalue = membersMap.parent.parent + classMap.removeChild(keyvalue) + + if staticsMap.getChildrenLength() == 0: + keyvalue = staticsMap.parent.parent + classMap.removeChild(keyvalue) + + # Add new class definition + node.addChild(classDefine, 0) + + + + + if errorCounter > 0: + print " - Could not convert %s elements." % errorCounter + + # Debug + # print compiler.compile(node) + # print tree.nodeToXmlString(node) + + # Return Modification + return True + + +def createConstant(type, value): + constant = tree.Node("constant") + constant.set("constantType", type) + constant.set("value", value) + + if type == "string": + constant.set("detail", "doublequotes") + + return constant + + + +def createVariable(l): + var = tree.Node("variable") + + for name in l: + iden = tree.Node("identifier") + iden.set("name", name) + var.addChild(iden) + + return var + +def createClassDefineCore(id): + call = tree.Node("call") + oper = tree.Node("operand") + para = tree.Node("params") + con = createConstant("string", id) + args = tree.Node("map") + + call.addChild(oper) + call.addChild(para) + + oper.addChild(createVariable(["qx", "Clazz", "define"])) + + para.addChild(con) + para.addChild(args) + + return call, con, args + + +def createClassDefine(id): + classDefine, className, classMap = createClassDefineCore(id) + + settingsMap = tree.Node("map") + settingsPair = createPair("settings", settingsMap) + + propertiesMap = tree.Node("map") + propertiesPair = createPair("properties", propertiesMap) + + membersMap = tree.Node("map") + membersPair = createPair("members", membersMap) + + staticsMap = tree.Node("map") + staticsPair = createPair("statics", staticsMap) + + settingsPair.addChild(createBlockComment("settings")) + propertiesPair.addChild(createBlockComment("properties")) + membersPair.addChild(createBlockComment("members")) + staticsPair.addChild(createBlockComment("statics")) + + classMap.addChild(settingsPair) + classMap.addChild(propertiesPair) + classMap.addChild(membersPair) + classMap.addChild(staticsPair) + + return classDefine, className, classMap, settingsMap, propertiesMap, membersMap, staticsMap + + +def createBlockComment(txt): + l = "*****************************************************************************" + + s = "" + s += "/*\n" + s += "%s\n" % l + s += "**** %s %s\n" % (txt.upper(), "*" * (len(l) - len(txt) - 6)) + s += "%s\n" % l + s += "*/" + + bef = tree.Node("commentsBefore") + com = tree.Node("comment") + + bef.addChild(com) + + com.set("multiline", True) + com.set("connection", "before") + com.set("text", s) + com.set("detail", comment.getFormat(s)) + + return bef + + |