public CompilationUnitSyntax Generate(Assembly assembly)
        {
            var assemblyName    = assembly.GetName();
            var assemblyVersion = assemblyName.Version;
            var compilation     = _compilationProvider.Get(
                assembly.GetName().Name,
                references: new[] { _metadataReferenceLoader.CreateFromFile(assembly.Location) });

            var namespaceSymbols = GetNamespaceMembers(compilation.GlobalNamespace);

            var compilationSyntax = CompilationUnit();

            compilationSyntax = compilationSyntax.AddUsings(UsingDirective(IdentifierName("System.Reflection")))
                                .WithAttributeLists(List(new[]
            {
                CreateAssemblyAttributeList("AssemblyTitle", $"{assemblyName.Name}"),
                CreateAssemblyAttributeList("AssemblyVersion", $"{assemblyVersion}"),
                CreateAssemblyAttributeList("AssemblyFileVersion", $"{assemblyVersion}"),
                CreateAssemblyAttributeList("AssemblyInformationalVersion", $"{assemblyVersion}")
            }));

            foreach (var namespaceSymbol in namespaceSymbols)
            {
                var classSymbols = CreateNamedTypeDeclaration(namespaceSymbol).ToArray();
                if (classSymbols.Any())
                {
                    var namespaceSyntax = NamespaceDeclaration(IdentifierName(namespaceSymbol.ToString())).AddMembers(classSymbols);
                    compilationSyntax = compilationSyntax.AddMembers(namespaceSyntax);
                }
            }

            return(compilationSyntax);
        }
Esempio n. 2
0
        public SyntaxNode Rewrite(CompilationUnitSyntax compilationUnitSyntax, Assembly assembly)
        {
            var compilation = _compilationProvider.Get(assembly.GetName().Name);

            compilation = compilation.AddSyntaxTrees(CSharpSyntaxTree.Create(compilationUnitSyntax));

            foreach (var metadataRewriterService in _metadataRewriterServices)
            {
                var rewriterName = metadataRewriterService.GetType().Name;
                Logger.Info($"Executing {rewriterName}");
                var currentTree   = compilation.SyntaxTrees.Single();
                var semanticModel = compilation.GetSemanticModel(currentTree);
                var rewrittenNode = metadataRewriterService.Rewrite(assembly, semanticModel, currentTree.GetRoot());
                compilation = compilation.ReplaceSyntaxTree(currentTree, SyntaxTree(rewrittenNode));
                Logger.Info($"Finished execution of {rewriterName}");
            }

            return(compilation.SyntaxTrees.Single().GetRoot());
        }
        public GeneratorResult Generate(MetadataGeneratorOptions options)
        {
            var generatorResult = new GeneratorResult();
            var targetFramework = new FrameworkName(options.TargetFramework);
            var package         = _packageManager.InstallPackage(options.Package, options.PackageVersion, targetFramework);

            if (package == null)
            {
                Logger.Error("Unable to find package {0} {1}", options.Package, options.PackageVersion ?? string.Empty);
                return(null);
            }

            if (!string.IsNullOrWhiteSpace(options.OutputFolder) && !_fileSystem.DirectoryExists(options.OutputFolder))
            {
                _fileSystem.CreateDirectory(options.OutputFolder);
            }

            var packages   = _dependencyResolver.GetDependenciesAndSelf(package, targetFramework).ToList();
            var assemblies = _packageAssemblyResolver.ResolveAssemblies(package, targetFramework);

            foreach (var assembly in assemblies)
            {
                var compilationUnit = _cakeSourceGenerator.Generate(assembly);
                var rewrittenNode   = _cakeSyntaxRewriterService.Rewrite(compilationUnit, assembly);

                var emitedAssemblyName = $"{assembly.GetName().Name}.{MetadataClassSuffix}";
                var compilation        = _compilationProvider.Get(
                    emitedAssemblyName,
                    new[] { SyntaxFactory.ParseSyntaxTree(rewrittenNode.NormalizeWhitespace().ToFullString()) },
                    _metadataReferenceLoader.CreateFromPackages(packages, targetFramework),
                    new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

                var result = _compiler.Compile(compilation, Path.Combine(options.OutputFolder ?? string.Empty, $"{emitedAssemblyName}.dll"));
                generatorResult.EmitedAssemblies.Add(result);
                generatorResult.SourceAssemblies.Add(assembly);
            }

            return(generatorResult);
        }