2 GTSAM Copyright 2010-2020, Georgia Tech Research Corporation, 
    3 Atlanta, Georgia 30332-0415 
    6 See LICENSE for the license information 
    8 Classes and rules to parse a namespace. 
   10 Author: Duy Nguyen Ta, Fan Jiang, Matthew Sklar, Varun Agrawal, and Frank Dellaert 
   15 from typing 
import List, Union
 
   17 from pyparsing 
import Forward, ParseResults, ZeroOrMore  
 
   19 from .classes 
import Class, collect_namespaces
 
   20 from .declaration 
import ForwardDeclaration, Include
 
   21 from .enum 
import Enum
 
   22 from .function 
import GlobalFunction
 
   23 from .template 
import TypedefTemplateInstantiation
 
   24 from .tokens 
import IDENT, LBRACE, NAMESPACE, RBRACE
 
   25 from .type 
import Typename
 
   26 from .variable 
import Variable
 
   30                        str_namespaces: List[
"Namespace"]) -> list:
 
   32     Get the namespaces nested under `namespace`, filtered by a list of namespace strings. 
   35         namespace: The top-level namespace under which to find sub-namespaces. 
   36         str_namespaces: The list of namespace strings to filter against. 
   38     if not str_namespaces:
 
   41     sub_namespaces = (ns 
for ns 
in namespace.content
 
   45         ns 
for ns 
in sub_namespaces 
if ns.name == str_namespaces[0]
 
   47     if not found_namespaces:
 
   51     for found_namespace 
in found_namespaces:
 
   59     """Rule for parsing a namespace in the interface file.""" 
   67             ForwardDeclaration.rule  
 
   70             ^ TypedefTemplateInstantiation.rule  
 
   77     ).setParseAction(
lambda t: Namespace.from_parse_result(t))
 
   79     def __init__(self, name: str, content: ZeroOrMore, parent=
''):
 
   88         """Return the result of parsing.""" 
   90             content = t.content.asList()
 
   96             self, typename: Typename) -> Union[Class, GlobalFunction, ForwardDeclaration]:
 
   98         Find the Class or GlobalFunction object given its typename. 
   99         We have to traverse the tree of namespaces. 
  103         for namespace 
in found_namespaces:
 
  104             classes_and_funcs = (c 
for c 
in namespace.content
 
  105                                  if isinstance(c, (Class, GlobalFunction, ForwardDeclaration)))
 
  106             res += [c 
for c 
in classes_and_funcs 
if c.name == typename.name]
 
  108             raise ValueError(
"Cannot find class {} in module!".
format(
 
  112                 "Found more than one classes {} in module!".
format(
 
  118         """Return the top level namespace.""" 
  128         """Get the full namespace list.""" 
  131             ancestors.append(self.
name)