Exemple #1
0
 def testParams(self):
     style['printWidth'] = 1000
     # function applyStyle(lexems: Lexem[], pos: number, isVertical: boolean, style: Styles): {value: string, pos: number} {}
     lexems = [
         ('function', 'keyword'),
         Lex.space,
         ('applyStyle', 'funcName'),
         Lex.paramsBegin,
         ('lexems', 'varName'),
         Lex.colon,
         ('Lexem', 'typeName'),
         Lex.arrayBegin,
         Lex.arrayEnd,
         Lex.paramDiv,
         ('pos', 'varName'),
         Lex.colon,
         Lex.typeName('number'),
         Lex.paramDiv,
         Lex.varName('isVertical'),
         Lex.colon,
         Lex.typeName('boolean'),
         Lex.paramDiv,
         Lex.varName('style'),
         Lex.colon,
         Lex.typeName('Styles'),
         Lex.paramsEnd,
         Lex.colon,
         Lex.objBegin,
         Lex.fieldName('value'),
         Lex.colon,
         Lex.typeName('string'),
         Lex.itemDiv,
         Lex.fieldName('pos'),
         Lex.colon,
         Lex.typeName('number'),
         Lex.objEnd,
         Lex.bodyBegin,
         Lex.bodyEnd,
     ]
     outRows = []
     formatLexems(outRows, lexems, 0, 0, style)
     # for row in outRows:
     # 	print('<<<%s>>>' % row.replace(' ', '_'))
     self.assertEqual(outRows, [
         "function applyStyle(lexems: Lexem[], pos: number, isVertical: boolean, style: Styles): {value: string, pos: number} {",
         "}"
     ])
Exemple #2
0
 def exportLexems(self, level, lexems, style):
     self.exportExternalComment(level, lexems, style)
     line = [
         Lex.keyword('self'), Lex.dot,
         Lex.varName(self.getName()),
         Lex.binop('=')
     ]
     self.getValueTaxon().exportLexems(0, line, style)
     self.exportLine(level, lexems, style, line)
Exemple #3
0
 def exportLexems(self, lexems, rules):
     lexems.append(Lex.varName(self.getName()))
     val = self.getValueTaxon()
     if val:
         lexems.append(Lex.binop('='))
         val.exportLexems(lexems, rules)
     else:
         lexems.append(Lex.colon)
         self.getTypeTaxon().exportLexems(lexems, rules)
Exemple #4
0
def exportVar(var, lexems, rules):
    if var.type == 'field':
        lexems.append(Lex.fieldName(var.getName()))
    else:
        lexems.append(Lex.varName(var.getName()))
    # Возможна ситуация, когда тип не указывается при объявлении. Если он следует из выражения
    txType = var.getTypeTaxon()
    if 'hiddenType' not in var.attrs:
        lexems.append(Lex.colon)
        txType.exportLexems(lexems, rules)

    txValue = var.getValueTaxon()
    if txValue:
        lexems.append(Lex.binop('='))
        txValue.exportLexems(lexems, rules)
Exemple #5
0
 def exportLexems(self, level, lexems, style):
     lexems.append(Lex.varName(self.getName()))
     val = self.getValueTaxon()
     if val:
         lexems.append(Lex.binop('='))
         val.exportLexems(0, lexems, style)
Exemple #6
0
 def exportLexems(self, level, lexems, rules):
     """ Экспорт объявления переменной, как отдельной строки """
     self.exportExternalComment(level, lexems, rules)
     line = [Lex.varName(self.getName()), Lex.binop('=')]
     self.getValueTaxon().exportLexems(level, line, rules)
     self.exportLine(level, lexems, rules, line)
    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)
Exemple #8
0
 def exportLexems(self, lexems, style):
     target = self.getTarget()
     lexems.append(Lex.varName(target.getName()))