Update of /cvsroot/pygccxml/source/pyplusplus/decl_wrappers
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1204/pyplusplus/decl_wrappers
Modified Files:
__init__.py namespace_wrapper.py scopedef_wrapper.py
Log Message:
moving select interface to pygccxml classes.
Previous code should work unchanged, because I just moved it in hierarchy tree.
Index: namespace_wrapper.py
===================================================================
RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/namespace_wrapper.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** namespace_wrapper.py 6 Apr 2006 06:15:59 -0000 1.6
--- namespace_wrapper.py 20 Apr 2006 10:11:26 -0000 1.7
***************
*** 11,70 ****
scopedef_wrapper.scopedef_t.__init__( self )
declarations.namespace_t.__init__(self, *arguments, **keywords )
!
! def namespace( self, name=None, function=None, recursive=None ):
! return self._find_single( declarations.namespace_matcher_t
! , name=name
! , function=function
! , recursive=recursive )
!
! def namespaces( self, name=None, function=None, recursive=None ):
! return self._find_multiple( declarations.namespace_matcher_t
! , name=name
! , function=function
! , recursive=recursive )
!
! def free_function( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
! return self._find_single( declarations.calldef_matcher_t
! , name=name
! , function=function
! , decl_type=declarations.free_function_t
! , return_type=return_type
! , arg_types=arg_types
! , header_dir=header_dir
! , header_file=header_file
! , recursive=recursive )
!
! def free_functions( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
! return self._find_multiple( declarations.calldef_matcher_t
! , name=name
! , function=function
! , decl_type=declarations.free_function_t
! , return_type=return_type
! , arg_types=arg_types
! , header_dir=header_dir
! , header_file=header_file
! , recursive=recursive)
!
! def free_operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
! return self._find_single( declarations.operator_matcher_t
! , name=name
! , symbol=symbol
! , function=function
! , decl_type=declarations.free_operator_t
! , return_type=return_type
! , arg_types=arg_types
! , header_dir=header_dir
! , header_file=header_file
! , recursive=recursive )
!
! def free_operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
! return self._find_multiple( declarations.operator_matcher_t
! , name=name
! , symbol=symbol
! , function=function
! , decl_type=declarations.free_operator_t
! , return_type=return_type
! , arg_types=arg_types
! , header_dir=header_dir
! , header_file=header_file
! , recursive=recursive )
--- 11,13 ----
scopedef_wrapper.scopedef_t.__init__( self )
declarations.namespace_t.__init__(self, *arguments, **keywords )
!
Index: scopedef_wrapper.py
===================================================================
RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/scopedef_wrapper.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** scopedef_wrapper.py 20 Apr 2006 04:06:41 -0000 1.10
--- scopedef_wrapper.py 20 Apr 2006 10:11:26 -0000 1.11
***************
*** 5,164 ****
import decl_wrapper
- from pygccxml import declarations
- import mdecl_wrapper
- from sets import Set as set
- import time
- from pyplusplus import _logging_
class scopedef_t(decl_wrapper.decl_wrapper_t):
"""
In C++ there are 2 declarations that can contain definition of other
! declarations: class and namespace. This class is used as abase class for both
of them.
-
- Also this class provides "get/select/find" interface. Using this class you
- can get instance or instances of internal declaration(s).
-
- You can find declaration(s) using next criteria:
- 1. name - declaration name, could be full qualified name
- 2. header_dir - directory, to which belongs file, that the declaration was declarated in.
- header_dir should be absolute path.
- 3. header_file - file that the declaration was declarated in.
- 4. function - user ( your ) custom criteria. The interesting thing is that
- this function will be joined with other arguments ( criteria ).
- 5. recursive - the search declaration range, if True will be search in
- internal declarations too.
-
- Every "select" API you can invoke and pass as first argument at declaration
- name or function. This class will find out correctly what argument represents.
-
- Example::
- ns - referers to global namespace
- ns.member_function( "do_something ) - will return reference to member
- function named "do_something". If there is no such function exception
- will be raised. If there is more then one function exception will be
- raised too.
-
- Example 2::
- ns - referers to global namespace
- do_smths = ns.member_functions( "do_something ) - will return instance
- of L{mdecl_wrapper_t} object. This object allows you few things:
-
- 1. To iterate on selected declarations
- 2. To set some property to desired value using one line of code only:
- do_smths.call_policies = x
- 3. To call some function on every instance using one line of code:
- do_smths.exclude()
-
- Pay attention: you can not use "get" functions or properties.
"""
!
! RECURSIVE_DEFAULT = True
! ALLOW_EMPTY_MDECL_WRAPPER = False
!
def __init__(self):
decl_wrapper.decl_wrapper_t.__init__( self )
-
- self.__optimized = False
- self.__type2decls = {}
- self.__type2name2decls = {}
- self.__type2decls_nr = {}
- self.__type2name2decls_nr = {}
- self.__all_decls = None
-
- def __decl_types( self, decl ):
- types = []
- bases = list( decl.__class__.__bases__ )
- visited = set()
- while bases:
- base = bases.pop()
- if base is declarations.declaration_t:
- continue
- if base in visited:
- continue
- if 'pygccxml' not in base.__module__:
- continue
- types.append( base )
- bases.extend( base.__bases__ )
- return types
-
- def clear_optimizer(self):
- """Cleans query optimizer state"""
- self.__optimized = False
- self.__type2decls = {}
- self.__type2name2decls = {}
- self.__type2decls_nr = {}
- self.__type2name2decls_nr = {}
- self.__all_decls = None
-
- map( lambda decl: decl.clear_optimizer()
- , filter( lambda decl: isinstance( decl, declarations.scopedef_t )
- , self.declarations ) )
-
- def init_optimizer(self):
- """Initializes query optimizer state.
- There are 4 internals hash tables:
- 1. from type to declarations
- 2. from type to declarations for non-recursive queries
- 3. from type to name to declarations
- 4. from type to name to declarations for non-recursive queries
-
- Almost every query includes declaration type information. Also very
- common query is to search some declaration(s) by name or full name.
- Those hashtables allows to search declaration very quick.
- """
- _logging_.logger.debug( "preparing data structures for query optimizer - started" )
- start_time = time.clock()
-
- self.clear_optimizer()
-
- decl_types = [ declarations.scopedef_t
- , declarations.enumeration_t
- , declarations.namespace_t
- , declarations.class_t
- , declarations.class_declaration_t
- , declarations.typedef_t
- , declarations.variable_t
- , declarations.calldef_t
- , declarations.member_calldef_t
- , declarations.free_calldef_t
- , declarations.operator_t
- , declarations.member_function_t
- , declarations.constructor_t
- , declarations.destructor_t
- , declarations.member_operator_t
- , declarations.casting_operator_t
- , declarations.free_function_t
- , declarations.free_operator_t ]
- for dtype in decl_types:
- self.__type2decls[ dtype ] = []
- self.__type2decls_nr[ dtype ] = []
- self.__type2name2decls[ dtype ] = {}
- self.__type2name2decls_nr[ dtype ] = {}
-
- self.__all_decls = declarations.make_flatten( self.declarations )
- for decl in self.__all_decls:
- types = self.__decl_types( decl )
- for type_ in types:
- self.__type2decls[ type_ ].append( decl )
- name2decls = self.__type2name2decls[ type_ ]
- if not name2decls.has_key( decl.name ):
- name2decls[ decl.name ] = []
- name2decls[ decl.name ].append( decl )
- if self is decl.parent:
- self.__type2decls_nr[ type_ ].append( decl )
- name2decls_nr = self.__type2name2decls_nr[ type_ ]
- if not name2decls_nr.has_key( decl.name ):
- name2decls_nr[ decl.name ] = []
- name2decls_nr[ decl.name ].append( decl )
-
- map( lambda decl: decl.init_optimizer()
- , filter( lambda decl: isinstance( decl, declarations.scopedef_t )
- , self.declarations ) )
- _logging_.logger.debug( "preparing data structures for query optimizer - done( %f seconds ). "
- % ( time.clock() - start_time ) )
- self.__optimized = True
-
def exclude( self ):
"""Exclude "self" and child declarations from being exposed."""
--- 5,19 ----
import decl_wrapper
class scopedef_t(decl_wrapper.decl_wrapper_t):
"""
In C++ there are 2 declarations that can contain definition of other
! declarations: class and namespace. This class is used as a base class for both
of them.
"""
!
def __init__(self):
decl_wrapper.decl_wrapper_t.__init__( self )
def exclude( self ):
"""Exclude "self" and child declarations from being exposed."""
***************
*** 171,483 ****
map( lambda decl: decl.include(), self.declarations )
- def __normalize_args( self, **keywds ):
- if callable( keywds['name'] ) and None is keywds['function']:
- keywds['function'] = keywds['name']
- keywds['name'] = None
- return keywds
-
- def __findout_recursive( self, **keywds ):
- if None is keywds[ 'recursive' ]:
- return self.RECURSIVE_DEFAULT
- else:
- return keywds[ 'recursive' ]
-
- def __findout_decl_type( self, match_class, **keywds ):
- if keywds.has_key( 'decl_type' ):
- return keywds['decl_type']
-
- matcher_args = keywds.copy()
- del matcher_args['function']
- del matcher_args['recursive']
-
- matcher = match_class( **matcher_args )
- if matcher.decl_type:
- return matcher.decl_type
- return None
-
- def __create_matcher( self, match_class, **keywds ):
- matcher_args = keywds.copy()
- del matcher_args['function']
- del matcher_args['recursive']
-
- matcher = match_class( **matcher_args )
- if keywds['function']:
- _logging_.logger.info( 'running query: %s and <user defined function>' % str( matcher ) )
- return lambda decl: matcher( decl ) and keywds['function'](decl)
- else:
- _logging_.logger.info( 'running query: %s' % str( matcher ) )
- return matcher
-
- def __findout_range( self, name, decl_type, recursive ):
- if not self.__optimized:
- _logging_.logger.info( 'running non optimized query - optimization has not been done' )
- decls = self.declarations
- if recursive:
- decls = declarations.make_flatten( self.declarations )
- return decls
-
- if name and decl_type:
- matcher = declarations.declaration_matcher_t( name=name )
- if matcher.is_full_name():
- name = matcher.decl_name_only
- if recursive:
- _logging_.logger.info( 'query has been optimized on type and name' )
- return self.__type2name2decls[decl_type][name]
- else:
- _logging_.logger.info( 'non recursive query has been optimized on type and name' )
- return self.__type2name2decls_nr[decl_type][name]
- elif decl_type:
- if recursive:
- _logging_.logger.info( 'query has been optimized on type' )
- return self.__type2decls[ decl_type ]
- else:
- _logging_.logger.info( 'non recursive query has been optimized on type' )
- return self.__type2decls_nr[ decl_type ]
- else:
- if recursive:
- _logging_.logger.info( 'query has not been optimized ( hint: query does not contain type and/or name )' )
- return self.__all_decls
- else:
- _logging_.logger.info( 'non recursive query has not been optimized ( hint: query does not contain type and/or name )' )
- return self.declarations
-
- def _find_single( self, match_class, **keywds ):
- _logging_.logger.info( 'find single query execution - started' )
- start_time = time.clock()
- norm_keywds = self.__normalize_args( **keywds )
- matcher = self.__create_matcher( match_class, **norm_keywds )
- dtype = self.__findout_decl_type( match_class, **norm_keywds )
- recursive_ = self.__findout_recursive( **norm_keywds )
- decls = self.__findout_range( norm_keywds['name'], dtype, recursive_ )
- found = declarations.matcher.get_single( matcher, decls, False )
- _logging_.logger.info( 'find single query execution - done( %f seconds )'
- % ( time.clock() - start_time ) )
- return found
-
- def _find_multiple( self, match_class, **keywds ):
- _logging_.logger.info( 'find all query execution - started' )
- start_time = time.clock()
- norm_keywds = self.__normalize_args( **keywds )
- matcher = self.__create_matcher( match_class, **norm_keywds )
- dtype = self.__findout_decl_type( match_class, **norm_keywds )
- recursive_ = self.__findout_recursive( **norm_keywds )
- decls = self.__findout_range( norm_keywds['name'], dtype, recursive_ )
- found = declarations.matcher.find( matcher, decls, False )
- mfound = mdecl_wrapper.mdecl_wrapper_t( found )
- _logging_.logger.info( '%d declaration(s) that match query' % len(mfound) )
- _logging_.logger.info( 'find single query execution - done( %f seconds )'
- % ( time.clock() - start_time ) )
- if not mfound and not self.ALLOW_EMPTY_MDECL_WRAPPER:
- raise RuntimeError( "Multi declaration query returned 0 declarations." )
- return mfound
-
- def decl( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
- """Finds any declaration by criteria. Please see L{scopedef_t} for full explanation."""
- return self._find_single( declarations.declaration_matcher_t
- , name=name
- , function=function
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def decls( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.declaration_matcher_t
- , name=name
- , function=function
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def class_( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.declaration_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.class_t
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def classes( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.declaration_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.class_t
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def variable( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.variable_matcher_t
- , name=name
- , function=function
- , type=type
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def variables( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.variable_matcher_t
- , name=name
- , function=function
- , type=type
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def calldef( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.calldef_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.calldef_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def calldefs( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.calldef_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.calldef_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.operator_matcher_t
- , name=name
- , symbol=symbol
- , function=function
- , decl_type=decl_type
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.operator_matcher_t
- , name=name
- , symbol=symbol
- , function=function
- , decl_type=decl_type
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def member_function( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.calldef_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.member_function_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def member_functions( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.calldef_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.member_function_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def constructor( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.calldef_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.constructor_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def constructors( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.calldef_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.constructor_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def member_operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.operator_matcher_t
- , name=name
- , symbol=symbol
- , function=function
- , decl_type=declarations.member_operator_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def member_operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.operator_matcher_t
- , name=name
- , symbol=symbol
- , function=function
- , decl_type=declarations.member_operator_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def casting_operator( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.calldef_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.casting_operator_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive )
-
- def casting_operators( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.calldef_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.casting_operator_t
- , return_type=return_type
- , arg_types=arg_types
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
-
- def enumeration( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_single( declarations.declaration_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.enumeration_t
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
- #adding small aliase
- enum = enumeration
-
- def enumerations( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
- return self._find_multiple( declarations.declaration_matcher_t
- , name=name
- , function=function
- , decl_type=declarations.enumeration_t
- , header_dir=header_dir
- , header_file=header_file
- , recursive=recursive)
- #adding small aliase
- enums = enumerations
--- 26,27 ----
Index: __init__.py
===================================================================
RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/__init__.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** __init__.py 19 Mar 2006 05:45:14 -0000 1.5
--- __init__.py 20 Apr 2006 10:11:26 -0000 1.6
***************
*** 86,91 ****
from decl_wrapper_printer import print_declarations
- from mdecl_wrapper import mdecl_wrapper_t
-
from user_text import user_text_t
from user_text import class_user_text_t
--- 86,89 ----
|