public void RunOneLoop(IEnumerable <IDom> blockContents, IDetailBlockStart blockStart,
                               MetadataContextStack contextStack, List <IDom> newList)
        {
            var expansionFirstRunner = contextStack.GetValue(Constants.ExpansionFirstRunner) as ExpansionFirstTemplate;
            var member = blockContents.FirstOrDefault();
            var i      = 0;

            while (member != null && blockContents.Contains(member))
            {
                i++; if (i > 1000)
                {
                    throw new InvalidOperationException("Infinite loop detected");
                }
                var lastMember   = member;
                var copiedMember = member.GetType().GetMethod("Copy").Invoke(member, null) as IDom;
                var newMembers   = expansionFirstRunner.Update(copiedMember, contextStack, ref lastMember);
                // don't store the end region that matches this block start, because it's being removed
                newMembers = newMembers
                             .Where(x =>
                {
                    var block = x as IDetailBlockEnd;
                    if (block == null)
                    {
                        return(true);
                    }
                    return(block.GroupGuid != blockStart.GroupGuid);
                });
                newList.AddRange(newMembers);
                member = lastMember.NextSibling();
            }
        }
Exemplo n.º 2
0
        private bool DoInstructionInternal(IDetailBlockStart blockStart,
                                           MetadataContextStack contextStack,
                                           List <IDom> newList,
                                           ref IDom lastPart)
        {
            if (blockStart == null)
            {
                return(false);
            }
            var match = blockStartMatch.Match(blockStart.Text);

            if (!match.Success)
            {
                return(false);
            }

            var         varName           = match.Groups[varNameKey].Value;
            var         loopOver          = match.Groups[loopOverKey].Value;
            IEnumerable propAsIEnumerable = GetPropList(contextStack, loopOver);
            var         blockContents     = blockStart.BlockContents;

            foreach (var item in propAsIEnumerable)
            {
                contextStack.Push(varName, item);
                Helper.RunOneLoop(blockContents, blockStart, contextStack, newList);
                contextStack.Pop();
            }
            lastPart = blockStart.BlockEnd;
            return(true);
        }
Exemplo n.º 3
0
 private IEnumerable <SyntaxTrivia> BuildBlockStartSyntaxTrivia(IDetailBlockStart itemAsStartBlock)
 {
     if (itemAsStartBlock.BlockStyleName.Equals("region", StringComparison.OrdinalIgnoreCase))
     {
         var ret     = new List <SyntaxTrivia>();
         var message = SyntaxFactory.PreprocessingMessage(itemAsStartBlock.Text);
         var token   = SyntaxFactory.Token(SyntaxFactory.TriviaList(message),
                                           SyntaxKind.EndOfDirectiveToken,
                                           SyntaxFactory.TriviaList());
         var directive = SyntaxFactory.RegionDirectiveTrivia(true)
                         .WithEndOfDirectiveToken(token)
                         .NormalizeWhitespace();
         var whitespace = itemAsStartBlock.Whitespace2Set[LanguagePart.Parent, LanguageElement.Detail];
         if (whitespace != null)
         {
             ret.AddRange(SyntaxFactory.ParseLeadingTrivia(whitespace.LeadingWhitespace));
         }
         ret.Add(SyntaxFactory.Trivia(directive));
         //ret.Add(SyntaxFactory.EndOfLine("\r\n"));
         return(ret);
     }
     throw new NotImplementedException();
 }
Exemplo n.º 4
0
 public RDomDetailBlockEnd(IDom parent, SyntaxTrivia trivia, IDetailBlockStart blockStart, SyntaxNode structuredNode)
     : base(parent, StemMemberKind.RegionEnd, MemberKind.RegionEnd, trivia, structuredNode)
 {
     // _groupGuid = blockStart.GroupGuid;
 }
Exemplo n.º 5
0
 public RDomDetailBlockEnd(IDom parent, SyntaxTrivia trivia, IDetailBlockStart blockStart)
     : base(parent, StemMemberKind.RegionEnd, MemberKind.RegionEnd, trivia)
 {
     _groupGuid = blockStart.GroupGuid;
 }