public void CheckForStructureChangesStartsFullReparseIfChangeOverlapsMultipleSpans() { // Arrange RazorEditorParser parser = new RazorEditorParser(CreateHost(), TestLinePragmaFileName); ITextBuffer original = new StringTextBuffer("Foo @bar Baz"); ITextBuffer changed = new StringTextBuffer("Foo @bap Daz"); TextChange change = new TextChange(7, 3, original, 3, changed); ManualResetEventSlim parseComplete = new ManualResetEventSlim(); int parseCount = 0; parser.DocumentParseComplete += (sender, args) => { Interlocked.Increment(ref parseCount); parseComplete.Set(); }; Assert.Equal(PartialParseResult.Rejected, parser.CheckForStructureChanges(new TextChange(0, 0, new StringTextBuffer(String.Empty), 12, original))); MiscUtils.DoWithTimeoutIfNotDebugging(parseComplete.Wait); // Wait for the parse to finish parseComplete.Reset(); // Act PartialParseResult result = parser.CheckForStructureChanges(change); // Assert Assert.Equal(PartialParseResult.Rejected, result); MiscUtils.DoWithTimeoutIfNotDebugging(parseComplete.Wait); Assert.Equal(2, parseCount); }
public void CheckForStructureChangesStartsFullReparseIfChangeOverlapsMultipleSpans() { // Arrange using (var parser = new RazorEditorParser(CreateHost(), TestLinePragmaFileName)) { var original = new StringTextBuffer("Foo @bar Baz"); var changed = new StringTextBuffer("Foo @bap Daz"); var change = new TextChange(7, 3, original, 3, changed); var parseComplete = new ManualResetEventSlim(); var parseCount = 0; parser.DocumentParseComplete += (sender, args) => { Interlocked.Increment(ref parseCount); parseComplete.Set(); }; Assert.Equal(PartialParseResult.Rejected, parser.CheckForStructureChanges(new TextChange(0, 0, new StringTextBuffer(string.Empty), 12, original))); MiscUtils.DoWithTimeoutIfNotDebugging(parseComplete.Wait); // Wait for the parse to finish parseComplete.Reset(); // Act var result = parser.CheckForStructureChanges(change); // Assert Assert.Equal(PartialParseResult.Rejected, result); MiscUtils.DoWithTimeoutIfNotDebugging(parseComplete.Wait); Assert.Equal(2, parseCount); } }
public void CheckForStructureChangesStartsReparseAndFiresDocumentParseCompletedEventIfNoAdditionalChangesQueued() { // Arrange using (RazorEditorParser parser = CreateClientParser()) { StringTextBuffer input = new StringTextBuffer(SimpleCSHTMLDocument.ReadAllText()); DocumentParseCompleteEventArgs capturedArgs = null; ManualResetEventSlim parseComplete = new ManualResetEventSlim(false); parser.DocumentParseComplete += (sender, args) => { capturedArgs = args; parseComplete.Set(); }; // Act parser.CheckForStructureChanges(new TextChange(0, 0, new StringTextBuffer(String.Empty), input.Length, input)); // Assert MiscUtils.DoWithTimeoutIfNotDebugging(parseComplete.Wait); string generatedCode = capturedArgs.GeneratorResults.GeneratedCode.GenerateCode <CSharpCodeProvider>(); Assert.Equal( SimpleCSHTMLDocumentGenerated.ReadAllText(), MiscUtils.StripRuntimeVersion(generatedCode)); } }
public PartialParseResult CheckForStructureChangesAndWait(TextChange change) { PartialParseResult result = Parser.CheckForStructureChanges(change); if (result.HasFlag(PartialParseResult.Rejected)) { WaitForParse(); } return(result); }
public void CheckForStructureChangesRequiresNonNullBufferInChange() { var change = new TextChange(); var parameterName = "change"; var exception = Assert.Throws<ArgumentException>( parameterName, () => { using (var parser = new RazorEditorParser(CreateHost(), "C:\\Foo.cshtml")) { parser.CheckForStructureChanges(change); } }); ExceptionHelpers.ValidateArgumentException(parameterName, RazorResources.FormatStructure_Member_CannotBeNull(nameof(change.NewBuffer), nameof(TextChange)), exception); }
public override ParsedDocument Parse(bool storeAst, string fileName, System.IO.TextReader content, Projects.Project project = null) { currentDocument = openDocuments.FirstOrDefault(d => d.FileName == fileName); // We need document and project to be loaded to correctly initialize Razor Host. if (project == null || (currentDocument == null && !TryAddDocument(fileName))) { return(new RazorCSharpParsedDocument(fileName, new RazorCSharpPageInfo())); } this.project = project as AspMvcProject; EnsureParserInitializedFor(fileName); var errors = new List <Error> (); using (var source = new SeekableTextReader(content)) { var textChange = CreateTextChange(source); var parseResult = editorParser.CheckForStructureChanges(textChange); if (parseResult == PartialParseResult.Rejected) { parseComplete.WaitOne(); if (!capturedArgs.GeneratorResults.Success) { GetRazorErrors(errors); } } } CreateHtmlDocument(); GetHtmlErrors(errors); CreateCSharpParsedDocument(); ClearLastChange(); var pageInfo = new RazorCSharpPageInfo() { HtmlRoot = htmlParsedDocument, GeneratorResults = capturedArgs.GeneratorResults, Spans = editorParser.CurrentParseTree.Flatten(), CSharpParsedFile = parsedCodeFile, CSharpCode = csharpCode, Errors = errors, FoldingRegions = GetFoldingRegions(), Comments = comments, Compilation = CreateCompilation() }; return(new RazorCSharpParsedDocument(fileName, pageInfo)); }
public void CheckForStructureChangesRequiresNonNullBufferInChange() { var change = new TextChange(); var parameterName = "change"; var exception = Assert.Throws <ArgumentException>( parameterName, () => { using (var parser = new RazorEditorParser(CreateHost(), "C:\\Foo.cshtml")) { parser.CheckForStructureChanges(change); } }); ExceptionHelpers.ValidateArgumentException(parameterName, RazorResources.FormatStructure_Member_CannotBeNull(nameof(change.NewBuffer), nameof(TextChange)), exception); }
public PartialParseResult CheckForStructureChanges(TextChange textChange) { return(RazorEditorParser.CheckForStructureChanges(textChange)); }