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 static ICustomTypeGenerator GetCustomTypeGenerator(Compilation compilation, Type type) { var types = compilation.GetNamespaceTypes(x => x.IsEqualTo <TestCustomTypeGenerator>()); var assembly = AdhocProject.CompileAssembly(types); return((ICustomTypeGenerator)Activator.CreateInstance(assembly.GetTypes().Single(x => x.FullName == type.FullName)) !); }
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() }); } }
private static void GenerateByOptions(Options o) { Console.WriteLine("Generating TypeScript"); if (o.Assembly.Count() != 1 || o.Directory.Any()) { var(customTypeGenerator, typesProvider) = AdhocProject.GetCompilation(o.Directory.ToArray(), o.Assembly.ToArray()).GetCustomization(); var typeGenerator = new TypeScriptGenerator(o.ToTypeScriptGenerationOptions(), customTypeGenerator, typesProvider); typeGenerator.GenerateFiles(o.OutputDirectory); return; } ExecuteAndUnload(Path.GetFullPath(o.Assembly.Single()), out var testAlcWeakRef, o); // это нужно для того чтобы сборка из AssemblyLoadContext была выгружена // https://docs.microsoft.com/en-us/dotnet/standard/assembly/unloadability?view=netcore-3.1 for (var i = 0; testAlcWeakRef.IsAlive && i < 10; i++) { GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); // здесь может случиться deadlock // https://github.com/dotnet/runtime/issues/535 GC.WaitForPendingFinalizers(); } }