From a7633f75c727a46b67f2bc2ba23baaba276a152d Mon Sep 17 00:00:00 2001 From: whitequark Date: Fri, 7 Aug 2015 13:56:18 +0300 Subject: [PATCH] Show origin of expansion in diagnostics for synthesized code. --- artiq/compiler/embedding.py | 8 +++++--- artiq/compiler/transforms/inferencer.py | 5 ++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/artiq/compiler/embedding.py b/artiq/compiler/embedding.py index 74498d436..4a744131d 100644 --- a/artiq/compiler/embedding.py +++ b/artiq/compiler/embedding.py @@ -12,9 +12,10 @@ from .transforms import ASTTypedRewriter, Inferencer class ASTSynthesizer: - def __init__(self): + def __init__(self, expanded_from=None): self.source = "" self.source_buffer = source.Buffer(self.source, "") + self.expanded_from = expanded_from def finalize(self): self.source_buffer.source = self.source @@ -24,7 +25,8 @@ class ASTSynthesizer: range_from = len(self.source) self.source += fragment range_to = len(self.source) - return source.Range(self.source_buffer, range_from, range_to) + return source.Range(self.source_buffer, range_from, range_to, + expanded_from=self.expanded_from) def quote(self, value): """Construct an AST fragment equal to `value`.""" @@ -128,7 +130,7 @@ class StitchingASTTypedRewriter(ASTTypedRewriter): else: # It's just a value. Quote it. - synthesizer = ASTSynthesizer() + synthesizer = ASTSynthesizer(expanded_from=node.loc) node = synthesizer.quote(value) synthesizer.finalize() return node diff --git a/artiq/compiler/transforms/inferencer.py b/artiq/compiler/transforms/inferencer.py index e0338dcdc..6df5d3eec 100644 --- a/artiq/compiler/transforms/inferencer.py +++ b/artiq/compiler/transforms/inferencer.py @@ -76,9 +76,12 @@ class Inferencer(algorithm.Visitor): def visit_ListT(self, node): self.generic_visit(node) + elt_type_loc = node.loc for elt in node.elts: self._unify(node.type["elt"], elt.type, - node.loc, elt.loc, self._makenotes_elts(node.elts, "a list element")) + elt_type_loc, elt.loc, + self._makenotes_elts(node.elts, "a list element")) + elt_type_loc = elt.loc def visit_AttributeT(self, node): self.generic_visit(node)