Example #1
0
 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)
Example #2
0
 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)
Example #3
0
 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)
Example #4
0
    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)