mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	This is partly a cleanup of the code. It also is preparation for getting the variables from the source (cross-platform) rather than from the symbols. The change only touches the tool (and its tests).
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from collections import namedtuple
 | 
						|
 | 
						|
from c_analyzer.common.info import ID
 | 
						|
from c_analyzer.common.util import classonly, _NTBase
 | 
						|
 | 
						|
 | 
						|
class Symbol(_NTBase, namedtuple('Symbol', 'id kind external')):
 | 
						|
    """Info for a single compilation symbol."""
 | 
						|
 | 
						|
    __slots__ = ()
 | 
						|
 | 
						|
    class KIND:
 | 
						|
        VARIABLE = 'variable'
 | 
						|
        FUNCTION = 'function'
 | 
						|
        OTHER = 'other'
 | 
						|
 | 
						|
    @classonly
 | 
						|
    def from_name(cls, name, filename=None, kind=KIND.VARIABLE, external=None):
 | 
						|
        """Return a new symbol based on the given name."""
 | 
						|
        id = ID(filename, None, name)
 | 
						|
        return cls(id, kind, external)
 | 
						|
 | 
						|
    def __new__(cls, id, kind=KIND.VARIABLE, external=None):
 | 
						|
        self = super().__new__(
 | 
						|
                cls,
 | 
						|
                id=ID.from_raw(id),
 | 
						|
                kind=str(kind) if kind else None,
 | 
						|
                external=bool(external) if external is not None else None,
 | 
						|
                )
 | 
						|
        return self
 | 
						|
 | 
						|
    def __hash__(self):
 | 
						|
        return hash(self.id)
 | 
						|
 | 
						|
    def __getattr__(self, name):
 | 
						|
        return getattr(self.id, name)
 | 
						|
 | 
						|
    def validate(self):
 | 
						|
        """Fail if the object is invalid (i.e. init with bad data)."""
 | 
						|
        if not self.id:
 | 
						|
            raise TypeError('missing id')
 | 
						|
        else:
 | 
						|
            self.id.validate()
 | 
						|
 | 
						|
        if not self.kind:
 | 
						|
            raise TypeError('missing kind')
 | 
						|
        elif self.kind not in vars(self.KIND).values():
 | 
						|
            raise ValueError(f'unsupported kind {self.kind}')
 | 
						|
 | 
						|
        if self.external is None:
 | 
						|
            raise TypeError('missing external')
 |