group inherit by source during Expr::show
for plain inherits this is really just a stylistic choice, but for inherit-from it actually fixes an exponential size increase problem during expr printing (as may happen during assertion failure reporting, on during duplicate attr detection in the parser) (cherry picked from commit ecf8b12d60ad2929f9998666cf0966475b91e291) Change-Id: Ie55f0cb01a37e766414c31f8d40f51c2c7d106b0
This commit is contained in:
parent
bf19eebb9b
commit
2a84123631
3 changed files with 31 additions and 5 deletions
|
@ -77,10 +77,36 @@ void ExprAttrs::showBindings(const SymbolTable & symbols, std::ostream & str) co
|
||||||
std::string_view sa = symbols[a->first], sb = symbols[b->first];
|
std::string_view sa = symbols[a->first], sb = symbols[b->first];
|
||||||
return sa < sb;
|
return sa < sb;
|
||||||
});
|
});
|
||||||
|
std::vector<Symbol> inherits;
|
||||||
|
std::map<Expr *, std::vector<Symbol>> inheritsFrom;
|
||||||
for (auto & i : sorted) {
|
for (auto & i : sorted) {
|
||||||
if (i->second.inherited())
|
switch (i->second.kind) {
|
||||||
str << "inherit " << symbols[i->first] << " " << "; ";
|
case AttrDef::Kind::Plain:
|
||||||
else {
|
break;
|
||||||
|
case AttrDef::Kind::Inherited:
|
||||||
|
inherits.push_back(i->first);
|
||||||
|
break;
|
||||||
|
case AttrDef::Kind::InheritedFrom: {
|
||||||
|
auto & select = dynamic_cast<ExprSelect &>(*i->second.e);
|
||||||
|
inheritsFrom[select.e].push_back(i->first);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!inherits.empty()) {
|
||||||
|
str << "inherit";
|
||||||
|
for (auto sym : inherits) str << " " << symbols[sym];
|
||||||
|
str << "; ";
|
||||||
|
}
|
||||||
|
for (const auto & [from, syms] : inheritsFrom) {
|
||||||
|
str << "inherit (";
|
||||||
|
from->show(symbols, str);
|
||||||
|
str << ")";
|
||||||
|
for (auto sym : syms) str << " " << symbols[sym];
|
||||||
|
str << "; ";
|
||||||
|
}
|
||||||
|
for (auto & i : sorted) {
|
||||||
|
if (i->second.kind == AttrDef::Kind::Plain) {
|
||||||
str << symbols[i->first] << " = ";
|
str << symbols[i->first] << " = ";
|
||||||
i->second.e->show(symbols, str);
|
i->second.e->show(symbols, str);
|
||||||
str << "; ";
|
str << "; ";
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
(let b = 2; c = { }; in { a = 1; inherit b ; d = (c).d; e = (c).e; f = 3; })
|
(let b = 2; c = { }; in { inherit b; inherit (c) d e; a = 1; f = 3; })
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
({ fetchurl, localServer ? false, httpServer ? false, sslSupport ? false, pythonBindings ? false, javaSwigBindings ? false, javahlBindings ? false, stdenv, openssl ? null, httpd ? null, db4 ? null, expat, swig ? null, j2sdk ? null }: assert (expat != null); assert (localServer -> (db4 != null)); assert (httpServer -> ((httpd != null) && ((httpd).expat == expat))); assert (sslSupport -> ((openssl != null) && (httpServer -> ((httpd).openssl == openssl)))); assert (pythonBindings -> ((swig != null) && (swig).pythonSupport)); assert (javaSwigBindings -> ((swig != null) && (swig).javaSupport)); assert (javahlBindings -> (j2sdk != null)); ((stdenv).mkDerivation { builder = /foo/bar; db4 = (if localServer then db4 else null); inherit expat ; inherit httpServer ; httpd = (if httpServer then httpd else null); j2sdk = (if javaSwigBindings then (swig).j2sdk else (if javahlBindings then j2sdk else null)); inherit javaSwigBindings ; inherit javahlBindings ; inherit localServer ; name = "subversion-1.1.1"; openssl = (if sslSupport then openssl else null); patches = (if javahlBindings then [ (/javahl.patch) ] else [ ]); python = (if pythonBindings then (swig).python else null); inherit pythonBindings ; src = (fetchurl { md5 = "a180c3fe91680389c210c99def54d9e0"; url = "http://subversion.tigris.org/tarballs/subversion-1.1.1.tar.bz2"; }); inherit sslSupport ; swig = (if (pythonBindings || javaSwigBindings) then swig else null); }))
|
({ fetchurl, localServer ? false, httpServer ? false, sslSupport ? false, pythonBindings ? false, javaSwigBindings ? false, javahlBindings ? false, stdenv, openssl ? null, httpd ? null, db4 ? null, expat, swig ? null, j2sdk ? null }: assert (expat != null); assert (localServer -> (db4 != null)); assert (httpServer -> ((httpd != null) && ((httpd).expat == expat))); assert (sslSupport -> ((openssl != null) && (httpServer -> ((httpd).openssl == openssl)))); assert (pythonBindings -> ((swig != null) && (swig).pythonSupport)); assert (javaSwigBindings -> ((swig != null) && (swig).javaSupport)); assert (javahlBindings -> (j2sdk != null)); ((stdenv).mkDerivation { inherit expat httpServer javaSwigBindings javahlBindings localServer pythonBindings sslSupport; builder = /foo/bar; db4 = (if localServer then db4 else null); httpd = (if httpServer then httpd else null); j2sdk = (if javaSwigBindings then (swig).j2sdk else (if javahlBindings then j2sdk else null)); name = "subversion-1.1.1"; openssl = (if sslSupport then openssl else null); patches = (if javahlBindings then [ (/javahl.patch) ] else [ ]); python = (if pythonBindings then (swig).python else null); src = (fetchurl { md5 = "a180c3fe91680389c210c99def54d9e0"; url = "http://subversion.tigris.org/tarballs/subversion-1.1.1.tar.bz2"; }); swig = (if (pythonBindings || javaSwigBindings) then swig else null); }))
|
||||||
|
|
Loading…
Reference in a new issue