summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/ipdl/cgen.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/ipdl/cgen.py')
-rw-r--r--ipc/ipdl/ipdl/cgen.py108
1 files changed, 108 insertions, 0 deletions
diff --git a/ipc/ipdl/ipdl/cgen.py b/ipc/ipdl/ipdl/cgen.py
new file mode 100644
index 0000000000..8ed8da4d81
--- /dev/null
+++ b/ipc/ipdl/ipdl/cgen.py
@@ -0,0 +1,108 @@
+# 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 sys
+
+from ipdl.ast import Visitor
+
+
+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) # NOQA: F821
+
+ 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()
+
+ 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()