示例#1
0
        private static (ImmutableArray <Diagnostic>, string) GetGeneratedOutput(string source)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(source);

            var references = new List <MetadataReference>();

            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
            foreach (var assembly in assemblies)
            {
                if (!assembly.IsDynamic)
                {
                    references.Add(MetadataReference.CreateFromFile(assembly.Location));
                }
            }

            var compilation = CSharpCompilation.Create("foo", new SyntaxTree[] { syntaxTree }, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            //ImmutableArray<Diagnostic> diagnostics = compilation.GetDiagnostics();

            //if (diagnostics.Any())
            //{
            //    return (diagnostics, "");
            //}

            ISourceGenerator generator = new EnumValidationGenerator();

            var driver = CSharpGeneratorDriver.Create(generator);

            driver.RunGeneratorsAndUpdateCompilation(compilation, out var outputCompilation, out var diagnostics);

            return(diagnostics, string.Join(Environment.NewLine, outputCompilation.SyntaxTrees.Skip(1)));
        }
示例#2
0
        private void VerifyGeneratedMethodLines(string source, string expectedEnumName, string expectedBody)
        {
            SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source);

            List <MetadataReference> references = new List <MetadataReference>();

            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
            foreach (Assembly assembly in assemblies)
            {
                if (!assembly.IsDynamic)
                {
                    references.Add(MetadataReference.CreateFromFile(assembly.Location));
                }
            }

            CSharpCompilation compilation = CSharpCompilation.Create("original", new SyntaxTree[] { syntaxTree }, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            ISourceGenerator generator = new EnumValidationGenerator();

            CSharpGeneratorDriver driver = CSharpGeneratorDriver.Create(generator);

            driver.RunGeneratorsAndUpdateCompilation(compilation, out Compilation outputCompilation, out ImmutableArray <Diagnostic> diagnostics);
            Assert.False(diagnostics.Any(d => d.Severity == DiagnosticSeverity.Error), "Failed: " + diagnostics.FirstOrDefault()?.GetMessage());

            string output = outputCompilation.SyntaxTrees.Skip(1).First().ToString();

            List <string> lines = output.Split("\r\n").ToList();

            AssertFirstLineAndRemove(lines, "// <auto-generated />");
            AssertFirstLineAndRemove(lines, "namespace SourceGenerated");
            AssertFirstLineAndRemove(lines, "{");
            AssertFirstLineAndRemove(lines, "internal static partial class EnumValidator");
            AssertFirstLineAndRemove(lines, "{");

            AssertFirstLineAndRemove(lines, "/// <summary>Validates that the enum value passed in is valid for the enum type.</summary>");
            AssertFirstLineAndRemove(lines, $"public static void Validate({expectedEnumName} enumToValidate, string parameterName = \"value\")");
            AssertFirstLineAndRemove(lines, "{");
            AssertFirstLineAndRemove(lines, "int intValue = (int)enumToValidate;");

            foreach (string line in expectedBody.Split("\r\n"))
            {
                AssertFirstLineAndRemove(lines, line.Trim());
            }

            AssertFirstLineAndRemove(lines, $"ReportEnumValidationError(parameterName, intValue, typeof({expectedEnumName}));");

            AssertFirstLineAndRemove(lines, "}");