예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
            }
예제 #5
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);
 }
예제 #6
0
        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));
        }
예제 #7
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 PartialParseResult CheckForStructureChanges(TextChange textChange)
 {
     return(RazorEditorParser.CheckForStructureChanges(textChange));
 }