コード例 #1
0
        protected override bool ExpandExtension(ref MethodInvocationExpression extension,
                                                MacroStatement macro, MacroStatement parent,
                                                ref Statement expansion)
        {
            if (macro.Body != null)
            {
                PromoteExtensions(macro, parent);

                var builder = new HashConfigurationBuilder();

                if (builder.BuildConfig(macro.Body, Errors) && builder.HasConfiguration)
                {
                    extension.Arguments.Add(builder.HashConfiguration);
                    return(true);
                }
            }

            return(false);
        }
コード例 #2
0
        private bool ProcessAttributes(MacroStatement macro)
        {
            HashConfigurationBuilder builder = new HashConfigurationBuilder();

            if (!builder.BuildAttributes(macro.Block, Errors))
            {
                return(false);
            }

            if (builder.HasConfiguration)
            {
                MethodInvocationExpression extension = new MethodInvocationExpression(
                    AstUtil.CreateReferenceExpression(typeof(ConfigurationExtension).FullName)
                    );
                extension.Arguments.Add(builder.HashConfiguration);
                RegisterExtension(macro, extension);
            }
            return(true);
        }
コード例 #3
0
        private bool BuildConfigurationChild(MethodInvocationExpression child)
        {
            Block                    configBlock;
            List <Expression>        attributes  = new List <Expression>();
            ConfigurationNodeVisitor nodeVisitor = new ConfigurationNodeVisitor();

            if (!nodeVisitor.GetNode(child, _compileErrors))
            {
                return(false);
            }

            if (!MacroHelper.IsNewBlock(child, out configBlock))
            {
                attributes.AddRange(child.Arguments);

                return(BuildConfigurationChild(nodeVisitor.Node, null, attributes));
            }
            else
            {
                if (configBlock.HasStatements)
                {
                    HashConfigurationBuilder nested = new HashConfigurationBuilder();
                    if (nested.BuildConfig(configBlock, _compileErrors) &&
                        nested.HasConfiguration)
                    {
                        _configuration.Items.Add(new ExpressionPair(nodeVisitor.Node,
                                                                    nested.HashConfiguration));
                        return(true);
                    }
                }
                else
                {
                    return(BuildConfigurationChild(nodeVisitor.Node, null, null));
                }
            }

            return(false);
        }
コード例 #4
0
        private bool BuildConfigurationChild(MethodInvocationExpression child)
        {
            Block configBlock;
            var attributes = new List<Expression>();
            var nodeVisitor = new ConfigurationNodeVisitor();
            if (nodeVisitor.GetNode(child, _compileErrors) == false)
                return false;

            if (MacroHelper.IsNewBlock(child, out configBlock) == false)
            {
                attributes.AddRange(child.Arguments);

                return BuildConfigurationChild(nodeVisitor.Node, null, attributes);
            }
            else
            {
                if (configBlock.IsEmpty == false)
                {
                    var nested = new HashConfigurationBuilder();
                    if (nested.BuildConfig(configBlock, _compileErrors) &&
                        nested.HasConfiguration)
                    {
                        _configuration.Items.Add(new ExpressionPair(nodeVisitor.Node, nested.HashConfiguration));
                        return true;
                    }
                }
                else
                {
                    return BuildConfigurationChild(nodeVisitor.Node, null, null);
                }
            }

            return false;
        }