コード例 #1
0
        private void ApplyMethodCall(MixinDefinition definition, MethodCall includeMethodCall, MethodCall mixinSignature)
        {
            var targetBlock = Parent as Block;
            var sourceBlock = definition.Value as Block;

            foreach (var child in sourceBlock.Children)
            {
                var newChild = child.Clone(targetBlock);
                targetBlock.Children.Add(newChild);
            }

            var enumerator = new LineDanceEnumerator(
                mixinSignature.Parameters.Children,
                includeMethodCall.Parameters.Children);

            while (enumerator.MoveNext())
            {
                var currents = enumerator.Currents;

                var mixinParameterExpression = currents.First() as Expression;
                var mixinVariable            = mixinParameterExpression.Children.First() as Variable;

                var methodArgumentExpression = currents.Skip(1).First() as Expression;
                var argumentValue            = methodArgumentExpression.Children.First();

                var variableReferences = new List <Node>();
                targetBlock.Find(n => (n is Variable &&
                                       ((Variable)n).Name == mixinVariable.Name),
                                 variableReferences);

                foreach (var variableReference in variableReferences)
                {
                    var variableContainer = variableReference.Parent as Expression;
                    var variableOrdinal   = variableContainer.Children.IndexOf(variableReference);
                    var newValue          = argumentValue.Clone(variableContainer);
                    variableContainer.Children[variableOrdinal] = newValue;
                }
            }
        }
コード例 #2
0
ファイル: IncludeDirective.cs プロジェクト: lzcd/Crass
        private void ApplyMethodCall(MixinDefinition definition, MethodCall includeMethodCall, MethodCall mixinSignature)
        {
            var targetBlock = Parent as Block;
            var sourceBlock = definition.Value as Block;
            foreach (var child in sourceBlock.Children)
            {
                var newChild = child.Clone(targetBlock);
                targetBlock.Children.Add(newChild);
            }

            var enumerator = new LineDanceEnumerator(
                                    mixinSignature.Parameters.Children,
                                    includeMethodCall.Parameters.Children);

            while (enumerator.MoveNext())
            {
                var currents = enumerator.Currents;

                var mixinParameterExpression = currents.First() as Expression;
                var mixinVariable = mixinParameterExpression.Children.First() as Variable;

                var methodArgumentExpression = currents.Skip(1).First() as Expression;
                var argumentValue = methodArgumentExpression.Children.First();

                var variableReferences = new List<Node>();
                targetBlock.Find(n => (n is Variable &&
                    ((Variable)n).Name == mixinVariable.Name),
                    variableReferences);

                foreach (var variableReference in variableReferences)
                {
                    var variableContainer = variableReference.Parent as Expression;
                    var variableOrdinal = variableContainer.Children.IndexOf(variableReference);
                    var newValue = argumentValue.Clone(variableContainer);
                    variableContainer.Children[variableOrdinal] = newValue;
                }
            }
        }