def exportLexems(self, lexems, style): if self.owner.isModule() and 'public' in self.attrs: lexems += [Lex.keyword('export'), Lex.space] lexems += [ Lex.keyword('class'), Lex.space, Lex.className(self.getName()) ] parent = self.getParent() if parent: lexems += [ Lex.space, Lex.keyword('extends'), Lex.space, Lex.className(parent.getName()) ] lexems.append(Lex.bodyBegin) for taxon in self.items: taxon.exportLexems(lexems, style) lexems.append(Lex.bodyEnd)
def exportLexems(self, level, lexems, style): target = self.getCaller().getTarget() constr = target.findConstructor() newLex = [Lex.className(target.getName())] if constr and constr.type == 'overload': if not self.overloadKey: pass else: realConstr = constr.getImplementationByKey(self.overloadKey) if realConstr.isStatic(): newLex += [ Lex.dot, Lex.funcName(TaxonAltName.getAltName(realConstr)) ] lexems += newLex lexems.append(Lex.bracketBegin) args = self.getArguments() if len(args): for arg in args: arg.exportLexems(level, lexems, style) lexems.append(Lex.paramDiv) lexems[-1] = Lex.paramDivLast lexems.append(Lex.bracketEnd)
def exportLexems(self, lexems, style): target = self.getCaller().getTarget() lexTargetName = Lex.className(target.getName()) bNew = True if self.overloadKey: # Static constructor conOver = target.findConstructor() realConstr = conOver.getImplementationByKey(self.overloadKey) if realConstr.isStatic(): lexems += [ lexTargetName, Lex.dot, Lex.funcName(realConstr.getName()) ] bNew = False if bNew: lexems += [Lex.keyword('new'), Lex.space, lexTargetName] lexems.append(Lex.paramsBegin) args = self.getArguments() if len(args) > 0: for arg in args: arg.exportLexems(lexems, style) lexems.append(Lex.paramDiv) lexems[-1] = Lex.paramDivLast lexems.append(Lex.paramsEnd)
def exportLexems(self, level, lexems, style): line = [Lex.keyword('class'), Lex.space, Lex.className(self.getName())] parent = self.getParent() if parent: line += [ Lex.bracketBegin, Lex.className(parent.getName()), Lex.bracketEnd ] # Интерфейсы включать нет смысла, т.к в питоне утиная типизация, а наличие реализуемых методов проверяется в WPP line.append(Lex.colon) self.exportLine(level, lexems, style, line) bodyLevel = level + 1 self.exportInternalComment(bodyLevel, lexems, style) # Разделить члены класса по категориям staticFields = [] fields = [] methods = [] if len(self.getMembers()) == 0: self.exportLine(bodyLevel, lexems, style, [Lex.keyword('pass')]) for member in self.getMembers(): if member.type == 'field': if member.isStatic(): staticFields.append(member) else: fields.append(member) elif member.type in ('method', 'operator', 'overload'): methods.append(member) # TODO: потом появятся конструктор, операторы и тп # Обозначить список нестатических полей через __slots__ if len(fields) > 0: line = [Lex.keyword('__slots__'), Lex.binop('='), Lex.bracketBegin] for f in fields: line.append(Lex.stringRaw(f.getName(), style)) line.append(Lex.itemDiv) line[-1] = Lex.itemDivLast line.append(Lex.bracketEnd) self.exportLine(bodyLevel, lexems, style, line) # Список статическиз полей (точнее, в питоне это переменныхе класса. но работают так же как статические) for field in staticFields: line = [Lex.varName(field.getName()), Lex.binop('=')] field.getValueTaxon().exportLexems(0, line, style) self.exportLine(bodyLevel, lexems, style, line) # Поля надо определить в конструкторе con = self.findConstructor() if con == None: self.exportZeroConstructor(bodyLevel, lexems, style, fields) else: if self.isNeedAutoConstructor(): self.exportZeroConstructor(bodyLevel, lexems, style, fields) con.exportLexems(bodyLevel, lexems, style) # Методы for method in methods: method.exportLexems(bodyLevel, lexems, style)