def _analyzeClassDepsNode(self, node, depsList, inLoadContext, inDefer=False): if node.type == "variable": assembled = (treeutil.assembleVariable(node))[0] # treat dependencies in defer as requires deferNode = self.checkDeferNode(assembled, node) if deferNode != None: self._analyzeClassDepsNode(deferNode, depsList, inLoadContext=True, inDefer=True) (context, className, classAttribute) = self._isInterestingReference(assembled, node, self.id, inDefer) # postcond: # - if className != '' it is an interesting reference # - might be a known qooxdoo class, or an unknown class (use 'className in self._classes') # - if assembled contained ".", classAttribute will contain approx. non-class part if className: # we allow self-references, to be able to track method dependencies within the same class if className == 'this': className = self.id elif inDefer and className in DEFER_ARGS: className = self.id if not classAttribute: # see if we have to provide 'construct' if node.hasParentContext("instantiation/*/*/operand"): # 'new ...' position classAttribute = 'construct' # Can't do the next; it's catching too many occurrences of 'getInstance' that have # nothing to do with the singleton 'getInstance' method (just grep in the framework) #elif classAttribute == 'getInstance': # erase 'getInstance' and introduce 'construct' dependency # classAttribute = 'construct' depsItem = DependencyItem(className, classAttribute, self.id, node.get('line', -1), inLoadContext) #print "-- adding: %s (%s:%s)" % (className, treeutil.getFileFromSyntaxItem(node), node.get('line',False)) if node.hasParentContext("call/operand"): # it's a function call depsItem.isCall = True # interesting when following transitive deps # Adding all items to list; let caller sort things out depsList.append(depsItem) # Mark items that need recursive analysis of their dependencies (bug#1455) if self.followCallDeps(node, self.id, className, inLoadContext): depsItem.needsRecursion = True # check e.g. qx.core.Environment.get("runtime.name") elif node.type == "constant" and node.hasParentContext("call/params"): callnode = treeutil.selectNode(node, "../..") if variantoptimizer.isEnvironmentCall(callnode): className, classAttribute = self.getClassNameFromEnvKey(node.get("value", "")) if className: depsItem = DependencyItem(className, classAttribute, self.id, node.get('line', -1), inLoadContext) depsItem.isCall = True # treat as if actual call, to collect recursive deps depsList.append(depsItem) elif node.type == "body" and node.parent.type == "function": if (node.parent.hasParentContext("call/operand") or node.parent.hasParentContext("call/operand/group")): # if the function is immediately called, it's still load context (if that's what it was before) pass else: inLoadContext = False if node.hasChildren(): for child in node.children: self._analyzeClassDepsNode(child, depsList, inLoadContext, inDefer) return
def _analyzeClassDepsNode_1(self, node, depsList, inLoadContext, inDefer=False): if node.isVar(): if node.dep: depsList.append(node.dep) return assembled = (treeutil.assembleVariable(node))[0] # treat dependencies in defer as requires deferNode = self.checkDeferNode(assembled, node) if deferNode != None: self._analyzeClassDepsNode(deferNode, depsList, inLoadContext=True, inDefer=True) (context, className, classAttribute) = self._isInterestingReference( assembled, node, self.id, inDefer) # postcond: # - if className != '' it is an interesting reference # - might be a known qooxdoo class, or an unknown class (use 'className in self._classes') # - if assembled contained ".", classAttribute will contain approx. non-class part if className: # we allow self-references, to be able to track method dependencies within the same class if className == 'this': className = self.id elif inDefer and className in DEFER_ARGS: className = self.id if not classAttribute: # see if we have to provide 'construct' if treeutil.isNEWoperand(node): classAttribute = 'construct' # Can't do the next; it's catching too many occurrences of 'getInstance' that have # nothing to do with the singleton 'getInstance' method (just grep in the framework) #elif classAttribute == 'getInstance': # erase 'getInstance' and introduce 'construct' dependency # classAttribute = 'construct' line = node.get('line', 0) depsItem = DependencyItem(className, classAttribute, self.id, line if line else -1, inLoadContext) #print "-- adding: %s (%s:%s)" % (className, treeutil.getFileFromSyntaxItem(node), node.get('line',False)) if node.hasParentContext( "call/operand"): # it's a function call depsItem.isCall = True # interesting when following transitive deps # Adding all items to list; let caller sort things out depsList.append(depsItem) node.dep = depsItem # Mark items that need recursive analysis of their dependencies (bug#1455) if self.followCallDeps(node, self.id, className, inLoadContext): depsItem.needsRecursion = True # check e.g. qx.core.Environment.get("runtime.name") elif node.type == "constant" and node.hasParentContext( "call/arguments"): if node.dep: depsList.append(node.dep) return callnode = treeutil.selectNode(node, "../..") if variantoptimizer.isEnvironmentCall(callnode): className, classAttribute = self.getClassNameFromEnvKey( node.get("value", "")) if className: depsItem = DependencyItem(className, classAttribute, self.id, node.get('line', -1), inLoadContext) depsItem.isCall = True # treat as if actual call, to collect recursive deps if inLoadContext: depsItem.needsRecursion = True depsList.append(depsItem) node.dep = depsItem elif node.type == "body" and node.parent.type == "function": if (node.parent.hasParentContext("call/operand") or node.parent.hasParentContext("call/operand/group")): # if the function is immediately called, it's still load context (if that's what it was before) pass else: inLoadContext = False if node.hasChildren(): for child in node.children: self._analyzeClassDepsNode(child, depsList, inLoadContext, inDefer) return