Files
Phoenix/etgtools/map_generator.py
2020-03-10 11:41:39 -07:00

102 lines
3.2 KiB
Python

# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------------
# Name: etgtools/map_generator.py
# Author: Robin Dunn
#
# Created: 20-May-2016
# Copyright: (c) 2016-2020 by Total Control Software
# License: wxWindows License
# ---------------------------------------------------------------------------
"""
This generator simply maintains a persistent map of top-level item names and
the module each is in. This will be used in the Sphinx generator and will
perhaps help simplify other generator tasks as well.
"""
# Phoenix-specific imports
from . import extractors
from . import generators
from .tweaker_tools import removeWxPrefix
from .item_module_map import ItemModuleMap
from sphinxtools.constants import MODULENAME_REPLACE
# ---------------------------------------------------------------------------
class ItemMapGenerator(generators.DocsGeneratorBase):
def __init__(self):
super(ItemMapGenerator, self).__init__()
def generate(self, module):
assert isinstance(module, extractors.ModuleDef)
realModuleName = MODULENAME_REPLACE[module.module]
dispatchMap = {
extractors.ClassDef : self.generateClass,
extractors.EnumDef: self.generateEnum,
}
imm = ItemModuleMap()
for item in module.items:
func = dispatchMap.get(item.__class__, self.generateDefault)
func(item, imm, realModuleName)
imm.flush()
def generateClass(self, item, imm, scope):
# Map names for classes, nested classes and nested enums
if item.ignored:
return
name = self._getName(item)
if not name or name.startswith('@'):
return
imm[name] = scope
# are there nested classes?
for inner in item.innerclasses:
self.generateClass(inner, imm, '{}{}.'.format(scope, name))
# Check for nested enums too
for classItem in item.items:
if isinstance(classItem, extractors.EnumDef):
self.generateEnum(
classItem, imm, '{}{}.'.format(scope, name), False)
def generateEnum(self, item, imm, scope, topLevel=True):
# map names of enum types and enum elements
if item.ignored:
return
name = self._getName(item)
if name and not name.startswith('@'):
imm[name] = scope
# TODO: Investigate if there are cases where nested enum elements
# should be tracked too.
if topLevel:
# Also add an entry for the elements of the enum, as they are also
# names accessible from the top-level namespace.
for enum in item:
self.generateDefault(enum, imm, scope)
def generateDefault(self, item, imm, scope):
# this handles all types that don't need special attention
if item.ignored:
return
name = self._getName(item)
if not name or name.startswith('@'):
return
imm[name] = scope
def _getName(self, item):
return item.pyName if item.pyName else removeWxPrefix(item.name)
# ---------------------------------------------------------------------------