report the right function in the bracket even if there is no lin

This commit is contained in:
Krasimir Angelov
2023-01-16 13:33:02 +01:00
parent 7d189aa933
commit dae9009c86
2 changed files with 13 additions and 10 deletions

View File

@@ -325,11 +325,12 @@ ref<PgfConcrLincat> PgfLinearizer::TreeLinNode::get_lincat(PgfLinearizer *linear
return namespace_lookup(linearizer->concr->lincats, &lin->absfun->type->name); return namespace_lookup(linearizer->concr->lincats, &lin->absfun->type->name);
} }
PgfLinearizer::TreeLindefNode::TreeLindefNode(PgfLinearizer *linearizer, PgfText *literal) PgfLinearizer::TreeLindefNode::TreeLindefNode(PgfLinearizer *linearizer, PgfText *fun, PgfText *literal)
: TreeNode(linearizer) : TreeNode(linearizer)
{ {
this->lincat = 0; this->lincat = 0;
this->lin_index = 0; this->lin_index = 0;
this->fun = fun;
this->literal = literal; this->literal = literal;
TreeNode *prev = linearizer->prev; TreeNode *prev = linearizer->prev;
@@ -391,7 +392,7 @@ void PgfLinearizer::TreeLindefNode::linearize(PgfLinearizationOutputIface *out,
if (lincat != 0) { if (lincat != 0) {
PgfText *field = &*(vector_elem(lincat->fields, lindex)->name); PgfText *field = &*(vector_elem(lincat->fields, lindex)->name);
if (linearizer->pre_stack == NULL) if (linearizer->pre_stack == NULL)
out->begin_phrase(&lincat->name, fid, field, linearizer->wild); out->begin_phrase(&lincat->name, fid, field, fun);
else { else {
BracketStack *bracket = new BracketStack(); BracketStack *bracket = new BracketStack();
bracket->next = linearizer->pre_stack->bracket_stack; bracket->next = linearizer->pre_stack->bracket_stack;
@@ -399,7 +400,7 @@ void PgfLinearizer::TreeLindefNode::linearize(PgfLinearizationOutputIface *out,
bracket->fid = fid; bracket->fid = fid;
bracket->cat = &lincat->name; bracket->cat = &lincat->name;
bracket->field = field; bracket->field = field;
bracket->field = linearizer->wild; bracket->fun = fun;
linearizer->pre_stack->bracket_stack = bracket; linearizer->pre_stack->bracket_stack = bracket;
} }
@@ -407,7 +408,7 @@ void PgfLinearizer::TreeLindefNode::linearize(PgfLinearizationOutputIface *out,
linearize_seq(out, linearizer, seq); linearize_seq(out, linearizer, seq);
if (linearizer->pre_stack == NULL) if (linearizer->pre_stack == NULL)
out->end_phrase(&lincat->name, fid, field, linearizer->wild); out->end_phrase(&lincat->name, fid, field, fun);
else { else {
BracketStack *bracket = new BracketStack(); BracketStack *bracket = new BracketStack();
bracket->next = linearizer->pre_stack->bracket_stack; bracket->next = linearizer->pre_stack->bracket_stack;
@@ -415,7 +416,7 @@ void PgfLinearizer::TreeLindefNode::linearize(PgfLinearizationOutputIface *out,
bracket->fid = fid; bracket->fid = fid;
bracket->cat = &lincat->name; bracket->cat = &lincat->name;
bracket->field = field; bracket->field = field;
bracket->field = linearizer->wild; bracket->fun = fun;
linearizer->pre_stack->bracket_stack = bracket; linearizer->pre_stack->bracket_stack = bracket;
} }
} else { } else {
@@ -726,7 +727,7 @@ PgfExpr PgfLinearizer::elit(PgfLiteral lit)
PgfExpr PgfLinearizer::emeta(PgfMetaId meta) PgfExpr PgfLinearizer::emeta(PgfMetaId meta)
{ {
printer.emeta(meta); printer.emeta(meta);
return (PgfExpr) new TreeLindefNode(this, printer.get_text()); return (PgfExpr) new TreeLindefNode(this, NULL, printer.get_text());
} }
PgfExpr PgfLinearizer::efun(PgfText *name) PgfExpr PgfLinearizer::efun(PgfText *name)
@@ -738,14 +739,15 @@ PgfExpr PgfLinearizer::efun(PgfText *name)
printer.puts("["); printer.puts("[");
printer.efun(name); printer.efun(name);
printer.puts("]"); printer.puts("]");
return (PgfExpr) new TreeLindefNode(this, printer.get_text()); return (PgfExpr) new TreeLindefNode(this, textdup(name), printer.get_text());
} }
} }
PgfExpr PgfLinearizer::evar(int index) PgfExpr PgfLinearizer::evar(int index)
{ {
printer.evar(index); printer.evar(index);
return (PgfExpr) new TreeLindefNode(this, printer.get_text()); PgfText *name = printer.get_text();
return (PgfExpr) new TreeLindefNode(this, textdup(name), name);
} }
PgfExpr PgfLinearizer::etyped(PgfExpr expr, PgfType ty) PgfExpr PgfLinearizer::etyped(PgfExpr expr, PgfType ty)

View File

@@ -66,15 +66,16 @@ class PGF_INTERNAL_DECL PgfLinearizer : public PgfUnmarshaller {
struct TreeLindefNode : public TreeNode { struct TreeLindefNode : public TreeNode {
ref<PgfConcrLincat> lincat; ref<PgfConcrLincat> lincat;
size_t lin_index; size_t lin_index;
PgfText *fun;
PgfText *literal; PgfText *literal;
TreeLindefNode(PgfLinearizer *linearizer, PgfText *lit); TreeLindefNode(PgfLinearizer *linearizer, PgfText *fun, PgfText *lit);
virtual bool resolve(PgfLinearizer *linearizer); virtual bool resolve(PgfLinearizer *linearizer);
virtual void check_category(PgfLinearizer *linearizer, PgfText *cat); virtual void check_category(PgfLinearizer *linearizer, PgfText *cat);
virtual void linearize_arg(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t d, PgfLParam *r); virtual void linearize_arg(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t d, PgfLParam *r);
virtual void linearize(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t lindex); virtual void linearize(PgfLinearizationOutputIface *out, PgfLinearizer *linearizer, size_t lindex);
virtual ref<PgfConcrLincat> get_lincat(PgfLinearizer *linearizer); virtual ref<PgfConcrLincat> get_lincat(PgfLinearizer *linearizer);
~TreeLindefNode() { free(literal); }; ~TreeLindefNode() { free(fun); free(literal); };
}; };
struct TreeLinrefNode : public TreeNode { struct TreeLinrefNode : public TreeNode {