예제 #1
0
        // 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);
                }
            }