mirror of
https://github.com/AdaCore/langkit.git
synced 2026-02-12 12:28:12 -08:00
Add flushing close to places that deal with exceptions so that the order of lines in the output reflect the order of execution for the corresponding print statements. The actual buffering behavior differs depending on the Python interpreter version used, which led to spurious diffs with older versions. TN: W306-034
86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
from contextlib import contextmanager
|
|
import sys
|
|
|
|
import libfoolang
|
|
|
|
|
|
print("main.py: Starting...")
|
|
print("")
|
|
|
|
|
|
def flush():
|
|
sys.stdout.flush()
|
|
sys.stderr.flush()
|
|
|
|
|
|
class ExceptionManager:
|
|
enabled = False
|
|
|
|
@classmethod
|
|
@contextmanager
|
|
def enable(cls):
|
|
cls.enabled = True
|
|
yield
|
|
cls.enabled = False
|
|
|
|
@classmethod
|
|
def maybe_raise(cls):
|
|
if cls.enabled:
|
|
raise ValueError("artificial exception")
|
|
|
|
|
|
class EventHandler(libfoolang.EventHandler):
|
|
def __init__(self, label):
|
|
self.label = label
|
|
|
|
def unit_requested_callback(self, context, name, from_unit, found,
|
|
is_not_found_error):
|
|
print(f"{self.label}: unit_requested_callback")
|
|
flush()
|
|
ExceptionManager.maybe_raise()
|
|
print(f" name: {name}")
|
|
print(f" from_unit: {from_unit}")
|
|
print(f" found: {found}")
|
|
print(f" is_not_found_error: {is_not_found_error}")
|
|
print("")
|
|
|
|
def unit_parsed_callback(self, context, unit, reparsed):
|
|
print(f"{self.label}: unit_parsed_callback")
|
|
flush()
|
|
ExceptionManager.maybe_raise()
|
|
print(f" unit: {unit}")
|
|
print(f" reparsed: {reparsed}")
|
|
print("")
|
|
|
|
|
|
# Create an analysis context with our event handler
|
|
print("== create context ==")
|
|
print("")
|
|
ctx = libfoolang.AnalysisContext(event_handler=EventHandler("MyEH"))
|
|
|
|
# Trigger the "unit parsed" event twice: once for the initial parsing, and once
|
|
# for a reparsing.
|
|
print("== unit parsed ==")
|
|
print("")
|
|
u = ctx.get_from_buffer(filename="main.txt", buffer="example\n")
|
|
u = ctx.get_from_buffer(filename="main.txt", buffer="example\n")
|
|
|
|
with ExceptionManager.enable():
|
|
u = ctx.get_from_buffer(filename="main.txt", buffer="example\n")
|
|
flush()
|
|
print("")
|
|
|
|
# Trigger the "unit requested" event with various parameters
|
|
print("== unit requested ==")
|
|
print("")
|
|
n = u.root
|
|
n.p_trigger_unit_requested("foo_1", found=True, error=False)
|
|
n.p_trigger_unit_requested("foo_2", found=False, error=False)
|
|
n.p_trigger_unit_requested("foo_3", found=False, error=True)
|
|
with ExceptionManager.enable():
|
|
n.p_trigger_unit_requested("foo_4", found=False, error=False)
|
|
flush()
|
|
print("")
|
|
|
|
print("main.py: Done.")
|