def __init__(self, cache: PyreData) -> None: super().__init__(cache) lookup: Dict[CodeRange, str] = {} for item in cache["types"]: location = item["location"] start = location["start"] end = location["stop"] lookup[CodeRange( start=CodePosition(start["line"], start["column"]), end=CodePosition(end["line"], end["column"]), )] = item["annotation"] self.lookup: Dict[CodeRange, str] = lookup
def after_codegen(self, node: "CSTNode") -> None: # we must unconditionally pop the stack, else we could end up in a broken state start_pos = self._stack.pop() # Don't overwrite existing position information # (i.e. semantic position has already been recorded) if node not in self.provider._computed: end_pos = CodePosition(self.line, self.column) node_range = CodeRange(start_pos, end_pos) self.provider._computed[node] = node_range
def record_syntactic_position( self, node: CSTNode, *, start_node: Optional[CSTNode] = None, end_node: Optional[CSTNode] = None, ) -> Iterator[None]: start = CodePosition(self.line, self.column) try: yield finally: end = CodePosition(self.line, self.column) # Override with positions hoisted from child nodes if provided start = (self.provider._computed[start_node].start if start_node is not None else start) end = self.provider._computed[ end_node].end if end_node is not None else end self.provider._computed[node] = CodeRange(start, end)
def before_codegen(self, node: "CSTNode") -> None: self._stack.append(CodePosition(self.line, self.column))
def _codegen(self, state: CodegenState, **kwargs: Any) -> None: start = CodePosition(state.line, state.column) self._codegen_impl(state, **kwargs) end = CodePosition(state.line, state.column) state.record_position(self, CodeRange(start, end))