// Template Root attribute rules // - No if binding allowed // - No property bindings allowed // - Dynamic attr bindings are ok // - Dynamic style bindings are ok // - Style bindings are ok // - Event subscriptions are ok // - Input handler declarations are ok // - Context variables are ok public static StructList <AttributeDefinition> MergeExpandedAttributes(StructList <AttributeDefinition> innerAttributes, StructList <AttributeDefinition> outerAttributes) { StructList <AttributeDefinition> output = null; if (innerAttributes == null) { if (outerAttributes == null) { return(null); } output = new StructList <AttributeDefinition>(outerAttributes.size); for (int i = 0; i < outerAttributes.size; i++) { AttributeDefinition attr = outerAttributes.array[i]; output.AddUnsafe(attr); } return(output); } if (outerAttributes == null) { output = new StructList <AttributeDefinition>(innerAttributes.size); for (int i = 0; i < innerAttributes.size; i++) { AttributeDefinition attr = innerAttributes.array[i]; attr.flags |= AttributeFlags.InnerContext; output.AddUnsafe(attr); } return(output); } output = new StructList <AttributeDefinition>(innerAttributes.size + outerAttributes.size); for (int i = 0; i < innerAttributes.size; i++) { AttributeDefinition attr = innerAttributes.array[i]; attr.flags |= AttributeFlags.InnerContext; output.AddUnsafe(attr); } const AttributeType replacedType = AttributeType.Attribute | AttributeType.InstanceStyle; for (int i = 0; i < outerAttributes.size; i++) { ref AttributeDefinition attr = ref outerAttributes.array[i]; int idx = ContainsAttr(attr, output); if (idx == -1) { output.AddUnsafe(attr); continue; } if ((attr.type & replacedType) != 0) { output.array[idx] = attr; } else { output.AddUnsafe(attr); } }