summaryrefslogtreecommitdiff
path: root/webapps/qooxdoo-0.6.5-sdk/frontend/framework/tool/modules/variableoptimizer.py
blob: eb85bd4067d67c1f86866ef7efc4be696ed5918f (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/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)
#    * Alessandro Sala (asala)
#
################################################################################

import tree, mapper

def skip(name, prefix):
	return len(prefix) > 0 and name[:len(prefix)] == prefix

def search(node, found, level=0, prefix="$", skipPrefix="", 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" % name
        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:
          # print "Name: %s" % name
          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:
        # print "Name: %s" % name
        found.append(name)

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

    else:
      for child in node.children:
        search(child, found, level, prefix, skipPrefix, 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, skipPrefix, debug)
    del found[foundLen:]



def update(node, found, prefix="$", skipPrefix="", 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 and not skip(idenName, skipPrefix):
        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 and not skip(idenName, skipPrefix):
      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 and not skip(idenName, skipPrefix):
      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, skipPrefix, debug)