Merge branch 'attrPaths' of https://github.com/NinjaTrappeur/nix
This commit is contained in:
		
						commit
						9eaebbf575
					
				
					 7 changed files with 46 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -81,7 +81,9 @@ static void addAttr(ExprAttrs * attrs, AttrPath & attrPath,
 | 
			
		|||
    AttrPath::iterator i;
 | 
			
		||||
    // All attrpaths have at least one attr
 | 
			
		||||
    assert(!attrPath.empty());
 | 
			
		||||
    for (i = attrPath.begin(); i + 1 < attrPath.end(); i++) {
 | 
			
		||||
    // Checking attrPath validity.
 | 
			
		||||
    // ===========================
 | 
			
		||||
    for (i = attrPath.begin(); i + 1 < attrPath.end(); i++) { 
 | 
			
		||||
        if (i->symbol.set()) {
 | 
			
		||||
            ExprAttrs::AttrDefs::iterator j = attrs->attrs.find(i->symbol);
 | 
			
		||||
            if (j != attrs->attrs.end()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -102,11 +104,29 @@ static void addAttr(ExprAttrs * attrs, AttrPath & attrPath,
 | 
			
		|||
            attrs = nested;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (i->symbol.set()) {
 | 
			
		||||
    // Expr insertion.
 | 
			
		||||
    // ==========================
 | 
			
		||||
    if (i->symbol.set()) { 
 | 
			
		||||
        ExprAttrs::AttrDefs::iterator j = attrs->attrs.find(i->symbol);
 | 
			
		||||
        if (j != attrs->attrs.end()) {
 | 
			
		||||
            dupAttr(attrPath, pos, j->second.pos);
 | 
			
		||||
            // This attr path is already defined. However, if both
 | 
			
		||||
            // e and the expr pointed by the attr path are two attribute sets,
 | 
			
		||||
            // we want to merge them.
 | 
			
		||||
            // Otherwise, throw an error.
 | 
			
		||||
            ExprAttrs* ae = dynamic_cast<ExprAttrs *>(e);
 | 
			
		||||
            ExprAttrs* jAttrs = dynamic_cast<ExprAttrs *>(j->second.e);
 | 
			
		||||
            if (jAttrs && ae) {
 | 
			
		||||
                for (auto ad: ae->attrs) {
 | 
			
		||||
                    ExprAttrs::AttrDefs::iterator j2 = jAttrs->attrs.find(ad.first);
 | 
			
		||||
                    if (j2 != jAttrs->attrs.end()) // Attr already defined in iAttrs, error.
 | 
			
		||||
                        dupAttr(ad.first, j2->second.pos, ad.second.pos);
 | 
			
		||||
                    jAttrs->attrs[ad.first] = ad.second;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                dupAttr(attrPath, pos, j->second.pos);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            // This attr path is not defined. Let's create it.
 | 
			
		||||
            attrs->attrs[i->symbol] = ExprAttrs::AttrDef(e, pos);
 | 
			
		||||
            e->setName(i->symbol);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue