@@ -18,17 +18,17 @@ conditions:
1818 ``example.babelg.py ``
1919
20202. At least one class must exist in the module that extends the
21- ``babelapi.generator.generator. CodeGenerator `` class and implements the
22- abstract ``generate() `` method. BabelAPI automatically detects subclasses
23- and calls the ``generate() `` method. All such subclasses will be called in
24- ASCII order.
21+ ``babelapi.generator.CodeGenerator `` class and implements the abstract
22+ ``generate() `` method. BabelAPI automatically detects subclasses and calls
23+ the ``generate() `` method. All such subclasses will be called in ASCII
24+ order.
2525
2626Getting Started
2727===============
2828
2929Here's a simple no-op generator::
3030
31- from babelapi.generator.generator import CodeGenerator
31+ from babelapi.generator import CodeGenerator
3232
3333 class ExampleGenerator(CodeGenerator):
3434 def generate(self):
@@ -58,7 +58,7 @@ Here's an example generator that creates an output file for each namespace.
5858Each file is named after a respective namespace and have a ``.cpp `` extension.
5959Each file contains a one line C++-style comment::
6060
61- from babelapi.generator.generator import CodeGenerator
61+ from babelapi.generator import CodeGenerator
6262
6363 class ExampleGenerator(CodeGenerator):
6464 def generate(self):
@@ -212,10 +212,10 @@ serve a different purpose.
212212Indentation
213213===========
214214
215- The ``babelapi.generator.generator. CodeGenerator `` class provides a context
215+ The ``babelapi.generator.CodeGenerator `` class provides a context
216216manager for adding incremental indentation. Here's an example::
217217
218- from babelapi.generator.generator import CodeGenerator
218+ from babelapi.generator import CodeGenerator
219219
220220 class ExampleGenerator(CodeGenerator):
221221 def generate(self):
@@ -282,14 +282,14 @@ Example 1: List All Namespaces
282282We'll create a generator ``ex1.babelg.py `` that generates a file called
283283``ex1.out ``. Each line in the file will be the name of a defined namespace::
284284
285- from babelapi.generator.generator import CodeGenerator
285+ from babelapi.generator import CodeGenerator
286286
287287 class ExampleGenerator(CodeGenerator):
288288 def generate(self):
289289 """Generates a file that lists each namespace."""
290290 with self.output_to_relative_path('ex1.out'):
291291 for namespace in self.api.namespaces.values():
292- self.emit_line (namespace.name)
292+ self.emit (namespace.name)
293293
294294We use ``output_to_relative_path() `` a member of ``CodeGenerator `` to specify
295295where the output of our ``emit*() `` calls go (See more emit_methods _).
@@ -311,7 +311,7 @@ Example 2: A Python module for each Namespace
311311Now we'll create a Python module for each namespace. Each module will define
312312a ``noop() `` function::
313313
314- from babelapi.generator.generator import CodeGenerator
314+ from babelapi.generator import CodeGenerator
315315
316316 class ExamplePythonGenerator(CodeGenerator):
317317 def generate(self):
@@ -323,9 +323,9 @@ a ``noop()`` function::
323323 self._generate_namespace_module(namespace)
324324
325325 def _generate_namespace_module(self, namespace):
326- self.emit_line ('def noop():')
326+ self.emit ('def noop():')
327327 with self.indent():
328- self.emit_line ('pass')
328+ self.emit ('pass')
329329
330330Note how we used the ``self.indent() `` context manager to increase the
331331indentation level by a default 4 spaces. If you want to use tabs instead,
@@ -354,8 +354,8 @@ for each struct in our specification. We'll extend from
354354``MonolingualCodeGenerator ``, which enforces that a ``lang `` class variable is
355355declared::
356356
357- from babelapi.data_type import Struct
358- from babelapi.generator.generator import CodeGeneratorMonolingual
357+ from babelapi.data_type import is_struct_type
358+ from babelapi.generator import CodeGeneratorMonolingual
359359 from babelapi.lang.python import PythonTargetLanguage
360360
361361 class ExamplePythonGenerator(CodeGeneratorMonolingual):
@@ -375,43 +375,37 @@ declared::
375375
376376 def _generate_namespace_module(self, namespace):
377377 for data_type in namespace.linearize_data_types():
378- if not isinstance (data_type, Struct ):
379- # Do not handle Union types
378+ if not is_struct_type (data_type):
379+ # Only handle user-defined structs (avoid unions and primitives)
380380 continue
381381
382382 # Define a class for each struct
383383 class_def = 'class {}(object):'.format(self.lang.format_class(data_type.name))
384- self.emit_line (class_def)
384+ self.emit (class_def)
385385
386386 with self.indent():
387387 if data_type.doc:
388- self.emit_line ('"""')
389- self.emit_wrapped_lines (data_type.doc)
390- self.emit_line ('"""')
388+ self.emit ('"""')
389+ self.emit_wrapped_text (data_type.doc)
390+ self.emit ('"""')
391391
392- self.emit_empty_line ()
392+ self.emit ()
393393
394394 # Define constructor to take each field
395- self.emit_line('def __init__', trailing_newline=False)
396395 args = ['self']
397396 for field in data_type.fields:
398397 args.append(self.lang.format_variable(field.name))
399- self._generate_func_arg_list(args)
400- self.emit(':')
401- self.emit_empty_line()
398+ self.generate_multiline_list(args, 'def __init__', ':')
402399
403400 with self.indent():
404401 if data_type.fields:
402+ self.emit()
405403 # Body of init should assign all init vars
406404 for field in data_type.fields:
407405 if field.doc:
408- self.emit_wrapped_lines (field.doc, prefix= '# ')
406+ self.emit_wrapped_text (field.doc, '# ', '# ')
409407 member_name = self.lang.format_variable(field.name)
410- self.emit_line ('self.{0} = {0}'.format(member_name))
408+ self.emit ('self.{0} = {0}'.format(member_name))
411409 else:
412- self.emit_line('pass')
413- self.emit_empty_line()
414-
415- One new method of ``CodeGenerator `` that was used is ``generate_func_arg_list(args) ``.
416- It helps you generate a list of arguments in a function declaration or invocation
417- enclosed by parentheses.
410+ self.emit('pass')
411+ self.emit()
0 commit comments