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);
        }
예제 #4
0
        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();
            }
        }