internal static void WriteDebugTree(string sourceFile, Block document, PartialParseResult result, TextChange change, RazorEditorParser parser, bool treeStructureChanged) { if (!OutputDebuggingEnabled) { return; } RunTask(() => { string outputFileName = Normalize(sourceFile) + "_tree"; string outputPath = Path.Combine(Path.GetDirectoryName(sourceFile), outputFileName); var treeBuilder = new StringBuilder(); WriteTree(document, treeBuilder); treeBuilder.AppendLine(); treeBuilder.AppendFormat(CultureInfo.CurrentCulture, "Last Change: {0}", change); treeBuilder.AppendLine(); treeBuilder.AppendFormat(CultureInfo.CurrentCulture, "Normalized To: {0}", change.Normalize()); treeBuilder.AppendLine(); treeBuilder.AppendFormat(CultureInfo.CurrentCulture, "Partial Parse Result: {0}", result); treeBuilder.AppendLine(); if (result.HasFlag(PartialParseResult.Rejected)) { treeBuilder.AppendFormat(CultureInfo.CurrentCulture, "Tree Structure Changed: {0}", treeStructureChanged); treeBuilder.AppendLine(); } if (result.HasFlag(PartialParseResult.AutoCompleteBlock)) { treeBuilder.AppendFormat(CultureInfo.CurrentCulture, "Auto Complete Insert String: \"{0}\"", parser.GetAutoCompleteString()); treeBuilder.AppendLine(); } File.WriteAllText(outputPath, treeBuilder.ToString()); }); }
public BackgroundParser(RazorEditorParser parser, string filePath) { _main = new MainThreadState(filePath); _bg = new BackgroundThread(_main, parser, filePath); _main.ResultsReady += (sender, args) => OnResultsReady(args); }
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 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 void TryGetFromBuffer_PrefersVisualStudioRazorParserIfRazorEditorParserIsAvailable() { // Arrange var properties = new PropertyCollection(); var expectedCodeDocument = TestRazorCodeDocument.Create("Hello World"); var parser = new DefaultVisualStudioRazorParser(expectedCodeDocument); properties.AddProperty(typeof(VisualStudioRazorParser), parser); var unexpectedCodeDocument = TestRazorCodeDocument.Create("Unexpected"); var legacyParser = new RazorEditorParser(unexpectedCodeDocument); properties.AddProperty(typeof(RazorEditorParser), legacyParser); var textBuffer = new Mock <ITextBuffer>(); textBuffer.Setup(buffer => buffer.Properties) .Returns(properties); var provider = new LegacyTextBufferCodeDocumentProvider(); // Act var result = provider.TryGetFromBuffer(textBuffer.Object, out var codeDocument); // Assert Assert.True(result); Assert.Same(expectedCodeDocument, codeDocument); }
protected static TestParserManager CreateParserManager() { RazorEngineHost host = CreateHost(); RazorEditorParser parser = new RazorEditorParser(host, TestLinePragmaFileName); return(new TestParserManager(parser)); }
public void TreesAreDifferentReturnsFalseIfTreeStructureIsSame() { var factory = SpanFactory.CreateCsHtml(); Block original = new MarkupBlock( factory.Markup("<p>"), new ExpressionBlock( factory.CodeTransition(), factory.Code("f") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false)), factory.Markup("</p>")); factory.Reset(); Block modified = new MarkupBlock( factory.Markup("<p>"), new ExpressionBlock( factory.CodeTransition(), factory.Code("foo") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: false)), factory.Markup("</p>")); original.LinkNodes(); modified.LinkNodes(); ITextBuffer oldBuffer = new StringTextBuffer("<p>@f</p>"); ITextBuffer newBuffer = new StringTextBuffer("<p>@foo</p>"); Assert.False(RazorEditorParser.TreesAreDifferent( original, modified, new[] { new TextChange(position: 5, oldLength: 0, oldBuffer: oldBuffer, newLength: 2, newBuffer: newBuffer) })); }
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.AreEqual(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.AreEqual(PartialParseResult.Rejected, result); MiscUtils.DoWithTimeoutIfNotDebugging(parseComplete.Wait); Assert.AreEqual(2, parseCount); }
void DisposeCurrentParser() { editorParser.Dispose(); editorParser = null; parseComplete.Dispose(); parseComplete = null; ClearLastChange(); }
public TestParserManager(RazorEditorParser parser) { ParserComplete = new ManualResetEventSlim(); ParseCount = 0; Parser = parser; parser.DocumentParseComplete += (sender, args) => { Interlocked.Increment(ref ParseCount); ParserComplete.Set(); }; }
public BackgroundThread(MainThreadState main, RazorEditorParser parser, string fileName) { // Run on MAIN thread! _main = main; _shutdownToken = _main.CancelToken; _parser = parser; _filePath = fileName; _backgroundThread = new Thread(WorkerLoop); SetThreadId(_backgroundThread.ManagedThreadId); }
public ShimRazorEditorParserImpl(string virtualPath, string physicalPath) { WebPageRazorHost razorWebPageRazorHost = ShimRazorEditorParserImpl.GetRazorWebPageRazorHost(virtualPath, physicalPath); HtmlSettings.Changed += OnSettingsChanged; razorWebPageRazorHost.DesignTimeMode = true; OnSettingsChanged(razorWebPageRazorHost); _codeDomProviderType = razorWebPageRazorHost.CodeLanguage.CodeDomProviderType; RazorEditorParser = new RazorEditorParser(razorWebPageRazorHost, physicalPath); RazorEditorParser.DocumentParseComplete += OnDocumentParseComplete; }
void CreateParserFor(string fileName) { editorParser = new RazorEditorParser(CreateRazorHost(fileName), fileName); parseComplete = new AutoResetEvent(false); editorParser.DocumentParseComplete += (sender, args) => { capturedArgs = args; parseComplete.Set(); }; lastParsedFile = fileName; }
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 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 void ImplicitExpressionRejectsWholeIdentifierReplacementToKeyword() { // Arrange RazorEngineHost host = CreateHost(); RazorEditorParser parser = new RazorEditorParser(host, @"C:\This\Is\A\Test\Path"); TestParserManager manager = new TestParserManager(parser); StringTextBuffer old = new StringTextBuffer("foo @date baz"); StringTextBuffer changed = new StringTextBuffer("foo @if baz"); TextChange textChange = new TextChange(5, 4, old, 2, changed); manager.InitializeWithDocument(old); // Act PartialParseResult result = manager.CheckForStructureChangesAndWait(textChange); // Assert Assert.Equal(PartialParseResult.Rejected, result); Assert.Equal(2, manager.ParseCount); }
public string GetAutoCompleteString() { return(RazorEditorParser.GetAutoCompleteString()); }
public PartialParseResult CheckForStructureChanges(TextChange textChange) { return(RazorEditorParser.CheckForStructureChanges(textChange)); }