home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
fnb101.zip
/
Lib
/
site-packages
/
Fnorb
/
compiler
/
CodeGenerator.py
next >
Wrap
Text File
|
1999-06-28
|
8KB
|
251 lines
#!/usr/bin/env python
#############################################################################
# Copyright (C) DSTC Pty Ltd (ACN 052 372 577) 1997, 1998, 1999
# All Rights Reserved.
#
# The software contained on this media is the property of the DSTC Pty
# Ltd. Use of this software is strictly in accordance with the
# license agreement in the accompanying LICENSE.HTML file. If your
# distribution of this software does not contain a LICENSE.HTML file
# then you have no rights to use this software in any manner and
# should contact DSTC at the address below to determine an appropriate
# licensing arrangement.
#
# DSTC Pty Ltd
# Level 7, GP South
# Staff House Road
# University of Queensland
# St Lucia, 4072
# Australia
# Tel: +61 7 3365 4310
# Fax: +61 7 3365 4311
# Email: enquiries@dstc.edu.au
#
# This software is being provided "AS IS" without warranty of any
# kind. In no event shall DSTC Pty Ltd be liable for damage of any
# kind arising out of or in connection with the use or performance of
# this software.
#
# Project: Fnorb
# File: $Source: /units/arch/src/Fnorb/compiler/RCS/CodeGenerator.py,v $
# Version: @(#)$RCSfile: CodeGenerator.py,v $ $Revision: 1.8 $
#
#############################################################################
""" Base class for Python code generators for OMG IDL. """
# Standard/built-in modules.
import errno, os
# Fnorb modules.
from Fnorb.orb import CORBA, Util
class CodeGenerator:
""" Base class for Python code generators for OMG IDL. """
def generate(self, context, file, ifr_object, indent):
""" Generate Python code for an Interface Repository object. """
# Find out the kind of definition that the IR object represents.
def_kind = ifr_object._get_def_kind()
# Attribute.
if def_kind == CORBA.dk_Attribute:
self._generate_attribute(context, file, ifr_object, indent)
# Constant.
elif def_kind == CORBA.dk_Constant:
self._generate_constant(context, file, ifr_object, indent)
# Exception.
elif def_kind == CORBA.dk_Exception:
self._generate_exception(context, file, ifr_object, indent)
# Interface.
elif def_kind == CORBA.dk_Interface:
self._generate_interface(context, file, ifr_object, indent)
# Module.
elif def_kind == CORBA.dk_Module:
self._generate_module(context, file, ifr_object, indent)
# Operation.
elif def_kind == CORBA.dk_Operation:
self._generate_operation(context, file, ifr_object, indent)
# Structure.
elif def_kind == CORBA.dk_Struct:
self._generate_struct(context, file, ifr_object, indent)
# Union.
elif def_kind == CORBA.dk_Union:
self._generate_union(context, file, ifr_object, indent)
# Enumeration.
elif def_kind == CORBA.dk_Enum:
self._generate_enum(context, file, ifr_object, indent)
# Alias.
elif def_kind == CORBA.dk_Alias:
self._generate_alias(context, file, ifr_object, indent)
# Anything else, we just ignore ;^)
else:
pass
return
#########################################################################
# Protected interface.
#########################################################################
def _indent(self, indent):
""" Produce the indentation for the specified indent level! """
# 1234 ;^)
return ' ' * indent
def _create_package(self, context, package, module_id=''):
""" Create a new Python package. """
# Create the full package name relative to the context's package.
package = context.package() + Util.PackageName(package)
# Make sure that all of the intermediate packages in the path actually
# exist (and create them if they don't!).
for i in range(1, len(package)):
# Create the pathname of the intermediate package relative to the
# context's target directory.
package_path = context.create_package_path(package[:i])
# Create the package directory.
try:
os.mkdir(package_path)
# If the package already exists then carry on!
except os.error, (code, message):
if code != errno.EEXIST:
raise os.error, (code, message)
# See if the package already has an '__init__.py' module.
try:
file = open('%s/__init__.py' % package_path, 'r')
file.close()
# If it doesn't, then create one.
except IOError:
file = open('%s/__init__.py' % package_path, 'w')
file.close()
# Create the pathname of the package relative to the context's target
# directory.
package_path = context.create_package_path(package)
# Create the package directory.
try:
os.mkdir(package_path)
# If the package already exists then carry on!
except os.error, (code, message):
if code != errno.EEXIST:
raise os.error, (code, message)
# Create/open the package's '__init__' module.
file = open('%s/__init__.py' % package_path, 'w')
# Documentation string.
file.write('""" Module: %s\n\n' % module_id)
file.write("Automagically generated by:-\n")
file.write("\n")
file.write("%s\n" % CORBA.ORB_ID)
file.write("\n")
file.write('"""\n\n')
# Repository id attribute.
file.write('_FNORB_ID = "%s"\n\n' % module_id)
# Python 'import' statements.
file.write("# Fnorb modules.\n")
file.write("import Fnorb.orb.CORBA\n")
file.write("import Fnorb.orb.TypeManager\n")
file.write("import Fnorb.orb.Util\n\n")
## file.write("from Fnorb.orb import CORBA, TypeManager, Util\n\n")
return file
def _end_package(self, file, indent):
""" Add any stuff required at the end of the package!
Currently this is just an EOF marker!
"""
# EOF marker.
file.write(self._indent(indent))
file.write('#' * 77)
file.write('\n')
return
def _write_typecode_constant(self, file, indent, ifr_id, tc, name):
""" Generate code to add a typecode constant. """
# Create the typecode constant.
typecode_constant = tc._fnorb_to_constant()
# Generate the code to add the type to the Type Manager.
file.write(self._indent(indent))
file.write('Fnorb.orb.TypeManager.TypeManager_init().add_type')
file.write('("%s", "%s", %s)\n\n' % (ifr_id, typecode_constant, name))
return
def _get_typecode(self, typecode):
""" Get the typecode 'string' for the given typecode. """
# Primitive typecodes have a '_fnorb_code' method that generates the
# appropriate string.
if hasattr(typecode, '_fnorb_code'):
result = typecode._fnorb_code()
# Otherwise, generate a call to get the typecode from the typecode
# manager.
else:
result = 'Fnorb.orb.CORBA.typecode("%s")' % typecode.id()
return result
# Override these methods to generate the code for each IFR object that
# requires mapping to a Python data structure.
def _generate_attribute(self, context, file, ifr_object, indent):
pass
def _generate_constant(self, context, file, ifr_object, indent):
pass
def _generate_exception(self, context, file, ifr_object, indent):
pass
def _generate_interface(self, context, file, ifr_object, indent):
pass
def _generate_module(self, context, file, ifr_object, indent):
pass
def _generate_operation(self, context, file, ifr_object, indent):
pass
def _generate_struct(self, context, file, ifr_object, indent):
pass
def _generate_union(self, context, file, ifr_object, indent):
pass
def _generate_enum(self, context, file, ifr_object, indent):
pass
def _generate_alias(self, context, file, ifr_object, indent):
pass
#############################################################################