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());
            });
        }
Exemple #2
0
            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));
        }
Exemple #7
0
        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);
        }
Exemple #9
0
 void DisposeCurrentParser()
 {
     editorParser.Dispose();
     editorParser = null;
     parseComplete.Dispose();
     parseComplete = null;
     ClearLastChange();
 }
Exemple #10
0
 public TestParserManager(RazorEditorParser parser)
 {
     ParserComplete = new ManualResetEventSlim();
     ParseCount     = 0;
     Parser         = parser;
     parser.DocumentParseComplete += (sender, args) => {
         Interlocked.Increment(ref ParseCount);
         ParserComplete.Set();
     };
 }
Exemple #11
0
                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;
        }
Exemple #13
0
        void CreateParserFor(string fileName)
        {
            editorParser = new RazorEditorParser(CreateRazorHost(fileName), fileName);

            parseComplete = new AutoResetEvent(false);
            editorParser.DocumentParseComplete += (sender, args) =>
            {
                capturedArgs = args;
                parseComplete.Set();
            };

            lastParsedFile = fileName;
        }
Exemple #14
0
 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);
        }
Exemple #16
0
        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));
 }