From efe4b690ae4de5f0adea99abb1176a64a099d433 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 14 Aug 2008 10:04:22 +0000 Subject: * Refactoring: combine functions that take an attribute set and functions that take a single argument (plain lambdas) into one AST node (Function) that contains a Pattern node describing the arguments. Current patterns are single lazy arguments (VarPat) and matching against an attribute set (AttrsPat). This refactoring allows other kinds of patterns to be added easily, such as Haskell-style @-patterns, or list pattern matching. --- src/libexpr/expr-to-xml.cc | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'src/libexpr/expr-to-xml.cc') diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc index c47f24e6c0f9..5aa537b200ee 100644 --- a/src/libexpr/expr-to-xml.cc +++ b/src/libexpr/expr-to-xml.cc @@ -40,6 +40,23 @@ static void showAttrs(const ATermMap & attrs, XMLWriter & doc, } +static void printPatternAsXML(Pattern pat, XMLWriter & doc, PathSet & context) +{ + ATerm name; + ATermList formals; + if (matchVarPat(pat, name)) + doc.writeEmptyElement("varpat", singletonAttrs("name", aterm2String(name))); + else if (matchAttrsPat(pat, formals)) { + XMLOpenElement _(doc, "attrspat"); + for (ATermIterator i(formals); i; ++i) { + Expr name; ATerm dummy; + if (!matchFormal(*i, name, dummy)) abort(); + doc.writeEmptyElement("attr", singletonAttrs("name", aterm2String(name))); + } + } +} + + static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, ExprSet & drvsSeen) { @@ -47,8 +64,8 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, string s; ATerm s2; int i; - ATermList as, es, formals; - ATerm body, pos; + ATermList as, es; + ATerm pat, body, pos; checkInterrupt(); @@ -109,14 +126,9 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, printTermAsXML(*i, doc, context, drvsSeen); } - else if (matchFunction(e, formals, body, pos)) { + else if (matchFunction(e, pat, body, pos)) { XMLOpenElement _(doc, "function"); - - for (ATermIterator i(formals); i; ++i) { - Expr name; ATerm dummy; - if (!matchFormal(*i, name, dummy)) abort(); - XMLOpenElement _(doc, "arg", singletonAttrs("name", aterm2String(name))); - } + printPatternAsXML(pat, doc, context); } else -- cgit 1.4.1