dump.py
来自「编译工具」· Python 代码 · 共 444 行
PY
444 行
# -*- python -*-# Package : omniidl# idldump.py Created on: 1999/10/29# Author : Duncan Grisby (dpg1)## Copyright (C) 1999 AT&T Laboratories Cambridge## This file is part of omniidl.## omniidl is free software; you can redistribute it and/or modify it# under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU# General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA# 02111-1307, USA.## Description:# # Back-end which just dumps the IDL tree# $Id: dump.py,v 1.8.2.7 2002/02/25 15:02:18 dpg1 Exp $# $Log: dump.py,v $# Revision 1.8.2.7 2002/02/25 15:02:18 dpg1# Dump wstring constants properly.## Revision 1.8.2.6 2001/08/29 11:54:23 dpg1# Clean up const handling in IDL compiler.## Revision 1.8.2.5 2001/03/13 10:32:16 dpg1# Fixed point support.## Revision 1.8.2.4 2000/11/01 15:57:03 dpg1# More updates for 2.4.## Revision 1.8.2.3 2000/11/01 12:46:00 dpg1# Update to CORBA 2.4 specification.## Revision 1.8.2.2 2000/10/10 10:18:54 dpg1# Update omniidl front-end from omni3_develop.## Revision 1.6.2.3 2000/08/14 14:35:14 dpg1# IDL dumping now properly escapes string and char constants## Revision 1.6.2.2 2000/06/28 14:02:55 dpg1# Checked in wrong file. Changes backed out.## Revision 1.6.2.1 2000/06/28 13:54:53 dpg1# Remove dependency on traceback module.## Revision 1.6 1999/11/11 15:55:29 dpg1# Python back-end interface now supports valuetype declarations.# Back-ends still don't support them, though.## Revision 1.5 1999/11/02 17:07:23 dpg1# Changes to compile on Solaris.## Revision 1.4 1999/11/01 20:19:55 dpg1# Support for union switch types declared inside the switch statement.## Revision 1.3 1999/11/01 16:39:49 dpg1# Cosmetic change.## Revision 1.2 1999/11/01 10:06:07 dpg1# Various clean-ups.#"""Dumps the IDL tree"""from omniidl import idlast, idltype, idlutil, idlvisitor, outputimport sys, stringclass DumpVisitor (idlvisitor.AstVisitor, idlvisitor.TypeVisitor): def __init__(self, st): self.st = st def visitAST(self, node): for n in node.declarations(): n.accept(self) def visitModule(self, node): self.st.out("""\module @id@ {""", id = node.identifier()) self.st.inc_indent() for n in node.definitions(): n.accept(self) self.st.dec_indent() self.st.out("""\};""") def visitInterface(self, node): if len(node.inherits()) != 0: inheritl = [] for i in node.inherits(): inheritl.append("::" + idlutil.ccolonName(i.scopedName())) inherits = ": " + string.join(inheritl, ", ") + " " else: inherits = "" if node.abstract(): qual = "abstract " elif node.local(): qual = "local " else: qual = "" self.st.out("""\@qual@interface @id@ @inherits@{""", id = node.identifier(), inherits=inherits, qual=qual) self.st.inc_indent() for n in node.contents(): n.accept(self) self.st.dec_indent() self.st.out("""\};""") def visitForward(self, node): if node.abstract(): qual = "abstract " elif node.local(): qual = "local " else: qual = "" self.st.out("""\@qual@interface @id@;""", id = node.identifier(), qual=qual) def visitConst(self, node): node.constType().accept(self) type = self.__result_type if node.constKind() == idltype.tk_enum: value = "::" + idlutil.ccolonName(node.value().scopedName()) elif node.constKind() == idltype.tk_string: value = '"' + idlutil.escapifyString(node.value()) + '"' elif node.constKind() == idltype.tk_wstring: value = 'L"' + idlutil.escapifyWString(node.value()) + '"' elif node.constKind() == idltype.tk_wchar: value = "L'" + idlutil.escapifyWString([node.value()]) + "'" elif node.constKind() in [idltype.tk_float, idltype.tk_double, idltype.tk_longdouble]: value = idlutil.reprFloat(node.value()) elif node.constKind() == idltype.tk_fixed: value = node.value() + "d" else: value = str(node.value()) self.st.out("""\const @type@ @id@ = @value@;""", type=type, id=node.identifier(), value=value) def visitTypedef(self, node): if node.constrType(): node.aliasType().decl().accept(self) node.aliasType().accept(self) type = self.__result_type decll = [] for d in node.declarators(): d.accept(self) decll.append(self.__result_declarator) decls = string.join(decll, ", ") self.st.out("""\typedef @type@ @decls@;""", type=type, decls=decls) def visitStruct(self, node): self.st.out("""\struct @id@ {""", id = node.identifier()) for m in node.members(): if m.constrType(): self.st.inc_indent() m.memberType().decl().accept(self) self.st.dec_indent() m.memberType().accept(self) type = self.__result_type decll = [] for d in m.declarators(): d.accept(self) decll.append(self.__result_declarator) decls = string.join(decll, ", ") self.st.out("""\ @type@ @decls@;""", type=type, decls=decls) self.st.out("""\};""") def visitStructForward(self, node): self.st.out("""\struct @id@;""", id = node.identifier()) def visitException(self, node): self.st.out("""\exception @id@ {""", id = node.identifier()) for m in node.members(): if m.constrType(): self.st.inc_indent() m.memberType().decl().accept(self) self.st.dec_indent() m.memberType().accept(self) type = self.__result_type decll = [] for d in m.declarators(): d.accept(self) decll.append(self.__result_declarator) decls = string.join(decll, ", ") self.st.out("""\ @type@ @decls@;""", type=type, decls=decls) self.st.out("""\};""") def visitUnion(self, node): if node.constrType(): self.st.out("""\union @id@ switch (""", id = node.identifier()) self.st.inc_indent() node.switchType().decl().accept(self) self.st.out(""") {""") self.st.dec_indent else: node.switchType().accept(self) stype = self.__result_type self.st.out("""\union @id@ switch (@stype@) {""", id=node.identifier(), stype=stype) for c in node.cases(): if c.constrType(): self.st.inc_indent() c.caseType().decl().accept(self) self.st.dec_indent() for l in c.labels(): if l.default(): self.st.out("""\ default:""") else: if l.labelKind() == idltype.tk_enum: lv = "::" + idlutil.ccolonName(l.value().scopedName()) elif l.labelKind() == idltype.tk_char: lv = "'" + repr(l.value())[1:-1] + "'" else: lv = str(l.value()) self.st.out("""\ case @lv@:""", lv=lv) c.caseType().accept(self) type = self.__result_type c.declarator().accept(self) decl = self.__result_declarator self.st.out("""\ @type@ @decl@;""", type=type, decl=decl) self.st.out("};") def visitUnionForward(self, node): self.st.out("""\union @id@;""", id = node.identifier()) def visitEnum(self, node): enuml = [] for e in node.enumerators(): enuml.append(e.identifier()) enums = string.join(enuml, ", ") self.st.out("""\enum @id@ {@enums@};""", id=node.identifier(), enums=enums) def visitAttribute(self, node): if node.readonly(): readonly = "readonly " else: readonly = "" node.attrType().accept(self) type = self.__result_type ids = string.join(node.identifiers(), ", ") self.st.out("""\@readonly@attribute @type@ @ids@;""", readonly=readonly, type=type, ids=ids) def visitOperation(self, node): if node.oneway(): oneway = "oneway " else: oneway = "" node.returnType().accept(self) rtype = self.__result_type paraml = [] for p in node.parameters(): if p.is_in() and p.is_out(): inout = "inout" elif p.is_in(): inout = "in" else: inout = "out" p.paramType().accept(self) type = self.__result_type paraml.append(inout + " " + type + " " + p.identifier()) params = string.join(paraml, ", ") if len(node.raises()) > 0: raisel = [] for r in node.raises(): ename = idlutil.ccolonName(r.scopedName()) raisel.append(ename) raises = " raises (" + string.join(raisel, ", ") + ")" else: raises = "" self.st.out("""\@oneway@@rtype@ @id@(@params@)@raises@;""", oneway=oneway, rtype=rtype, id=node.identifier(), params=params, raises=raises) def visitNative(self, node): self.st.out("""\native @id@;""", id=node.identifier()) def visitDeclarator(self, node): l = [node.identifier()] for s in node.sizes(): l.append("[" + str(s) + "]") self.__result_declarator = string.join(l, "") ttsMap = { idltype.tk_void: "void", idltype.tk_short: "short", idltype.tk_long: "long", idltype.tk_ushort: "unsigned short", idltype.tk_ulong: "unsigned long", idltype.tk_float: "float", idltype.tk_double: "double", idltype.tk_boolean: "boolean", idltype.tk_char: "char", idltype.tk_octet: "octet", idltype.tk_any: "any", idltype.tk_TypeCode: "CORBA::TypeCode", idltype.tk_Principal: "CORBA::Principal", idltype.tk_longlong: "long long", idltype.tk_ulonglong: "unsigned long long", idltype.tk_longdouble: "long double", idltype.tk_wchar: "wchar" } def visitBaseType(self, type): self.__result_type = self.ttsMap[type.kind()] def visitStringType(self, type): if type.bound() == 0: self.__result_type = "string" else: self.__result_type = "string<" + str(type.bound()) + ">" def visitWStringType(self, type): if type.bound() == 0: self.__result_type = "wstring" else: self.__result_type = "wstring<" + str(type.bound()) + ">" def visitSequenceType(self, type): type.seqType().accept(self) if type.bound() == 0: self.__result_type = "sequence<" + self.__result_type + ">" else: self.__result_type = "sequence<" + self.__result_type + ", " +\ str(type.bound()) + ">" def visitFixedType(self, type): if type.digits() > 0: self.__result_type = "fixed<" + str(type.digits()) + "," +\ str(type.scale()) + ">" else: self.__result_type = "fixed" def visitDeclaredType(self, type): self.__result_type = "::" + \ idlutil.ccolonName(type.decl().scopedName())def run(tree, args): st = output.Stream(sys.stdout, 2) dv = DumpVisitor(st) tree.accept(dv)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?