コード例 #1
0
    def writepy(self, w: FileWriter) -> None:
        assert not self._isasync, "async FunctionSpec not yet supported in Python"

        # first write out overloads
        for overload in self._overloads:
            overload.writepy(w)

        # blank line
        w.blank()

        # decorators
        if self._isstaticmethod:
            w.line0('@staticmethod')

        for dec in self._decorators_py:
            w.line0(dec)
        if self._isabstract:
            w.line0('@abc.abstractmethod')

        # header
        w.line0(f'def {self._name}(')

        if self._ismethod and not self._isstaticmethod:
            w.line1('self,')

        for argname, crosstype, argdefault in self._pargs:
            argstr = argname + ': ' + crosstype.getQuotedPyType()
            if argdefault is not None:
                argstr += ' = ' + argdefault.getPyExpr()[0]
            w.line1(argstr + ',')
        if len(self._kwargs):
            # mark start of kwargs
            w.line1('*,')
        for argname, argtype, argdefault in self._kwargs:
            argstr = argname
            argstr += ': ' + argtype.getQuotedPyType()
            if argdefault is not None:
                argstr += ' = ' + argdefault.getPyExpr()[0]
            w.line1(argstr + ',')

        if self._rettype is None:
            w.line0(f') -> None:')
        else:
            w.line0(f') -> {self._rettype.getQuotedPyType()}:')

        if self._docstring:
            w.line1('"""')
            for docline in self._docstring:
                w.line1(docline.strip())
            w.line1('"""')
            havebody = True

        havebody = False

        for stmt in self._statements:
            stmt.writepy(w.with_more_indent())
            havebody = True

        if not havebody:
            w.line1('pass')
コード例 #2
0
    def writephp(self, w: FileWriter) -> None:
        w.line0(f'if ({self._expr.getPHPExpr()[0]}) {{')
        for stmt in self._statements:
            stmt.writephp(w.with_more_indent())
        w.line0('}')

        # always put a blank line after a conditional
        w.blank()
コード例 #3
0
 def writepy(self, w: FileWriter) -> None:
     w.line0(
         f'for {self._assign.getPyExpr()[0]} in {self._expr.getPyExpr()[0]}:'
     )
     for stmt in self._statements:
         stmt.writepy(w.with_more_indent())
     # always put a blank line after a for loop
     w.blank()
コード例 #4
0
 def writets(self, w: FileWriter) -> None:
     w.line0(
         f'for (let {self._assign.getTSExpr()[0]} of {self._expr.getTSExpr()[0]}) {{'
     )
     for stmt in self._statements:
         stmt.writets(w.with_more_indent())
     w.line0(f'}}')
     # always put a blank line after a for loop
     w.blank()
コード例 #5
0
    def writepy(self, w: FileWriter) -> None:
        havebody = False
        bases = self._bases[:]

        # write out class header
        if self._isabstract:
            bases.append('abc.ABC')
        if self._isdataclass:
            w.line0('@dataclasses.dataclass')

        parents = ', '.join(bases)
        if parents:
            parents = '(' + parents + ')'
        w.line0(f'class {self._name}{parents}:')
        if self._docstring:
            w.line1('"""')
            for docline in self._docstring:
                w.line1(docline.strip())
            w.line1('"""')
            w.blank()
            havebody = True

        # first write out properties
        for prop in self._properties:
            w.line1(f'{prop.propname}: {prop.proptype.getQuotedPyType()}')
        if self._properties:
            w.blank()
            havebody = True

        # add an __init__() method to set default values
        initspec = self._getInitSpec("python")
        if initspec:
            initspec.writepy(w.with_more_indent())
            w.blank()
            havebody = True

        # all other methods
        for method in self._methods:
            method.writepy(w.with_more_indent())
            w.blank()
            havebody = True

        for comment in self._remarks:
            w.line1('# ' + comment)
            w.blank()

        if not havebody:
            w.line1('pass')
コード例 #6
0
    def writephp(self, w: FileWriter) -> None:
        prefix = ''

        if self._isabstract:
            prefix += 'abstract '

        if self._docstring:
            w.line0('/**')
            for docline in self._docstring:
                w.line0(' * ' + docline.strip())
            w.line0(' */')

        extends = ''
        if len(self._bases):
            assert len(self._bases) <= 1
            extends = ' extends ' + self._bases[0]

        w.line0(f"{prefix}class {self._name}{extends} {{")

        needemptyline = False

        # first write out properties
        for prop in self._properties:
            assign = ''

            # only assign values in the class body if the value is a literal
            if prop.propdefault and isinstance(prop.propdefault, PanLiteral):
                assign = ' = ' + prop.propdefault.getPHPExpr()[0]

            phptypes = prop.proptype.getPHPTypes()
            w.line1(f'/** @var {phptypes[1]} */')
            w.line1(f'public ${prop.propname}{assign};')
            needemptyline = True

        # add an __init__() method to set default values
        constructor = self._getInitSpec("php")
        if constructor:
            if needemptyline:
                w.blank()
            constructor.writephp(w.with_more_indent())
            needemptyline = True

        # all other methods
        for method in self._methods:
            if needemptyline:
                w.blank()
            method.writephp(w.with_more_indent())
            needemptyline = True

        if needemptyline:
            for comment in self._remarks:
                w.line1('// ' + comment)
                w.blank()

        w.line0("}")
コード例 #7
0
 def writepy(self, w: FileWriter) -> None:
     w.line0(f'if {self._expr.getPyExpr()[0]}:')
     for stmt in self._statements:
         stmt.writepy(w.with_more_indent())
     # always put a blank line after a conditional
     w.blank()
コード例 #8
0
 def writephp(self, w: FileWriter) -> None:
     w.blank()
コード例 #9
0
    def writets(self, w: FileWriter) -> None:
        prefix = ''
        if self._tsexport:
            prefix = 'export '

        if self._isabstract:
            prefix += 'abstract '

        extends = ''
        if self._tsbase:
            extends = f" extends {self._tsbase}"

        w.line0(f"{prefix}class {self._name}{extends} {{")

        needemptyline = False

        if self._docstring:
            for docline in self._docstring:
                w.line1('// ' + docline.strip())
            needemptyline = True

        # first write out properties
        if self._properties and needemptyline:
            w.blank()
        for prop in self._properties:
            if prop.tsobservable:
                w.blank()
                w.line1(f'@observable')
            if prop.tsreadonly:
                prefix = 'readonly '
            else:
                prefix = 'public '
            assign = ''

            # only assign values in the class body if the value is a literal
            if prop.propdefault and isinstance(prop.propdefault, PanLiteral):
                assign = ' = ' + prop.propdefault.getTSExpr()[0]

            w.line1(
                f'{prefix}{prop.propname}: {prop.proptype.getTSType()[0]}{assign};'
            )
            needemptyline = True

        # add an __init__() method to set default values
        constructor = self._getInitSpec("typescript")
        if constructor:
            if needemptyline:
                w.blank()
            constructor.writets(w.with_more_indent())
            needemptyline = True

        # all other methods
        for method in self._methods:
            if needemptyline:
                w.blank()
            method.writets(w.with_more_indent())
            needemptyline = True

        for comment in self._remarks:
            w.line1('// ' + comment)
            w.blank()

        w.line0("}")