7d558789d6
Review URL: http://codereview.chromium.org//9845043 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@5840 260f80e4-7a28-3924-810f-c04153c831b5
112 lines
3.6 KiB
Python
112 lines
3.6 KiB
Python
#!/usr/bin/python
|
|
# Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
# for details. All rights reserved. Use of this source code is governed by a
|
|
# BSD-style license that can be found in the LICENSE file.
|
|
|
|
"""This module provides base functionality for systems to generate
|
|
Dart APIs from the IDL database."""
|
|
|
|
import os
|
|
#import re
|
|
import generator
|
|
|
|
def MassagePath(path):
|
|
# The most robust way to emit path separators is to use / always.
|
|
return path.replace('\\', '/')
|
|
|
|
class System(object):
|
|
"""A System generates all the files for one implementation.
|
|
|
|
This is a base class for all the specific systems.
|
|
The life-cycle of a System is:
|
|
- construction (__init__)
|
|
- (InterfaceGenerator | ProcessCallback)* # for each IDL interface
|
|
- GenerateLibraries
|
|
- Finish
|
|
"""
|
|
|
|
def __init__(self, templates, database, emitters, output_dir):
|
|
self._templates = templates
|
|
self._database = database
|
|
self._emitters = emitters
|
|
self._output_dir = output_dir
|
|
self._dart_callback_file_paths = []
|
|
|
|
def InterfaceGenerator(self,
|
|
interface,
|
|
common_prefix,
|
|
super_interface_name,
|
|
source_filter):
|
|
"""Returns an interface generator for |interface|.
|
|
|
|
Called once for each interface that is not a callback function.
|
|
"""
|
|
return None
|
|
|
|
def ProcessCallback(self, interface, info):
|
|
"""Processes an interface that is a callback function."""
|
|
pass
|
|
|
|
def GenerateLibraries(self, lib_dir):
|
|
pass
|
|
|
|
def Finish(self):
|
|
pass
|
|
|
|
|
|
# Helper methods used by several systems.
|
|
|
|
def _ProcessCallback(self, interface, info, file_path):
|
|
"""Generates a typedef for the callback interface."""
|
|
self._dart_callback_file_paths.append(file_path)
|
|
code = self._emitters.FileEmitter(file_path)
|
|
|
|
code.Emit(self._templates.Load('callback.darttemplate'))
|
|
code.Emit('typedef $TYPE $NAME($PARAMS);\n',
|
|
NAME=interface.id,
|
|
TYPE=info.type_name,
|
|
PARAMS=info.ParametersImplementationDeclaration())
|
|
|
|
|
|
def _GenerateLibFile(self, lib_template, lib_file_path, file_paths,
|
|
**template_args):
|
|
"""Generates a lib file from a template and a list of files.
|
|
|
|
Additional keyword arguments are passed to the template.
|
|
Typically called from self.GenerateLibraries.
|
|
"""
|
|
# Load template.
|
|
template = self._templates.Load(lib_template)
|
|
# Generate the .lib file.
|
|
lib_file_contents = self._emitters.FileEmitter(lib_file_path)
|
|
|
|
# Emit the list of #source directives.
|
|
list_emitter = lib_file_contents.Emit(template, **template_args)
|
|
lib_file_dir = os.path.dirname(lib_file_path)
|
|
for path in sorted(file_paths):
|
|
relpath = os.path.relpath(path, lib_file_dir)
|
|
list_emitter.Emit("#source('$PATH');\n", PATH=MassagePath(relpath))
|
|
|
|
|
|
def _BaseDefines(self, interface):
|
|
"""Returns a set of names (strings) for members defined in a base class.
|
|
"""
|
|
def WalkParentChain(interface):
|
|
if interface.parents:
|
|
# Only consider primary parent, secondary parents are not on the
|
|
# implementation class inheritance chain.
|
|
parent = interface.parents[0]
|
|
if generator.IsDartCollectionType(parent.type.id):
|
|
return
|
|
if self._database.HasInterface(parent.type.id):
|
|
parent_interface = self._database.GetInterface(parent.type.id)
|
|
for attr in parent_interface.attributes:
|
|
result.add(attr.id)
|
|
for op in parent_interface.operations:
|
|
result.add(op.id)
|
|
WalkParentChain(parent_interface)
|
|
|
|
result = set()
|
|
WalkParentChain(interface)
|
|
return result;
|