public void ComponentDocumentClassifierPass_UsesRelativePathToGenerateTypeNameAndNamespace()
        {
            // Arrange
            var relativePath = "/Pages/Announcements/Banner.razor";
            var properties   = new RazorSourceDocumentProperties(filePath: $"/MyApp{relativePath}", relativePath: relativePath);
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            codeDocument.SetFileKind(FileKinds.Component);

            var projectEngine = CreateProjectEngine(b =>
            {
                b.SetRootNamespace("MyApp");
            });

            var irDocument = CreateIRDocument(projectEngine, codeDocument);
            var pass       = new ComponentDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal("Banner", visitor.Class.ClassName);
            Assert.Equal("MyApp.Pages.Announcements", visitor.Namespace.Content);
        }
Ejemplo n.º 2
0
        public void ComponentDocumentClassifierPass_SetsClass()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: "/MyApp/Test.razor", relativePath: "Test.razor");
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            codeDocument.SetInputDocumentKind(InputDocumentKind.Component);

            var projectEngine = CreateProjectEngine();
            var irDocument    = CreateIRDocument(projectEngine, codeDocument);
            var pass          = new ComponentDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal($"global::{CodeGenerationConstants.RazorComponent.FullTypeName}", visitor.Class.BaseType);
            Assert.Equal(new[] { "public", "sealed" }, visitor.Class.Modifiers);
            Assert.Equal("Test", visitor.Class.ClassName);
        }
    public void Execute_NoOpsForBlazorComponents()
    {
        // Arrange
        var properties   = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: "Test.razor");
        var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("Hello world", properties));

        codeDocument.SetFileKind(FileKinds.Component);

        var engine = CreateProjectEngine(b =>
        {
            PageDirective.Register(b);
        }).Engine;
        var irDocument = CreateIRDocument(engine, codeDocument);
        var pass       = new CreateNewOnMetadataUpdateAttributePass
        {
            Engine = engine
        };
        var documentClassifier = new DefaultDocumentClassifierPass {
            Engine = engine
        };

        // Act
        documentClassifier.Execute(codeDocument, irDocument);
        pass.Execute(codeDocument, irDocument);
        var visitor = new Visitor();

        visitor.Visit(irDocument);

        // Assert
        Assert.Empty(visitor.ExtensionNodes);
    }
Ejemplo n.º 4
0
        public void RazorPageDocumentClassifierPass_AddsRouteTemplateMetadata()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: "Test.cshtml");
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("@page \"some-route\"", properties));

            var engine     = CreateProjectEngine().Engine;
            var irDocument = CreateIRDocument(engine, codeDocument);
            var pass       = new RazorPageDocumentClassifierPass
            {
                Engine = engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            var attributeNode = Assert.IsType <RazorCompiledItemMetadataAttributeIntermediateNode>(visitor.ExtensionNode);

            Assert.Equal("RouteTemplate", attributeNode.Key);
            Assert.Equal("some-route", attributeNode.Value);
        }
        public void ComponentDocumentClassifierPass_SetsNamespace()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: "/MyApp/Test.razor", relativePath: "Test.razor");
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            codeDocument.SetFileKind(FileKinds.Component);

            var projectEngine = CreateProjectEngine(b =>
            {
                b.SetRootNamespace("MyApp");
            });

            var irDocument = CreateIRDocument(projectEngine, codeDocument);
            var pass       = new ComponentDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal("MyApp", visitor.Namespace.Content);
        }
        public void ComponentDocumentClassifierPass_SanitizesClassName()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: @"x:\My.+App\path.with+invalid-chars.razor", relativePath: "path.with+invalid-chars.razor");
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            codeDocument.SetFileKind(FileKinds.Component);

            var projectEngine = CreateProjectEngine(b =>
            {
                b.SetRootNamespace("My.+App");
            });

            var irDocument = CreateIRDocument(projectEngine, codeDocument);
            var pass       = new ComponentDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal("path_with_invalid_chars", visitor.Class.ClassName);
            Assert.Equal("My._App", visitor.Namespace.Content);
        }
        public void ComponentDocumentClassifierPass_SetsClass()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: "/MyApp/Test.razor", relativePath: "Test.razor");
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            codeDocument.SetFileKind(FileKinds.Component);

            var projectEngine = CreateProjectEngine(b =>
            {
                b.SetRootNamespace("MyApp");
            });

            var irDocument = CreateIRDocument(projectEngine, codeDocument);
            var pass       = new ComponentDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal($"{ComponentsApi.ComponentBase.FullTypeName}", visitor.Class.BaseType);
            Assert.Equal(new[] { "public", "partial" }, visitor.Class.Modifiers);
            Assert.Equal("Test", visitor.Class.ClassName);
        }
Ejemplo n.º 8
0
        public static RazorSourceDocument CreateSourceDocument(
            string content      = "Hello, world!",
            Encoding encoding   = null,
            string filePath     = "test.cshtml",
            string relativePath = "test.cshtml")
        {
            var properties = new RazorSourceDocumentProperties(filePath, relativePath);

            return(new StringSourceDocument(content, encoding ?? Encoding.UTF8, properties));
        }
Ejemplo n.º 9
0
    /// <summary>
    /// Reads the <see cref="RazorSourceDocument"/> from the specified <paramref name="stream"/>.
    /// </summary>
    /// <param name="stream">The <see cref="Stream"/> to read from.</param>
    /// <param name="fileName">The file name of the template.</param>
    /// <returns>The <see cref="RazorSourceDocument"/>.</returns>
    public static RazorSourceDocument ReadFrom(Stream stream, string fileName)
    {
        if (stream == null)
        {
            throw new ArgumentNullException(nameof(stream));
        }

        var properties = new RazorSourceDocumentProperties(fileName, relativePath: null);

        return(new StreamSourceDocument(stream, null, properties));
    }
        public static RazorSourceDocument Create(
            string content,
            RazorSourceDocumentProperties properties,
            Encoding encoding      = null,
            bool normalizeNewLines = false)
        {
            if (normalizeNewLines)
            {
                content = NormalizeNewLines(content);
            }

            return(new StringSourceDocument(content, encoding ?? Encoding.UTF8, properties));
        }
Ejemplo n.º 11
0
    /// <summary>
    /// Creates a <see cref="RazorSourceDocument"/> from the specified <paramref name="content"/>.
    /// </summary>
    /// <param name="content">The source document content.</param>
    /// <param name="properties">Properties to configure the <see cref="RazorSourceDocument"/>.</param>
    /// <returns>The <see cref="RazorSourceDocument"/>.</returns>
    /// <remarks>Uses <see cref="System.Text.Encoding.UTF8" /></remarks>
    public static RazorSourceDocument Create(string content, RazorSourceDocumentProperties properties)
    {
        if (content == null)
        {
            throw new ArgumentNullException(nameof(content));
        }

        if (properties == null)
        {
            throw new ArgumentNullException(nameof(properties));
        }

        return(Create(content, Encoding.UTF8, properties));
    }
Ejemplo n.º 12
0
    public void ReadFrom_WithProperties()
    {
        // Arrange
        var content    = TestRazorSourceDocument.CreateStreamContent(encoding: Encoding.UTF32);
        var properties = new RazorSourceDocumentProperties("c:\\myapp\\filePath.cshtml", "filePath.cshtml");

        // Act
        var document = RazorSourceDocument.ReadFrom(content, Encoding.UTF32, properties);

        // Assert
        Assert.Equal("c:\\myapp\\filePath.cshtml", document.FilePath);
        Assert.Equal("filePath.cshtml", document.RelativePath);
        Assert.Same(Encoding.UTF32, Assert.IsType <StreamSourceDocument>(document).Encoding);
    }
Ejemplo n.º 13
0
    public void Create_WithProperties()
    {
        // Arrange
        var content    = "Hello world";
        var properties = new RazorSourceDocumentProperties("c:\\myapp\\filePath.cshtml", "filePath.cshtml");

        // Act
        var document = RazorSourceDocument.Create(content, Encoding.UTF32, properties);

        // Assert
        Assert.Equal("c:\\myapp\\filePath.cshtml", document.FilePath);
        Assert.Equal("filePath.cshtml", document.RelativePath);
        Assert.Equal(content, ReadContent(document));
        Assert.Same(Encoding.UTF32, Assert.IsType <StringSourceDocument>(document).Encoding);
    }
Ejemplo n.º 14
0
    public StreamSourceDocument(Stream stream, Encoding encoding, RazorSourceDocumentProperties properties)
    {
        if (stream == null)
        {
            throw new ArgumentNullException(nameof(stream));
        }

        if (properties == null)
        {
            throw new ArgumentNullException(nameof(properties));
        }

        // Notice we don't validate the encoding here. StreamSourceDocument can compute it.
        _checksum            = ComputeChecksum(stream);
        _innerSourceDocument = CreateInnerSourceDocument(stream, encoding, properties);
    }
Ejemplo n.º 15
0
    /// <summary>
    /// Creates a <see cref="RazorSourceDocument"/> from the specified <paramref name="content"/>.
    /// </summary>
    /// <param name="content">The source document content.</param>
    /// <param name="fileName">The file name of the <see cref="RazorSourceDocument"/>.</param>
    /// <param name="encoding">The <see cref="System.Text.Encoding"/> of the file <paramref name="content"/> was read from.</param>
    /// <returns>The <see cref="RazorSourceDocument"/>.</returns>
    public static RazorSourceDocument Create(string content, string fileName, Encoding encoding)
    {
        if (content == null)
        {
            throw new ArgumentNullException(nameof(content));
        }

        if (encoding == null)
        {
            throw new ArgumentNullException(nameof(encoding));
        }

        var properties = new RazorSourceDocumentProperties(fileName, relativePath: null);

        return(new StringSourceDocument(content, encoding, properties));
    }
        public static RazorSourceDocument Create(
            string content         = "Hello, world!",
            Encoding encoding      = null,
            bool normalizeNewLines = false,
            string filePath        = "test.cshtml",
            string relativePath    = "test.cshtml")
        {
            if (normalizeNewLines)
            {
                content = NormalizeNewLines(content);
            }

            var properties = new RazorSourceDocumentProperties(filePath, relativePath);

            return(new StringSourceDocument(content, encoding ?? Encoding.UTF8, properties));
        }
        public static RazorSourceDocument CreateResource(string resourcePath, Assembly assembly, Encoding encoding = null, bool normalizeNewLines = false)
        {
            var file = TestFile.Create(resourcePath, assembly);

            using (var input = file.OpenRead())
                using (var reader = new StreamReader(input))
                {
                    var content = reader.ReadToEnd();
                    if (normalizeNewLines)
                    {
                        content = NormalizeNewLines(content);
                    }

                    var properties = new RazorSourceDocumentProperties(resourcePath, resourcePath);
                    return(new StringSourceDocument(content, encoding ?? Encoding.UTF8, properties));
                }
        }
Ejemplo n.º 18
0
    /// <summary>
    /// Reads the <see cref="RazorSourceDocument"/> from the specified <paramref name="stream"/>.
    /// </summary>
    /// <param name="stream">The <see cref="Stream"/> to read from.</param>
    /// <param name="encoding">The <see cref="System.Text.Encoding"/> to use to read the <paramref name="stream"/>.</param>
    /// <param name="properties">Properties to configure the <see cref="RazorSourceDocument"/>.</param>
    /// <returns>The <see cref="RazorSourceDocument"/>.</returns>
    public static RazorSourceDocument ReadFrom(Stream stream, Encoding encoding, RazorSourceDocumentProperties properties)
    {
        if (stream == null)
        {
            throw new ArgumentNullException(nameof(stream));
        }

        if (encoding == null)
        {
            throw new ArgumentNullException(nameof(encoding));
        }

        if (properties == null)
        {
            throw new ArgumentNullException(nameof(properties));
        }

        return(new StreamSourceDocument(stream, encoding, properties));
    }
    public void Execute_AddsAttributes()
    {
        // Arrange
        var properties   = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: "Test.cshtml");
        var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("Hello world", properties));

        var engine = CreateProjectEngine(b =>
        {
            PageDirective.Register(b);
        }).Engine;;
        var irDocument = CreateIRDocument(engine, codeDocument);
        var pass       = new CreateNewOnMetadataUpdateAttributePass
        {
            Engine = engine
        };
        var documentClassifier = new MvcViewDocumentClassifierPass {
            Engine = engine
        };

        // Act
        documentClassifier.Execute(codeDocument, irDocument);
        pass.Execute(codeDocument, irDocument);
        var visitor = new Visitor();

        visitor.Visit(irDocument);

        // Assert
        Assert.Collection(
            visitor.ExtensionNodes,
            node =>
        {
            var attributeNode = Assert.IsType <RazorCompiledItemMetadataAttributeIntermediateNode>(node);
            Assert.Equal("Identifier", attributeNode.Key);
            Assert.Equal("/Test.cshtml", attributeNode.Value);
        },
            node =>
        {
            Assert.IsType <CreateNewOnMetadataUpdateAttributePass.CreateNewOnMetadataUpdateAttributeIntermediateNode>(node);
        });
    }
Ejemplo n.º 20
0
        public void MvcViewDocumentClassifierPass_SanitizesClassName()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: @"x:\Test.cshtml", relativePath: "path.with+invalid-chars");
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("@page", properties));

            var projectEngine = CreateProjectEngine();
            var irDocument    = CreateIRDocument(projectEngine, codeDocument);
            var pass          = new MvcViewDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal("path_with_invalid_chars", visitor.Class.ClassName);
        }
Ejemplo n.º 21
0
        public void MvcViewDocumentClassifierPass_UsesAbsolutePath_IfRelativePathIsNotSet()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: @"x::\application\Views\Home\Index.cshtml", relativePath: null);
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            var projectEngine = CreateProjectEngine();
            var irDocument    = CreateIRDocument(projectEngine, codeDocument);
            var pass          = new MvcViewDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal("x___application_Views_Home_Index", visitor.Class.ClassName);
        }
Ejemplo n.º 22
0
        public void MvcViewDocumentClassifierPass_UsesRelativePathToGenerateTypeName(string relativePath, string expected)
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: relativePath);
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            var projectEngine = CreateProjectEngine();
            var irDocument    = CreateIRDocument(projectEngine, codeDocument);
            var pass          = new MvcViewDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal(expected, visitor.Class.ClassName);
        }
Ejemplo n.º 23
0
        // Internal for testing
        internal void AddHierarchicalImports(string sourceFilePath, List <RazorSourceDocument> imports)
        {
            // We want items in descending order. FindHierarchicalItems returns items in ascending order.
            var importProjectItems = ProjectEngine.FileSystem.FindHierarchicalItems(sourceFilePath, ImportsFileName).Reverse();

            foreach (var importProjectItem in importProjectItems)
            {
                RazorSourceDocument importSourceDocument;

                if (importProjectItem.Exists)
                {
                    importSourceDocument = RazorSourceDocument.ReadFrom(importProjectItem);
                }
                else
                {
                    // File doesn't exist on disk so just add a marker source document as an identifier for "there could be something here".
                    var sourceDocumentProperties = new RazorSourceDocumentProperties(importProjectItem.FilePath, importProjectItem.RelativePhysicalPath);
                    importSourceDocument = RazorSourceDocument.Create(string.Empty, sourceDocumentProperties);
                }

                imports.Add(importSourceDocument);
            }
        }
Ejemplo n.º 24
0
        public void MvcViewDocumentClassifierPass_SetsClass()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: "ignored", relativePath: "Test.cshtml");
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            var projectEngine = CreateProjectEngine();
            var irDocument    = CreateIRDocument(projectEngine, codeDocument);
            var pass          = new MvcViewDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal("global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>", visitor.Class.BaseType);
            Assert.Equal(new[] { "public" }, visitor.Class.Modifiers);
            Assert.Equal("Test", visitor.Class.ClassName);
        }
Ejemplo n.º 25
0
    public StringSourceDocument(string content, Encoding encoding, RazorSourceDocumentProperties properties)
    {
        if (content == null)
        {
            throw new ArgumentNullException(nameof(content));
        }

        if (encoding == null)
        {
            throw new ArgumentNullException(nameof(encoding));
        }

        if (properties == null)
        {
            throw new ArgumentNullException(nameof(properties));
        }

        _content     = content;
        Encoding     = encoding;
        FilePath     = properties.FilePath;
        RelativePath = properties.RelativePath;

        _lines = new DefaultRazorSourceLineCollection(this);
    }
Ejemplo n.º 26
0
        public void RazorPageDocumentClassifierPass_NullFilePath_SetsClass()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: null, relativePath: null);
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("@page", properties));

            var engine     = CreateProjectEngine().Engine;
            var irDocument = CreateIRDocument(engine, codeDocument);
            var pass       = new RazorPageDocumentClassifierPass
            {
                Engine = engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal("global::Microsoft.AspNetCore.Mvc.RazorPages.Page", visitor.Class.BaseType);
            Assert.Equal(new[] { "public" }, visitor.Class.Modifiers);
            Assert.Equal("AspNetCore_74fbaab062bb228ed1ab09c5ff8d6ed2417320e2", visitor.Class.ClassName);
        }
Ejemplo n.º 27
0
        public void MvcViewDocumentClassifierPass_NullFilePath_SetsClass()
        {
            // Arrange
            var properties   = new RazorSourceDocumentProperties(filePath: null, relativePath: null);
            var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("some-content", properties));

            var projectEngine = CreateProjectEngine();
            var irDocument    = CreateIRDocument(projectEngine, codeDocument);
            var pass          = new MvcViewDocumentClassifierPass
            {
                Engine = projectEngine.Engine
            };

            // Act
            pass.Execute(codeDocument, irDocument);
            var visitor = new Visitor();

            visitor.Visit(irDocument);

            // Assert
            Assert.Equal("global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>", visitor.Class.BaseType);
            Assert.Equal(new[] { "public" }, visitor.Class.Modifiers);
            Assert.Equal("AspNetCore_d9f877a857a7e9928eac04d09a59f25967624155", visitor.Class.ClassName);
        }
Ejemplo n.º 28
0
    private static RazorSourceDocument CreateInnerSourceDocument(Stream stream, Encoding encoding, RazorSourceDocumentProperties properties)
    {
        var streamLength    = (int)stream.Length;
        var content         = string.Empty;
        var contentEncoding = encoding ?? Encoding.UTF8;

        if (streamLength > 0)
        {
            var bufferSize = Math.Min(streamLength, LargeObjectHeapLimitInChars);

            var reader = new StreamReader(
                stream,
                contentEncoding,
                detectEncodingFromByteOrderMarks: true,
                bufferSize: bufferSize,
                leaveOpen: true);

            using (reader)
            {
                reader.Peek();      // Just to populate the encoding

                if (encoding == null)
                {
                    contentEncoding = reader.CurrentEncoding;
                }
                else if (encoding != reader.CurrentEncoding)
                {
                    throw new InvalidOperationException(
                              Resources.FormatMismatchedContentEncoding(
                                  encoding.EncodingName,
                                  reader.CurrentEncoding.EncodingName));
                }

                if (streamLength > LargeObjectHeapLimitInChars)
                {
                    // If the resulting string would end up on the large object heap, then use LargeTextSourceDocument.
                    return(new LargeTextSourceDocument(
                               reader,
                               LargeObjectHeapLimitInChars,
                               contentEncoding,
                               properties));
                }

                content = reader.ReadToEnd();
            }
        }

        return(new StringSourceDocument(content, contentEncoding, properties));
    }
Ejemplo n.º 29
0
    public LargeTextSourceDocument(StreamReader reader, int chunkMaxLength, Encoding encoding, RazorSourceDocumentProperties properties)
    {
        if (reader == null)
        {
            throw new ArgumentNullException(nameof(reader));
        }

        if (encoding == null)
        {
            throw new ArgumentNullException(nameof(encoding));
        }

        if (properties == null)
        {
            throw new ArgumentNullException(nameof(properties));
        }

        _chunkMaxLength = chunkMaxLength;
        Encoding        = encoding;
        FilePath        = properties.FilePath;
        RelativePath    = properties.RelativePath;

        ReadChunks(reader, _chunkMaxLength, out _length, out _chunks);
        _lines = new DefaultRazorSourceLineCollection(this);
    }