mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-06-06 22:29:34 +00:00
102 lines
3.2 KiB
Python
102 lines
3.2 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
import os, sys
|
|
|
|
from ipdl.ast import Visitor
|
|
from ipdl.ast import IN, OUT, INOUT, ASYNC, SYNC, INTR
|
|
|
|
class CodePrinter:
|
|
def __init__(self, outf=sys.stdout, indentCols=4):
|
|
self.outf = outf
|
|
self.col = 0
|
|
self.indentCols = indentCols
|
|
|
|
def write(self, str):
|
|
self.outf.write(str)
|
|
|
|
def printdent(self, str=''):
|
|
self.write((' '* self.col) + str)
|
|
|
|
def println(self, str=''):
|
|
self.write(str +'\n')
|
|
|
|
def printdentln(self, str):
|
|
self.write((' '* self.col) + str +'\n')
|
|
|
|
def indent(self): self.col += self.indentCols
|
|
def dedent(self): self.col -= self.indentCols
|
|
|
|
|
|
##-----------------------------------------------------------------------------
|
|
class IPDLCodeGen(CodePrinter, Visitor):
|
|
'''Spits back out equivalent IPDL to the code that generated this.
|
|
Also known as pretty-printing.'''
|
|
|
|
def __init__(self, outf=sys.stdout, indentCols=4, printed=set()):
|
|
CodePrinter.__init__(self, outf, indentCols)
|
|
self.printed = printed
|
|
|
|
def visitTranslationUnit(self, tu):
|
|
self.printed.add(tu.filename)
|
|
self.println('//\n// Automatically generated by ipdlc\n//')
|
|
CodeGen.visitTranslationUnit(self, tu)
|
|
|
|
def visitCxxInclude(self, inc):
|
|
self.println('include "'+ inc.file +'";')
|
|
|
|
def visitProtocolInclude(self, inc):
|
|
self.println('include protocol "'+ inc.file +'";')
|
|
if inc.tu.filename not in self.printed:
|
|
self.println('/* Included file:')
|
|
IPDLCodeGen(outf=self.outf, indentCols=self.indentCols,
|
|
printed=self.printed).visitTranslationUnit(inc.tu)
|
|
|
|
self.println('*/')
|
|
|
|
def visitProtocol(self, p):
|
|
self.println()
|
|
for namespace in p.namespaces: namespace.accept(self)
|
|
|
|
self.println('%s protocol %s\n{'% (p.sendSemantics[0], p.name))
|
|
self.indent()
|
|
|
|
for mgs in p.managesStmts:
|
|
mgs.accept(self)
|
|
if len(p.managesStmts): self.println()
|
|
|
|
for msgDecl in p.messageDecls: msgDecl.accept(self)
|
|
self.println()
|
|
|
|
for transStmt in p.transitionStmts: transStmt.accept(self)
|
|
|
|
self.dedent()
|
|
self.println('}')
|
|
self.write('}\n'* len(p.namespaces))
|
|
|
|
def visitManagerStmt(self, mgr):
|
|
self.printdentln('manager '+ mgr.name +';')
|
|
|
|
def visitManagesStmt(self, mgs):
|
|
self.printdentln('manages '+ mgs.name +';')
|
|
|
|
def visitMessageDecl(self, msg):
|
|
self.printdent('%s %s %s('% (msg.sendSemantics[0], msg.direction[0], msg.name))
|
|
for i, inp in enumerate(msg.inParams):
|
|
inp.accept(self)
|
|
if i != (len(msg.inParams) - 1): self.write(', ')
|
|
self.write(')')
|
|
if 0 == len(msg.outParams):
|
|
self.println(';')
|
|
return
|
|
|
|
self.println()
|
|
self.indent()
|
|
self.printdent('returns (')
|
|
for i, outp in enumerate(msg.outParams):
|
|
outp.accept(self)
|
|
if i != (len(msg.outParams) - 1): self.write(', ')
|
|
self.println(');')
|
|
self.dedent()
|