mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-28 10:54:16 +00:00
Reccmp comparison engine refactor (#405)
* Reccmp comparison engine refactor * Remove redundant references to 'entry' symbol
This commit is contained in:
@@ -1,2 +1,3 @@
|
||||
from .codebase import DecompCodebase
|
||||
from .parser import DecompParser
|
||||
from .linter import DecompLinter
|
||||
|
||||
44
tools/isledecomp/isledecomp/parser/codebase.py
Normal file
44
tools/isledecomp/isledecomp/parser/codebase.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""For aggregating decomp markers read from an entire directory and for a single module."""
|
||||
from typing import Iterable, Iterator, List
|
||||
from .parser import DecompParser
|
||||
from .node import (
|
||||
ParserSymbol,
|
||||
ParserFunction,
|
||||
ParserVtable,
|
||||
ParserVariable,
|
||||
)
|
||||
|
||||
|
||||
class DecompCodebase:
|
||||
def __init__(self, filenames: Iterable[str], module: str) -> None:
|
||||
self._symbols: List[ParserSymbol] = []
|
||||
|
||||
parser = DecompParser()
|
||||
for filename in filenames:
|
||||
parser.reset()
|
||||
with open(filename, "r", encoding="utf-8") as f:
|
||||
parser.read_lines(f)
|
||||
|
||||
for sym in parser.iter_symbols(module):
|
||||
sym.filename = filename
|
||||
self._symbols.append(sym)
|
||||
|
||||
def iter_line_functions(self) -> Iterator[ParserFunction]:
|
||||
"""Return lineref functions separately from nameref. Assuming the PDB matches
|
||||
the state of the source code, a line reference is a guaranteed match, even if
|
||||
multiple functions share the same name. (i.e. polymorphism)"""
|
||||
return filter(
|
||||
lambda s: isinstance(s, ParserFunction) and not s.is_nameref(),
|
||||
self._symbols,
|
||||
)
|
||||
|
||||
def iter_name_functions(self) -> Iterator[ParserFunction]:
|
||||
return filter(
|
||||
lambda s: isinstance(s, ParserFunction) and s.is_nameref(), self._symbols
|
||||
)
|
||||
|
||||
def iter_vtables(self) -> Iterator[ParserVtable]:
|
||||
return filter(lambda s: isinstance(s, ParserVtable), self._symbols)
|
||||
|
||||
def iter_variables(self) -> Iterator[ParserVariable]:
|
||||
return filter(lambda s: isinstance(s, ParserVariable), self._symbols)
|
||||
@@ -1,6 +1,6 @@
|
||||
# C++ file parser
|
||||
|
||||
from typing import List, Iterable, Iterator
|
||||
from typing import List, Iterable, Iterator, Optional
|
||||
from enum import Enum
|
||||
from .util import (
|
||||
is_blank_or_comment,
|
||||
@@ -122,6 +122,11 @@ class DecompParser:
|
||||
def variables(self) -> List[ParserSymbol]:
|
||||
return [s for s in self._symbols if isinstance(s, ParserVariable)]
|
||||
|
||||
def iter_symbols(self, module: Optional[str] = None) -> Iterator[ParserSymbol]:
|
||||
for s in self._symbols:
|
||||
if module is None or s.module == module:
|
||||
yield s
|
||||
|
||||
def _recover(self):
|
||||
"""We hit a syntax error and need to reset temp structures"""
|
||||
self.state = ReaderState.SEARCH
|
||||
|
||||
Reference in New Issue
Block a user