public void RemoveRequestedAtts() { if (this.ResolvedAttributeSet != null) { Marker marker = new Marker { CountIndex = 0, MarkIndex = this.InheritedMark }; this.TakeReference(ResolvedAttributeSet.RemoveRequestedAtts(marker)); this.InheritedMark = marker.MarkIndex; } }
public ResolvedAttributeSet RemoveRequestedAtts(Marker marker) { int countIndex = marker.CountIndex; int markIndex = marker.MarkIndex; // for every attribute in the set run any attribute removers on the traits they have ResolvedAttributeSet appliedAttSet = new ResolvedAttributeSet(); int l = this.Set.Count; for (int iAtt = 0; iAtt < l; iAtt++) { ResolvedAttribute resAtt = this.Set[iAtt]; // possible for another set to be in this set ResolvedAttributeSet subSet = resAtt.Target as ResolvedAttributeSet; if (subSet?.Set != null) { // well, that happened. so now we go around again on this same function and get rid of things from this group marker.CountIndex = countIndex; marker.MarkIndex = markIndex; ResolvedAttributeSet newSubSet = subSet.RemoveRequestedAtts(marker); countIndex = marker.CountIndex; markIndex = marker.MarkIndex; // replace the set with the new one that came back resAtt.Target = newSubSet; // if everything went away, then remove this group if (newSubSet?.Set == null || newSubSet.Set.Count == 0) { resAtt = null; } else { // don't count this as an attribute (later) countIndex--; } } else { // this is a good time to make the resolved names final resAtt.previousResolvedName = resAtt.ResolvedName; if (resAtt.Arc != null && resAtt.Arc.ApplierCaps != null && resAtt.Arc.ApplierCaps.CanRemove) { foreach (AttributeResolutionApplier apl in resAtt.Arc.ActionsRemove) { // this should look like the applier context when the att was created ApplierContext ctx = new ApplierContext() { ResOpt = resAtt.Arc.ResOpt, ResAttSource = resAtt, ResGuide = resAtt.Arc.ResGuide }; if (apl.WillRemove(ctx)) { resAtt = null; break; } } } } if (resAtt != null) { // attribute remains // are we building a new set? if (appliedAttSet != null) { this.CopyAttCtxMappingsInto(appliedAttSet.Ra2attCtxSet, appliedAttSet.AttCtx2ra, resAtt); appliedAttSet.Merge(resAtt); } countIndex++; } else { // remove the att // if this is the first removed attribute, then make a copy of the set now // after this point, the rest of the loop logic keeps the copy going as needed if (appliedAttSet == null) { appliedAttSet = new ResolvedAttributeSet(); for (int iCopy = 0; iCopy < iAtt; iCopy++) { this.CopyAttCtxMappingsInto(appliedAttSet.Ra2attCtxSet, appliedAttSet.AttCtx2ra, this.Set[iCopy]); appliedAttSet.Merge(this.Set[iCopy]); } } // track deletes under the mark (move the mark up) if (countIndex < markIndex) { markIndex--; } } } marker.CountIndex = countIndex; marker.MarkIndex = markIndex; // now we are that (or a copy) ResolvedAttributeSet rasResult = this; if (appliedAttSet != null && appliedAttSet.Size != rasResult.Size) { rasResult = appliedAttSet; rasResult.BaseTrait2Attributes = null; rasResult.AttributeContext = this.AttributeContext; } return(rasResult); }