public void GetAttributeNameValuePairs_ParsesPairsCorrectly( string documentContent, IEnumerable<KeyValuePair<string, string>> expectedPairs) { // Arrange var errorSink = new ErrorSink(); var parseResult = ParseDocument(documentContent, errorSink); var document = parseResult.Document; var rewriters = RazorParser.GetDefaultRewriters(new HtmlMarkupParser()); var rewritingContext = new RewritingContext(document, errorSink); foreach (var rewriter in rewriters) { rewriter.Rewrite(rewritingContext); } var block = rewritingContext.SyntaxTree.Children.First(); var parseTreeRewriter = new TagHelperParseTreeRewriter(provider: null); // Assert - Guard var tagBlock = Assert.IsType<Block>(block); Assert.Equal(BlockType.Tag, tagBlock.Type); Assert.Empty(errorSink.Errors); // Act var pairs = parseTreeRewriter.GetAttributeNameValuePairs(tagBlock); // Assert Assert.Equal(expectedPairs, pairs); }
private ParserResults ParseCore(ITextDocument input) { // Setup the parser context var errorSink = new ErrorSink(); var context = new ParserContext(input, CodeParser, MarkupParser, MarkupParser, errorSink) { DesignTimeMode = DesignTimeMode }; MarkupParser.Context = context; CodeParser.Context = context; // Execute the parse MarkupParser.ParseDocument(); // Get the result var results = context.CompleteParse(); // Rewrite whitespace if supported var rewritingContext = new RewritingContext(results.Document, errorSink); foreach (ISyntaxTreeRewriter rewriter in Optimizers) { rewriter.Rewrite(rewritingContext); } var descriptors = Enumerable.Empty<TagHelperDescriptor>(); if (TagHelperDescriptorResolver != null) { descriptors = GetTagHelperDescriptors(rewritingContext.SyntaxTree, rewritingContext.ErrorSink); var tagHelperProvider = new TagHelperDescriptorProvider(descriptors); var tagHelperParseTreeRewriter = new TagHelperParseTreeRewriter(tagHelperProvider); // Rewrite the document to utilize tag helpers tagHelperParseTreeRewriter.Rewrite(rewritingContext); } var syntaxTree = rewritingContext.SyntaxTree; // Link the leaf nodes into a chain Span prev = null; foreach (Span node in syntaxTree.Flatten()) { node.Previous = prev; if (prev != null) { prev.Next = node; } prev = node; } // Return the new result return new ParserResults(syntaxTree, descriptors, errorSink); }