compiler: allows string annotation

According to PEP484, type hint can be a string literal for forward
references. With PEP563, type hint would be preserved in annotations in
string form.
This commit is contained in:
pca006132 2021-06-25 10:25:33 +08:00 committed by Sébastien Bourdeauducq
parent 094a346974
commit c29a149d16
1 changed files with 21 additions and 0 deletions

View File

@ -949,6 +949,27 @@ class Stitcher:
if annot is None: if annot is None:
annot = builtins.TNone() annot = builtins.TNone()
if isinstance(function, SpecializedFunction):
host_function = function.host_function
else:
host_function = function
embedded_function = host_function.artiq_embedded.function
if isinstance(embedded_function, str):
embedded_function = host_function
if isinstance(annot, str):
if annot not in embedded_function.__globals__:
diag = diagnostic.Diagnostic(
"error",
"type annotation for {kind}, {annot}, is not defined",
{"kind": kind, "annot": repr(annot)},
self._function_loc(function),
notes=self._call_site_note(call_loc, fn_kind))
self.engine.process(diag)
annot = embedded_function.__globals__[annot]
if not isinstance(annot, types.Type): if not isinstance(annot, types.Type):
diag = diagnostic.Diagnostic("error", diag = diagnostic.Diagnostic("error",
"type annotation for {kind}, '{annot}', is not an ARTIQ type", "type annotation for {kind}, '{annot}', is not an ARTIQ type",