Make content optional

- Some preprocessors read the file directly
This commit is contained in:
Dustin Spicuzza 2023-10-08 01:21:31 -04:00
parent d94df61c63
commit 3d23375190
4 changed files with 24 additions and 7 deletions

View File

@ -2,7 +2,7 @@ from dataclasses import dataclass
from typing import Callable, Optional
#: arguments are (filename, content)
PreprocessorFunction = Callable[[str, str], str]
PreprocessorFunction = Callable[[str, Optional[str]], str]
@dataclass

View File

@ -74,9 +74,10 @@ class CxxParser:
def __init__(
self,
filename: str,
content: str,
content: typing.Optional[str],
visitor: CxxVisitor,
options: typing.Optional[ParserOptions] = None,
encoding: typing.Optional[str] = None,
) -> None:
self.visitor = visitor
self.filename = filename
@ -85,6 +86,13 @@ class CxxParser:
if options and options.preprocessor is not None:
content = options.preprocessor(filename, content)
if content is None:
if encoding is None:
encoding = "utf-8-sig"
with open(filename, "r", encoding=encoding) as fp:
content = fp.read()
self.lex: lexer.TokenStream = lexer.LexerTokenStream(filename, content)
global_ns = NamespaceDecl([], False)

View File

@ -74,7 +74,7 @@ def make_gcc_preprocessor(
if not encoding:
encoding = "utf-8"
def _preprocess_file(filename: str, content: str) -> str:
def _preprocess_file(filename: str, content: typing.Optional[str]) -> str:
cmd = gcc_args + ["-w", "-E", "-C"]
for p in include_paths:
@ -86,6 +86,8 @@ def make_gcc_preprocessor(
if filename == "<str>":
cmd.append("-")
filename = "<stdin>"
if content is None:
raise PreprocessorError("no content specified for stdin")
kwargs["input"] = content
else:
cmd.append(filename)
@ -191,7 +193,7 @@ def make_pcpp_preprocessor(
if pcpp is None:
raise PreprocessorError("pcpp is not installed")
def _preprocess_file(filename: str, content: str) -> str:
def _preprocess_file(filename: str, content: typing.Optional[str]) -> str:
pp = _CustomPreprocessor(encoding, passthru_includes)
if include_paths:
for p in include_paths:
@ -203,6 +205,10 @@ def make_pcpp_preprocessor(
if not retain_all_content:
pp.line_directive = "#line"
if content is None:
with open(filename, "r", encoding=encoding) as fp:
content = fp.read()
pp.parse(content, filename)
if pp.errors:

View File

@ -348,7 +348,10 @@ def parse_file(
if filename == "-":
content = sys.stdin.read()
else:
with open(filename, encoding=encoding) as fp:
content = fp.read()
content = None
return parse_string(content, filename=filename, options=options)
visitor = SimpleCxxVisitor()
parser = CxxParser(filename, content, visitor, options)
parser.parse()
return visitor.data