public void Rewrite() { var project = AdhocProject.FromDirectory($"{TestContext.CurrentContext.TestDirectory}/../../../../AspNetCoreExample.Generator"); var compilation = project.GetCompilationAsync().GetAwaiter().GetResult() .AddReferences(GetMetadataReferences()) .AddReferences(MetadataReference.CreateFromFile(typeof(ControllerBase).Assembly.Location)); var tree = compilation.SyntaxTrees.Single(x => x.FilePath.Contains("ApiControllerTypeBuildingContext.cs")); var root = tree.GetRoot(); var result = new TypeInfoRewriter(compilation.GetSemanticModel(tree)).Visit(root); compilation = compilation.ReplaceSyntaxTree(tree, result.SyntaxTree); result = new RemoveUsingsRewriter(compilation.GetSemanticModel(result.SyntaxTree)).Visit(result); var str = result.ToFullString(); var expectedCode = File.ReadAllText($"{TestContext.CurrentContext.TestDirectory}/Files/ApiControllerTypeBuildingContext.txt").Replace("\r\n", "\n"); str.Diff(expectedCode).ShouldBeEmpty(); var assembly = CompileAssembly(result.SyntaxTree); var buildingContext = assembly.GetType("AspNetCoreExample.Generator.ApiControllerTypeBuildingContext"); var acceptMethod = buildingContext.GetMethod("Accept", BindingFlags.Public | BindingFlags.Static); acceptMethod.Invoke(null, new object[] { TypeInfo.From <bool>() }).Should().Be(false); acceptMethod.Invoke(null, new object[] { TypeInfo.From <UsersController>() }).Should().Be(true); }
public void Rewrite() { var project = AdhocProject.FromDirectory($"{TestContext.CurrentContext.TestDirectory}/../../../../AspNetCoreExample.Generator"); project = project.RemoveDocument(project.Documents.Single(x => x.Name == "ApiControllerTypeBuildingContext.cs").Id) .AddDocument("ApiControllerTypeBuildingContext.cs", File.ReadAllText(GetFilePath("ApiControllerTypeBuildingContext.txt"))) .Project; var compilation = project.GetCompilationAsync().GetAwaiter().GetResult() ! .AddReferences(AdhocProject.GetMetadataReferences()) .AddReferences(MetadataReference.CreateFromFile(typeof(ControllerBase).Assembly.Location)); TypeInfoRewriter.Types.Clear(); var tree = compilation.SyntaxTrees.Single(x => x.FilePath.Contains("ApiControllerTypeBuildingContext.cs")); var result = TypeInfoRewriter.Rewrite(compilation, tree); var str = result.ToString(); var expectedCode = File.ReadAllText(GetFilePath("ApiControllerTypeBuildingContext.Expected.txt")).Replace("\r\n", "\n"); str.Diff(expectedCode).ShouldBeEmpty(); var assembly = AdhocProject.CompileAssembly(new[] { result }); var buildingContext = assembly.GetType("AspNetCoreExample.Generator.ApiControllerTypeBuildingContext") !; var acceptMethod = buildingContext.GetMethod("Accept", BindingFlags.Public | BindingFlags.Static) !; acceptMethod.Invoke(null, new object[] { TypeInfo.From <bool>() }).Should().Be(false); acceptMethod.Invoke(null, new object[] { TypeInfo.From <UsersController>() }).Should().Be(true); }
public RoslynTypesProvider(string typeName) { this.typeName = typeName; project = AdhocProject.FromDirectory(TestContext.CurrentContext.TestDirectory + "/../../../Types"); compilation = project.GetCompilationAsync().GetAwaiter().GetResult(); var coreTypes = new[] { typeof(object), typeof(HashSet <>), typeof(ContractGeneratorIgnoreAttribute) }; var assemblies = coreTypes.Select(x => x.Assembly.Location).ToArray(); compilation = compilation.AddReferences(assemblies.Select(x => MetadataReference.CreateFromFile(x))); foreach (var diagnostic in compilation.GetDiagnostics()) { File.AppendAllLines("diagnostic.log", new[] { diagnostic.ToString() }); } }