def findClassForMethod(clazzId, methodId, variants): def classHasOwnMethod(classAttribs, methId): candidates = {} candidates.update(classAttribs.get("members",{})) candidates.update(classAttribs.get("statics",{})) if "construct" in classAttribs: candidates.update(dict((("construct", classAttribs.get("construct")),))) if methId in candidates.keys(): return candidates[methId] # return the definition of the attribute else: return None # get the method name if methodId == u'': # corner case: the class is being called methodId = "construct" elif methodId == "getInstance": # corner case: singletons get this from qx.Class clazzId = "qx.Class" # TODO: getter/setter are also not statically available! # handle .call() ?! if clazzId in lang.BUILTIN: # these are automatically fullfilled, signal this return True, True elif clazzId not in self._classesObj: # can't further process non-qooxdoo classes return None, None tree = self._classesObj[clazzId].tree( variants) clazz = treeutil.findQxDefine(tree) classAttribs = treeutil.getClassMap(clazz) keyval = classHasOwnMethod(classAttribs, methodId) if keyval: return clazzId, keyval # inspect inheritance/mixins parents = [] extendVal = classAttribs.get('extend', None) if extendVal: extendVal = treeutil.variableOrArrayNodeToArray(extendVal) parents.extend(extendVal) includeVal = classAttribs.get('include', None) if includeVal: includeVal = treeutil.variableOrArrayNodeToArray(includeVal) parents.extend(includeVal) # go through all ancestors for parClass in parents: rclass, keyval = findClassForMethod(parClass, methodId, variants) if rclass: return rclass, keyval return None, None
def findClassForFeature(self, featureId, variants, classMaps): # get the method name clazzId = self.id if featureId == u'': # corner case: bare class reference outside "new ..." return clazzId, featureId # TODO: The next doesn't provide much, qx.Class.getInstance has no new dependencies # currently (aside from "new this", which I cannot relate back to 'construct' # ATM). Leave it in anyway, to not break bug#5660. #elif featureId == "getInstance": # corner case: singletons get this from qx.Class # clazzId = "qx.Class" elif featureId == "getInstance" and self.type == "singleton": featureId = "construct" elif featureId in ('call', 'apply'): # this might get overridden, oh well... clazzId = "Function" # TODO: getter/setter are also not lexically available! # handle .call() ?! if clazzId not in self._classesObj: # can't further process non-qooxdoo classes # TODO: maybe this should better use something like isInterestingIdentifier() # to invoke the same machinery for filtering references like in other places return None, None # early return if class id is finalized if clazzId != self.id: classObj = self._classesObj[clazzId] featureNode = self.getFeatureNode(featureId, variants) if featureNode: return clazzId, featureNode else: return None, None # now try this class if self.id in classMaps: classMap = classMaps[self.id] else: classMap = classMaps[self.id] = self.getClassMap (variants) featureNode = self.getFeatureNode(featureId, variants, classMap) if featureNode: return self.id, featureNode if featureId == 'construct': # constructor requested, but not supplied in class map # supply the default constructor featureNode = treeutil.compileString("function(){this.base(arguments);}", self.path) return self.id, featureNode # inspect inheritance/mixins parents = [] extendVal = classMap.get('extend', None) if extendVal: extendVal = treeutil.variableOrArrayNodeToArray(extendVal) parents.extend(extendVal) # this.base calls if featureId == "base": classId = parents[0] # first entry must be super-class if classId in self._classesObj: return self._classesObj[classId].findClassForFeature('construct', variants, classMaps) else: return None, None includeVal = classMap.get('include', None) if includeVal: # 'include' value according to Class spec. if includeVal.type in ('variable', 'array'): includeVal = treeutil.variableOrArrayNodeToArray(includeVal) # assume qx.core.Environment.filter() call else: filterMap = variantoptimizer.getFilterMap(includeVal, self.id) includeSymbols = [] for key, node in filterMap.items(): # only consider true or undefined #if key not in variants or (key in variants and bool(variants[key]): # map value has to be value/variable variable = node.children[0] assert variable.type == "variable" symbol, isComplete = treeutil.assembleVariable(variable) assert isComplete includeSymbols.append(symbol) includeVal = includeSymbols parents.extend(includeVal) # go through all ancestors for parClass in parents: if parClass not in self._classesObj: continue parClassObj = self._classesObj[parClass] rclass, keyval = parClassObj.findClassForFeature(featureId, variants, classMaps) if rclass: return rclass, keyval return None, None
def findClassForFeature(self, featureId, variants, classMaps): # get the method name clazzId = self.id if featureId == u'': # corner case: bare class reference outside "new ..." return clazzId, featureId # TODO: The next doesn't provide much, qx.Class.getInstance has no new dependencies # currently (aside from "new this", which I cannot relate back to 'construct' # ATM). Leave it in anyway, to not break bug#5660. #elif featureId == "getInstance": # corner case: singletons get this from qx.Class # clazzId = "qx.Class" elif featureId == "getInstance" and self.type == "singleton": featureId = "construct" elif featureId in ('call', 'apply'): # this might get overridden, oh well... clazzId = "Function" # TODO: getter/setter are also not lexically available! # handle .call() ?! if clazzId not in ClassesAll: # can't further process non-qooxdoo classes # TODO: maybe this should better use something like isInterestingIdentifier() # to invoke the same machinery for filtering references like in other places return None, None # early return if class id is finalized if clazzId != self.id: classObj = ClassesAll[clazzId] featureNode = self.getFeatureNode(featureId, variants) if featureNode: return clazzId, featureNode else: return None, None # now try this class if self.id in classMaps: classMap = classMaps[self.id] else: classMap = classMaps[self.id] = self.getClassMap (variants) featureNode = self.getFeatureNode(featureId, variants, classMap) if featureNode: return self.id, featureNode if featureId == 'construct': # constructor requested, but not supplied in class map # supply the default constructor featureNode = treeutil.compileString("function(){this.base(arguments);}", self.path) # the next is a hack to provide minimal scope info featureNode.set("treegenerator_tag", 1) featureNode = scopes.create_scopes(featureNode) return self.id, featureNode # inspect inheritance/mixins parents = [] extendVal = classMap.get('extend', None) if extendVal: extendVal = treeutil.variableOrArrayNodeToArray(extendVal) parents.extend(extendVal) # this.base calls if featureId == "base": classId = parents[0] # first entry must be super-class if classId in ClassesAll: return ClassesAll[classId].findClassForFeature('construct', variants, classMaps) else: return None, None includeVal = classMap.get('include', None) if includeVal: # 'include' value according to Class spec. if includeVal.type in NODE_VARIABLE_TYPES + ('array',): includeVal = treeutil.variableOrArrayNodeToArray(includeVal) # assume qx.core.Environment.filter() call else: filterMap = variantoptimizer.getFilterMap(includeVal, self.id) includeSymbols = [] for key, node in filterMap.items(): # only consider true or undefined #if key not in variants or (key in variants and bool(variants[key]): # map value has to be value/variable variable = node.children[0] assert variable.isVar() symbol, isComplete = treeutil.assembleVariable(variable) assert isComplete includeSymbols.append(symbol) includeVal = includeSymbols parents.extend(includeVal) # go through all ancestors for parClass in parents: if parClass not in ClassesAll: continue parClassObj = ClassesAll[parClass] rclass, keyval = parClassObj.findClassForFeature(featureId, variants, classMaps) if rclass: return rclass, keyval return None, None
def findClassForFeature(self, featureId, variants, classMaps): # get the method name clazzId = self.id if featureId == u'': # corner case: bare class reference outside "new ..." return clazzId, featureId elif featureId == "getInstance": # corner case: singletons get this from qx.Class clazzId = "qx.Class" elif featureId in ('call', 'apply'): # this might get overridden, oh well... clazzId = "Function" # TODO: getter/setter are also not lexically available! # handle .call() ?! if clazzId not in self._classesObj: # can't further process non-qooxdoo classes # TODO: maybe this should better use something like isInterestingIdentifier() # to invoke the same machinery for filtering references like in other places return None, None # early return if class id is finalized if clazzId != self.id: classObj = self._classesObj[clazzId] featureNode = self.getFeatureNode(featureId, variants) if featureNode: return clazzId, featureNode else: return None, None # now try this class if self.id in classMaps: classMap = classMaps[self.id] else: classMap = classMaps[self.id] = self.getClassMap (variants) featureNode = self.getFeatureNode(featureId, variants, classMap) if featureNode: return self.id, featureNode if featureId == 'construct': # constructor requested, but not supplied in class map # supply the default constructor featureNode = treeutil.compileString("function(){this.base(arguments);}", self.path) return self.id, featureNode # inspect inheritance/mixins parents = [] extendVal = classMap.get('extend', None) if extendVal: extendVal = treeutil.variableOrArrayNodeToArray(extendVal) parents.extend(extendVal) # this.base calls if featureId == "base": classId = parents[0] # first entry must be super-class if classId in self._classesObj: return self._classesObj[classId].findClassForFeature('construct', variants, classMaps) else: return None, None includeVal = classMap.get('include', None) if includeVal: # 'include' value according to Class spec. if includeVal.type in ('variable', 'array'): includeVal = treeutil.variableOrArrayNodeToArray(includeVal) # assume qx.core.Variant.select() call else: _, branchMap = variantoptimizer.getSelectParams(includeVal) includeVal = set() for key in branchMap: # just pick up all possible include values includeVal.update(treeutil.variableOrArrayNodeToArray(branchMap[key])) includeVal = list(includeVal) parents.extend(includeVal) # go through all ancestors for parClass in parents: if parClass not in self._classesObj: continue parClassObj = self._classesObj[parClass] rclass, keyval = parClassObj.findClassForFeature(featureId, variants, classMaps) if rclass: return rclass, keyval return None, None