Package pygccxml :: Package msvc :: Package pdb :: Module impl_details |

# Source Code for Module pygccxml.msvc.pdb.impl_details

     1  from . import enums
     2  from pygccxml import declarations
     3
     4 -def guess_class_type( udt_kind ):
     5      if enums.UdtKind.UdtStruct == udt_kind:
     6          return declarations.CLASS_TYPES.STRUCT
     7      elif enums.UdtKind.UdtClass == udt_kind:
     8          return declarations.CLASS_TYPES.CLASS
     9      else:
    10          return declarations.CLASS_TYPES.UNION
    11
    12 -class full_name_splitter_t( object ):
    13 -    def __init__( self, full_name ):
    14          self.__full_name = full_name
    15          self.__identifiers = self.__split_scope_identifiers()
    16          self.__scope_identifiers = None
    17
    18      @property
    19 -    def name( self ):
    20          return self.__identifiers[-1]
    21
    22      @property
    23 -    def scope_names( self ):
    24          if None is self.__scope_identifiers:
    25              self.__scope_identifiers = []# ['::']
    26              for i in range( len(self.__identifiers) - 1):
    27                  self.__scope_identifiers.append( '::'.join( self.__identifiers[0:i+1] ) )
    28          return self.__scope_identifiers
    29
    30      @property
    31 -    def identifiers( self ):
    32          return self.__identifiers
    33
    34 -    def __split_scope_identifiers( self ):
    35          try:
    36              result = []
    37              tmp = self.__full_name.split( '::' )
    38              tmp.reverse()
    39              while tmp:
    40                  token = tmp.pop()
    41                  less_count = token.count( '<' )
    42                  greater_count = token.count( '>' )
    43                  if less_count != greater_count:
    44                      while less_count != greater_count and tmp:
    45                          next_token = tmp.pop()
    46                          token = token + '::' + next_token
    47                          less_count += next_token.count( '<' )
    48                          greater_count += next_token.count( '>' )
    49                  result.append( token )
    50              return result
    51          except Exception, err:
    52              msg = 'Unable to split scope for identifiers. The full scope name is: "%s". Error: %s'
    53              msg = msg % ( self.__full_name, str(err) )
    54              raise RuntimeError( msg )
    55
    56  __name_splitters = {}
    57 -def get_name_splitter( full_name ):
    58      try:
    59          return __name_splitters[full_name]
    60      except KeyError:
    61          splitter = full_name_splitter_t( full_name )
    62          __name_splitters[full_name] = splitter
    63          return splitter
    64
    65  if '__main__' == __name__:
    66      name = "boost::detail::is_base_and_derived_impl2<engine_objects::universal_base_t,engine_objects::erroneous_transactions_file_configuration_t>::Host"
    67      fnsp = full_name_splitter_t( name )
    68      for x in fnsp.scope_names:
    69          print x
    70
    71      fnsp = full_name_splitter_t( 'x' )
    72      for x in fnsp.scope_names:
    73          print x
    74