summaryrefslogtreecommitdiff
path: root/webapps/qooxdoo-0.6.3-sdk/frontend/framework/tool/modules/variableoptimizer.py
blob: 6fa148dd5d685d9cc3f5505afe46d5159c85cc89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env python

import tree, mapper

def search(node, found, level=0, prefix="$", register=False, debug=False):
  if node.type == "function":
    if register:
      name = node.get("name", False)
      if name != None and not name in found:
        # print "Name: %s" % funcName
        found.append(name)

    foundLen = len(found)
    register = True

    if debug:
      print "\n%s<scope line='%s'>" % (("  " * level), node.get("line"))

  # e.g. func(name1, name2);
  elif register and node.type == "variable" and node.hasChildren() and len(node.children) == 1:
    if node.parent.type == "params" and node.parent.parent.type != "call":
      first = node.getFirstChild()

      if first.type == "identifier":
        name = first.get("name")

        if not name in found:
          found.append(name)

  # e.g. var name1, name2 = "foo";
  elif register and node.type == "definition":
    name = node.get("identifier", False)

    if name != None:
      if not name in found:
        found.append(name)

  # Iterate over children
  if node.hasChildren():
    if node.type == "function":
      for child in node.children:
        search(child, found, level+1, prefix, register, debug)

    else:
      for child in node.children:
        search(child, found, level, prefix, register, debug)

  # Function closed
  if node.type == "function":

    # Debug
    if debug:
      for item in found:
        print "  %s<item>%s</item>" % (("  " * level), item)
      print "%s</scope>" % ("  " * level)

    # Iterate over content
    # Replace variables in current scope
    update(node, found, prefix, debug)
    del found[foundLen:]



def update(node, found, prefix="$", debug=False):
  # Handle all identifiers
  if node.type == "identifier":

    isFirstChild = False
    isVariableMember = False

    if node.parent.type == "variable":
      isVariableMember = True
      varParent = node.parent.parent

      if not (varParent.type == "right" and varParent.parent.type == "accessor"):
        isFirstChild = node.parent.getFirstChild(True, True) == node

    elif node.parent.type == "identifier" and node.parent.parent.type == "accessor":
      isVariableMember = True
      accessor = node.parent.parent
      isFirstChild = accessor.parent.getFirstChild(True, True) == accessor

    # inside a variable parent only respect the first member
    if not isVariableMember or isFirstChild:
      idenName = node.get("name", False)

      if idenName != None and idenName in found:
        replName = "%s%s" % (prefix, mapper.convert(found.index(idenName)))
        node.set("name", replName)

        if debug:
          print "  - Replaced '%s' with '%s'" % (idenName, replName)

  # Handle variable definition
  elif node.type == "definition":
    idenName = node.get("identifier", False)

    if idenName != None and idenName in found:
      replName = "%s%s" % (prefix, mapper.convert(found.index(idenName)))
      node.set("identifier", replName)

      if debug:
        print "  - Replaced '%s' with '%s'" % (idenName, replName)

  # Handle function definition
  elif node.type == "function":
    idenName = node.get("name", False)

    if idenName != None and idenName in found:
      replName = "%s%s" % (prefix, mapper.convert(found.index(idenName)))
      node.set("name", replName)

      if debug:
        print "  - Replaced '%s' with '%s'" % (idenName, replName)

  # Iterate over children
  if node.hasChildren():
    for child in node.children:
      update(child, found, prefix, debug)