示例#1
0
        static void Main(string[] args)
        {
            MarkdownGenerator markdownGenerator = new MarkdownGenerator();

            JsonRpcGenerator rpcGenerator = new JsonRpcGenerator(markdownGenerator);

            rpcGenerator.Generate();
        }
示例#2
0
        public void Generate()
        {
            WriteAllText(
                @"Analyzers\README.md",
                MarkdownGenerator.CreateAnalyzersReadMe(Analyzers.Where(f => !f.IsObsolete), Comparer));

            WriteAllText(
                @"Analyzers\AnalyzersByCategory.md",
                MarkdownGenerator.CreateAnalyzersByCategoryMarkDown(Analyzers.Where(f => !f.IsObsolete), Comparer));

            foreach (AnalyzerDescriptor analyzer in Analyzers)
            {
                WriteAllText(
                    $@"..\docs\analyzers\{analyzer.Id}.md",
                    MarkdownGenerator.CreateAnalyzerMarkDown(analyzer),
                    fileMustExists: false);
            }

            WriteAllText(
                @"..\docs\refactorings\Refactorings.md",
                MarkdownGenerator.CreateRefactoringsMarkDown(Refactorings, Comparer));

            WriteAllText(
                @"Refactorings\README.md",
                MarkdownGenerator.CreateRefactoringsReadMe(Refactorings, Comparer));

            foreach (RefactoringDescriptor refactoring in Refactorings)
            {
                WriteAllText(
                    $@"..\docs\refactorings\{refactoring.Id}.md",
                    MarkdownGenerator.CreateRefactoringMarkDown(refactoring),
                    fileMustExists: false);
            }

            WriteAllText(
                @"CodeFixes\README.md",
                MarkdownGenerator.CreateCodeFixesReadMe(CodeFixes, CompilerDiagnostics, Comparer));

            WriteAllText(
                @"CodeFixes\CodeFixesByDiagnosticId.md",
                MarkdownGenerator.CreateCodeFixesByDiagnosticId(CodeFixes, CompilerDiagnostics));

            WriteAllText(
                @"..\README.md",
                File.ReadAllText(@"..\text\ReadMe.txt", Encoding.UTF8));

            WriteAllText(
                "DefaultConfigFile.xml",
                XmlGenerator.CreateDefaultConfigFile(Refactorings, CodeFixes));

            WriteAllText(
                @"VisualStudio\description.txt",
                File.ReadAllText(@"..\text\RoslynatorDescription.txt", Encoding.UTF8));

            WriteAllText(
                @"VisualStudio.Refactorings\description.txt",
                File.ReadAllText(@"..\text\RoslynatorRefactoringsDescription.txt", Encoding.UTF8));
        }
示例#3
0
        static void Main(string[] args)
        {
            try
            {
                GenerationOptions options = new GenerationOptions(args);

                var types = MarkdownGenerator.BuildFrom(options.Target, options.NamespaceMatch, options.AccessibilityLevel);

                if (types.Length == 0)
                {
                    return;
                }

                if (!Directory.Exists(options.Output))
                {
                    Directory.CreateDirectory(options.Output);
                }
                else
                {
                    DirectoryInfo directory = new DirectoryInfo(options.Output);
                    foreach (FileInfo file in directory.GetFiles())
                    {
                        file.Delete();
                    }
                    foreach (DirectoryInfo subDirectory in directory.GetDirectories())
                    {
                        subDirectory.Delete(true);
                    }
                }

                var homeBuilder = new MarkdownBuilder();
                homeBuilder.Header(1, "Contents");
                homeBuilder.AppendLine();

                switch (options.Mode)
                {
                case GenerationMode.FilePerClass:
                    GenerateFilePerClass(homeBuilder, options.Output, types);
                    break;

                case GenerationMode.FilePerNamespace:
                    GenerateFilePerNamespace(homeBuilder, options.Output, types);
                    break;

                default:
                    throw new Exception("Unknown generation mode");
                }

                File.WriteAllText(Path.Combine(options.Output, "Contents.md"), homeBuilder.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine("An exception is thrown: " + GetFullExceptionMessage(ex));
                Console.ReadKey();
            }
        }
示例#4
0
        public void Generate()
        {
            WriteAllText(
                @"Analyzers\README.md",
                MarkdownGenerator.CreateAnalyzersReadMe(Analyzers.Where(f => !f.IsObsolete), Comparer));

            WriteAllText(
                @"Analyzers\AnalyzersByCategory.md",
                MarkdownGenerator.CreateAnalyzersByCategoryMarkdown(Analyzers.Where(f => !f.IsObsolete), Comparer));

            foreach (AnalyzerDescriptor analyzer in Analyzers)
            {
                WriteAllText(
                    $@"..\docs\analyzers\{analyzer.Id}.md",
                    MarkdownGenerator.CreateAnalyzerMarkdown(analyzer),
                    fileMustExists: false);
            }

            WriteAllText(
                @"..\docs\refactorings\Refactorings.md",
                MarkdownGenerator.CreateRefactoringsMarkdown(Refactorings, Comparer));

            WriteAllText(
                @"Refactorings\README.md",
                MarkdownGenerator.CreateRefactoringsReadMe(Refactorings.Where(f => !f.IsObsolete), Comparer));

            foreach (RefactoringDescriptor refactoring in Refactorings)
            {
                WriteAllText(
                    $@"..\docs\refactorings\{refactoring.Id}.md",
                    MarkdownGenerator.CreateRefactoringMarkdown(refactoring),
                    fileMustExists: false);
            }

            WriteAllText(
                @"CodeFixes\README.md",
                MarkdownGenerator.CreateCodeFixesReadMe(CompilerDiagnostics, Comparer));

            foreach (CompilerDiagnosticDescriptor diagnostic in CompilerDiagnostics)
            {
                WriteAllText(
                    $@"..\docs\cs\{diagnostic.Id}.md",
                    MarkdownGenerator.CreateCompilerDiagnosticMarkdown(diagnostic, CodeFixes, Comparer),
                    fileMustExists: false);
            }

            WriteAllText(
                "DefaultConfigFile.xml",
                XmlGenerator.CreateDefaultConfigFile(Refactorings, CodeFixes));

            WriteAllText(
                "DefaultRuleSet.ruleset",
                XmlGenerator.CreateDefaultRuleSet(Analyzers));
        }
示例#5
0
        private static void Main(string[] args)
        {
            _shortcuts = Pihrtsoft.Records.Document.ReadRecords(@"..\..\Data\Shortcuts.xml")
                         .Where(f => !f.HasTag(KnownTags.Disabled))
                         .Select(Mapper.MapShortcutInfo)
                         .ToArray();

            SnippetDirectory[] directories = LoadDirectories(@"..\..\Data\Directories.xml");

            ShortcutInfo.SerializeToXml(Path.Combine(VisualStudioExtensionProjectPath, "Shortcuts.xml"), _shortcuts);

            LoadLanguages();

            SaveChangedSnippets(directories);

            var visualStudio = new VisualStudioEnvironment();

            (List <SnippetGeneratorResult> visualStudioResults, List <Snippet> visualStudioSnippets) = GenerateSnippets(
                visualStudio,
                directories,
                VisualStudioExtensionProjectPath);

            var visualStudioCode = new VisualStudioCodeEnvironment();

            (List <SnippetGeneratorResult> visualStudioCodeResults, List <Snippet> visualStudioCodeSnippets) = GenerateSnippets(
                visualStudioCode,
                directories,
                VisualStudioCodeExtensionProjectPath);

            CheckDuplicateShortcuts(visualStudioSnippets, visualStudio);
            CheckDuplicateShortcuts(visualStudioCodeSnippets, visualStudioCode);

            IEnumerable <Language> languages = visualStudioResults
                                               .Concat(visualStudioCodeResults)
                                               .Select(f => f.Language)
                                               .Distinct();

            var document = new MDocument(
                Heading1(ProductName),
                BulletList(
                    CodeGenerationUtility.GetProjectSubtitle(languages),
                    BulletItem(Link("Release Notes", $"{MasterGitHubUrl}/{ChangeLogFileName}"), ".")));

#if !DEBUG
            MarkdownGenerator.GenerateProjectReadme(visualStudioResults, document, visualStudio.CreateProjectReadmeSettings(), addFootnote: false);

            MarkdownGenerator.GenerateProjectReadme(visualStudioCodeResults, document, visualStudioCode.CreateProjectReadmeSettings());

            IOUtility.WriteAllText(Path.Combine(SolutionDirectoryPath, ReadMeFileName), document.ToString(MarkdownFormat.Default.WithTableOptions(TableOptions.FormatHeader)), IOUtility.UTF8NoBom);
#endif

            Console.WriteLine("*** END ***");
            Console.ReadKey();
        }
示例#6
0
        private static void Main(string[] args)
        {
            var settings = new GeneralSettings()
            {
                SolutionDirectoryPath = @"..\..\..\..\.."
            };

            SnippetDirectory[] snippetDirectories = SnippetDirectory.LoadFromFile(@"..\..\SnippetDirectories.xml").ToArray();

            CharacterSequence[] characterSequences = CharacterSequence.LoadFromFile(@"..\..\CharacterSequences.xml").ToArray();

            LanguageDefinition[] languageDefinitions = LanguageDefinition.LoadFromFile(@"..\..\LanguageDefinitions.xml").ToArray();

            CharacterSequence.SerializeToXml(Path.Combine(settings.ExtensionProjectPath, "CharacterSequences.xml"), characterSequences);

            SnippetGenerator.GenerateSnippets(snippetDirectories, languageDefinitions);
            SnippetGenerator.GenerateHtmlSnippets(snippetDirectories);
            SnippetGenerator.GenerateXamlSnippets(snippetDirectories);
            SnippetGenerator.GenerateXmlSnippets(snippetDirectories);

            SnippetDirectory[] releaseDirectories = snippetDirectories
                                                    .Where(f => f.HasTag(KnownTags.Release) && !f.HasTag(KnownTags.Dev))
                                                    .ToArray();

            MarkdownGenerator.WriteSolutionReadMe(releaseDirectories, settings);

            MarkdownGenerator.WriteProjectReadMe(releaseDirectories, Path.GetFullPath(settings.ProjectPath));

            MarkdownGenerator.WriteDirectoryReadMe(
                snippetDirectories
                .Where(f => f.HasAnyTag(KnownTags.Release, KnownTags.Dev) && !f.HasAnyTag(KnownTags.AutoGenerationSource, KnownTags.AutoGenerationDestination))
                .ToArray(),
                characterSequences,
                settings);

            SnippetPackageGenerator.GenerateVisualStudioPackageFiles(
                releaseDirectories: releaseDirectories,
                characterSequences: characterSequences,
                settings: settings);

            settings.ExtensionProjectName += ".Dev";

            SnippetPackageGenerator.GenerateVisualStudioPackageFiles(
                releaseDirectories: snippetDirectories
                .Where(f => f.HasTags(KnownTags.Release, KnownTags.Dev))
                .ToArray(),
                characterSequences: null,
                settings: settings);

            SnippetChecker.CheckSnippets(snippetDirectories);

            Console.WriteLine("*** END ***");
            Console.ReadKey();
        }
示例#7
0
        public void GenerateSimpleText()
        {
            var    generator = new MarkdownGenerator();
            string text      = generator
                               .Heading1("Heading 1")
                               .Text("This is a demo of text in ").Bold("bold").Text(", ").Italic("italic").LineEnd()
                               .Text("and ").Code("mono-spaced").ParagraphEnd()
                               .Heading2("Subheading: lists")
                               .Paragraph("First a numbered list:")
                               .Numbered("Some text", "other text", 42).Numbered("A new numbered list")
                               .Paragraph("Then a bullet list:")
                               .Bullet(1, "another bullet")
                               .ToString();

            TestDataUtility.AreEqual(text, ".md");
        }
示例#8
0
        public override List <Snippet> GeneratePackageFiles(string directoryPath, IEnumerable <SnippetGeneratorResult> results)
        {
            List <Snippet> snippets = base.GeneratePackageFiles(directoryPath, results);

#if !DEBUG
            IOUtility.WriteAllText(
                Path.Combine(directoryPath, "Overview.md"),
                MarkdownGenerator.GenerateVisualStudioMarketplaceOverview(results));
#endif

            IOUtility.WriteAllText(
                Path.Combine(directoryPath, "regedit.pkgdef"),
                PkgDefGenerator.GeneratePkgDefFile(results));

            return(snippets);
        }
示例#9
0
        public static void GenerateVisualStudioPackageFiles(
            SnippetDirectory[] releaseDirectories,
            CharacterSequence[] characterSequences,
            GeneralSettings settings)
        {
            CopySnippetsToVisualStudioProject(settings.ExtensionProjectPath, releaseDirectories);

            releaseDirectories = releaseDirectories
                                 .Select(f => f.WithPath(Path.Combine(settings.ExtensionProjectPath, f.DirectoryName)))
                                 .ToArray();

            MarkdownGenerator.WriteProjectReadMe(releaseDirectories, settings.ExtensionProjectPath);

            MarkdownGenerator.WriteDirectoryReadMe(releaseDirectories, characterSequences, settings);

            WriteVisualStudioGalleryDescription(releaseDirectories, settings);
            WritePkgDefFile(releaseDirectories, settings);
        }
示例#10
0
        private static void Main(string[] args)
        {
            var settings = new GeneralSettings();

            settings.SolutionDirectoryPath = @"..\..\..\..\..";

            SnippetDirectory[] snippetDirectories = LoadSnippetDirectories().ToArray();

            CharacterSequence[] characterSequences = LoadCharacterSequences(settings).ToArray();

            GenerateSnippets(snippetDirectories);
            GenerateHtmlSnippets(snippetDirectories);
            GenerateXamlSnippets(snippetDirectories);
            GenerateXmlSnippets(snippetDirectories);

            SnippetDirectory[] releaseDirectories = snippetDirectories
                                                    .Where(f => f.HasTag(KnownTags.Release))
                                                    .ToArray();

            MarkdownGenerator.WriteSolutionReadMe(releaseDirectories, settings);
            MarkdownGenerator.WriteProjectMarkdownFiles(releaseDirectories, Path.GetFullPath(settings.ProjectPath));
            MarkdownGenerator.WriteDirectoryMarkdownFiles(
                snippetDirectories
                .Where(f => f.HasAnyTag(KnownTags.Release, KnownTags.Dev) && !f.HasAnyTag(KnownTags.AutoGenerationSource, KnownTags.AutoGenerationDestination))
                .ToArray(),
                characterSequences);

            CopySnippetsToVisualStudioProject(settings.ExtensionProjectPath, releaseDirectories);

            releaseDirectories = releaseDirectories
                                 .Select(f => f.WithPath(Path.Combine(settings.ExtensionProjectPath, f.DirectoryName)))
                                 .ToArray();

            MarkdownGenerator.WriteProjectMarkdownFiles(releaseDirectories, settings.ExtensionProjectPath);
            MarkdownGenerator.WriteDirectoryMarkdownFiles(releaseDirectories, characterSequences);

            WriteVisualStudioGalleryDescription(releaseDirectories, settings);
            WritePkgDefFile(releaseDirectories, settings);

            CheckSnippets(snippetDirectories);

            Console.WriteLine("*** END ***");
            Console.ReadKey();
        }
示例#11
0
        public async Task <IActionResult> ExecuteBenchmarkAsync(
            [FromServices] IMediator mediator,
            [FromBody] BenchmarkRequestDto benchmarkRequest)
        {
            var targetExecutionCommand = new ExecuteBenchmarkCommand(benchmarkRequest.Benchmark,
                                                                     new Repository(benchmarkRequest.TargetRepository.Ref, benchmarkRequest.TargetRepository.Url),
                                                                     RepositoryTarget.Target);

            var targetResult = await mediator.Send(targetExecutionCommand);

            var sourceExecutionCommand = new ExecuteBenchmarkCommand(benchmarkRequest.Benchmark,
                                                                     new Repository(benchmarkRequest.SourceRepository.Ref, benchmarkRequest.SourceRepository.Url),
                                                                     RepositoryTarget.Source);

            var sourceResult = await mediator.Send(sourceExecutionCommand);

            var bytes = MarkdownGenerator.Generate(benchmarkRequest.Benchmark, targetResult, sourceResult);

            return(File(Encoding.UTF8.GetBytes(bytes), "text/html"));
        }
示例#12
0
        static void Main(string[] args)
        {
            Console.WriteLine("CHARACTERFORGE - A D&D Character Generator");
            Console.WriteLine("==========================================");
            Console.WriteLine("This application currently only used as a");
            Console.WriteLine("test driver application and will generate a");
            Console.WriteLine("pre-defined character sheet");

            ICharacter character = BuildCharacter();

            CharacterSheetBuilder builder = new CharacterSheetBuilder();
            CharacterSheet        sheet   = builder.Build(character);

            IRulebook rules = new Rulebook(new RulesFactory());
            IEnumerable <IViolation> violations = rules.CheckRules(character);

            MarkdownGenerator generator = new MarkdownGenerator();
            string            output    = generator.Generate(sheet, violations);

            File.WriteAllText("charactersheet.md", output);
        }
    public void GenerateExampleApiSuccess()
    {
        ServiceInfo  service;
        const string fileName = "Facility.CodeGen.Markdown.UnitTests.ConformanceApi.fsd";
        var          parser   = new FsdParser();
        var          stream   = GetType().GetTypeInfo().Assembly.GetManifestResourceStream(fileName);

        Assert.IsNotNull(stream);
        using (var reader = new StreamReader(stream !))
            service = parser.ParseDefinition(new ServiceDefinitionText(Path.GetFileName(fileName), reader.ReadToEnd()));

        var generator = new MarkdownGenerator
        {
            GeneratorName = "MarkdownGeneratorTests",
        };

        generator.GenerateOutput(service);

        generator.NoHttp = true;
        generator.GenerateOutput(service);
    }
示例#14
0
        static void Main(string[] args)
        {
            MarkdownGenerator markdownGenerator = new MarkdownGenerator();
            SharedContent     sharedContent     = new SharedContent();

            JsonRpcGenerator rpcGenerator = new JsonRpcGenerator(markdownGenerator, sharedContent);

            rpcGenerator.Generate();

            CliGenerator cliGenerator = new CliGenerator(markdownGenerator, sharedContent);

            cliGenerator.Generate();

            MetricsGenerator metricsGenerator = new MetricsGenerator(sharedContent);

            metricsGenerator.Generate();

            ConfigGenerator configGenerator = new ConfigGenerator(sharedContent);

            configGenerator.Generate();
        }
示例#15
0
        static void Main(string[] args)
        {
            MarkdownGenerator markdownGenerator = new MarkdownGenerator();
            SharedContent     sharedContent     = new SharedContent();

            MetricsGenerator metricsGenerator = new MetricsGenerator(sharedContent);

            metricsGenerator.Generate();

            ConfigGenerator configGenerator = new ConfigGenerator(sharedContent);

            configGenerator.Generate();

            RpcAndCliGenerator rpcAndCliGenerator = new RpcAndCliGenerator(markdownGenerator, sharedContent);

            rpcAndCliGenerator.Generate();

            SampleConfigGenerator sampleConfigGenerator = new SampleConfigGenerator(markdownGenerator, sharedContent);

            sampleConfigGenerator.Generate();
        }
示例#16
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient <IRecipePresenter, RecipePresenter>();
            services.AddTransient <IMetadataPresenter, MetadataPresenter>();
            services.AddTransient <IParser, Parser>();
            services.AddTransient <IDomainSelectorProvider, DomainSelectorProvider>();
            var markdownGenerator = new MarkdownGenerator(new TemplateProvider("handlebars-templates/recipe-template.handlebars"));
            var markdownProcessor = new MarkdownProcessor();

            services.AddControllers((options) =>
            {
                options.RespectBrowserAcceptHeader = true;
                options.ReturnHttpNotAcceptable    = true;

                options.OutputFormatters.Insert(0, new MarkdownOutputFormatter(markdownGenerator, markdownProcessor));
            });

            services.AddOpenApiDocument();

            services.AddHealthChecks();
            // In production, the React files will be served from this directory
            // services.AddSpaStaticFiles(configuration => configuration.RootPath = "ClientApp/build");
        }
示例#17
0
        private static async Task Main(string[] args)
        {
            if (args == null || args.Length == 0)
            {
#if DEBUG
                args = new string[] { @"..\..\..\..\.." };
#else
                args = new string[] { Environment.CurrentDirectory };
#endif
            }

            string rootPath = args[0];

            StringComparer comparer = StringComparer.InvariantCulture;

            var metadata = new RoslynatorMetadata(rootPath);

            ImmutableArray <AnalyzerMetadata>           analyzers             = metadata.Analyzers;
            ImmutableArray <AnalyzerMetadata>           codeAnalysisAnalyzers = metadata.CodeAnalysisAnalyzers;
            ImmutableArray <AnalyzerMetadata>           formattingAnalyzers   = metadata.FormattingAnalyzers;
            ImmutableArray <RefactoringMetadata>        refactorings          = metadata.Refactorings;
            ImmutableArray <CodeFixMetadata>            codeFixes             = metadata.CodeFixes;
            ImmutableArray <CompilerDiagnosticMetadata> compilerDiagnostics   = metadata.CompilerDiagnostics;

            WriteAnalyzersReadMe(@"Analyzers\README.md", analyzers);

            WriteAnalyzersReadMe(@"CodeAnalysis.Analyzers\README.md", codeAnalysisAnalyzers);

            WriteAnalyzersReadMe(@"Formatting.Analyzers\README.md", formattingAnalyzers);

            WriteAnalyzersByCategory(@"Analyzers\AnalyzersByCategory.md", analyzers);
#if !DEBUG
            VisualStudioInstance instance = MSBuildLocator.QueryVisualStudioInstances().First(f => f.Version.Major == 16);

            MSBuildLocator.RegisterInstance(instance);

            using (MSBuildWorkspace workspace = MSBuildWorkspace.Create())
            {
                workspace.WorkspaceFailed += (o, e) => Console.WriteLine(e.Diagnostic.Message);

                string solutionPath = Path.Combine(rootPath, "Roslynator.sln");

                Console.WriteLine($"Loading solution '{solutionPath}'");

                Solution solution = await workspace.OpenSolutionAsync(solutionPath).ConfigureAwait(false);

                Console.WriteLine($"Finished loading solution '{solutionPath}'");

                RoslynatorInfo roslynatorInfo = await RoslynatorInfo.Create(solution).ConfigureAwait(false);

                IOrderedEnumerable <SourceFile> sourceFiles = analyzers
                                                              .Select(f => new SourceFile(f.Id, roslynatorInfo.GetAnalyzerFilesAsync(f.Identifier).Result))
                                                              .Concat(refactorings
                                                                      .Select(f => new SourceFile(f.Id, roslynatorInfo.GetRefactoringFilesAsync(f.Identifier).Result)))
                                                              .OrderBy(f => f.Id);

                MetadataFile.SaveSourceFiles(sourceFiles, @"..\SourceFiles.xml");
            }
#endif
            foreach (AnalyzerMetadata analyzer in codeAnalysisAnalyzers)
            {
                WriteAllText(
                    $@"..\docs\analyzers\{analyzer.Id}.md",
                    MarkdownGenerator.CreateAnalyzerMarkdown(analyzer, new (string, string)[] { ("Roslynator.CodeAnalysis.Analyzers", "https://www.nuget.org/packages/Roslynator.CodeAnalysis.Analyzers") }),
示例#18
0
        public async Task GenerateAsync()
        {
            WriteAllText(
                @"Analyzers\README.md",
                MarkdownGenerator.CreateAnalyzersReadMe(Analyzers.Where(f => !f.IsObsolete), Comparer));

            WriteAllText(
                @"Analyzers\AnalyzersByCategory.md",
                MarkdownGenerator.CreateAnalyzersByCategoryMarkdown(Analyzers.Where(f => !f.IsObsolete), Comparer));

            VisualStudioInstance instance = MSBuildLocator.QueryVisualStudioInstances().Single();

            MSBuildLocator.RegisterInstance(instance);

            using (MSBuildWorkspace workspace = MSBuildWorkspace.Create())
            {
                workspace.WorkspaceFailed += (o, e) => Console.WriteLine(e.Diagnostic.Message);

                string solutionPath = Path.Combine(RootPath, "Roslynator.sln");

                Console.WriteLine($"Loading solution '{solutionPath}'");

                Solution solution = await workspace.OpenSolutionAsync(solutionPath).ConfigureAwait(false);

                Console.WriteLine($"Finished loading solution '{solutionPath}'");

                RoslynatorInfo roslynatorInfo = await RoslynatorInfo.Create(solution).ConfigureAwait(false);

                IOrderedEnumerable <SourceFile> sourceFiles = Analyzers
                                                              .Select(f => new SourceFile(f.Id, roslynatorInfo.GetAnalyzerFilesAsync(f.Identifier).Result))
                                                              .Concat(Refactorings
                                                                      .Select(f => new SourceFile(f.Id, roslynatorInfo.GetRefactoringFilesAsync(f.Identifier).Result)))
                                                              .OrderBy(f => f.Id);

                MetadataFile.SaveSourceFiles(sourceFiles, @"..\SourceFiles.xml");

                foreach (AnalyzerDescriptor analyzer in Analyzers)
                {
                    //IEnumerable<string> filePaths = await roslynatorInfo.GetAnalyzerFilesAsync(analyzer.Identifier).ConfigureAwait(false);

                    WriteAllText(
                        $@"..\docs\analyzers\{analyzer.Id}.md",
                        MarkdownGenerator.CreateAnalyzerMarkdown(analyzer, Array.Empty <string>()),
                        fileMustExists: false);
                }

                foreach (RefactoringDescriptor refactoring in Refactorings)
                {
                    //IEnumerable<string> filePaths = await roslynatorInfo.GetRefactoringFilesAsync(refactoring.Identifier).ConfigureAwait(false);

                    WriteAllText(
                        $@"..\docs\refactorings\{refactoring.Id}.md",
                        MarkdownGenerator.CreateRefactoringMarkdown(refactoring, Array.Empty <string>()),
                        fileMustExists: false);
                }

                foreach (CompilerDiagnosticDescriptor diagnostic in CompilerDiagnostics)
                {
                    //IEnumerable<string> filePaths = await roslynatorInfo.GetCompilerDiagnosticFilesAsync(diagnostic.Identifier).ConfigureAwait(false);

                    WriteAllText(
                        $@"..\docs\cs\{diagnostic.Id}.md",
                        MarkdownGenerator.CreateCompilerDiagnosticMarkdown(diagnostic, CodeFixes, Comparer, Array.Empty <string>()),
                        fileMustExists: false);
                }
            }

            WriteAllText(
                @"..\docs\refactorings\Refactorings.md",
                MarkdownGenerator.CreateRefactoringsMarkdown(Refactorings, Comparer));

            WriteAllText(
                @"Refactorings\README.md",
                MarkdownGenerator.CreateRefactoringsReadMe(Refactorings.Where(f => !f.IsObsolete), Comparer));

            WriteAllText(
                @"CodeFixes\README.md",
                MarkdownGenerator.CreateCodeFixesReadMe(CompilerDiagnostics, Comparer));

            WriteAllText(
                "DefaultConfigFile.xml",
                XmlGenerator.CreateDefaultConfigFile(Refactorings, CodeFixes));

            WriteAllText(
                "DefaultRuleSet.ruleset",
                XmlGenerator.CreateDefaultRuleSet(Analyzers));
        }
        /// <summary>
        /// Generates Markdown from .NET XML documentation comments.
        /// </summary>
        /// <param name="inputPath">The input assembly.</param>
        /// <param name="outputPath">The output directory.</param>
        /// <param name="settings">The settings.</param>
        /// <returns>The names of files that were added, changed, or removed.</returns>
        public static XmlDocMarkdownResult Generate(string inputPath, string outputPath, XmlDocMarkdownSettings settings)
        {
            if (inputPath == null)
            {
                throw new ArgumentNullException(nameof(inputPath));
            }
            if (outputPath == null)
            {
                throw new ArgumentNullException(nameof(outputPath));
            }

            var result = new XmlDocMarkdownResult();

            settings = settings ?? new XmlDocMarkdownSettings();

            var generator = new MarkdownGenerator
            {
                SourceCodePath  = settings.SourceCodePath,
                RootNamespace   = settings.RootNamespace,
                IncludeObsolete = settings.IncludeObsolete,
                Visibility      = settings.VisibilityLevel ?? XmlDocVisibilityLevel.Protected,
                ExternalDocs    = settings.ExternalDocs,
            };

            if (settings.NewLine != null)
            {
                generator.NewLine = settings.NewLine;
            }

            var            assembly = Assembly.LoadFrom(inputPath);
            XmlDocAssembly xmlDocAssembly;

            var xmlDocPath = Path.ChangeExtension(inputPath, ".xml");

            if (!File.Exists(xmlDocPath))
            {
                xmlDocPath = Path.ChangeExtension(inputPath, ".XML");
            }

            if (File.Exists(xmlDocPath))
            {
                var xDocument = XDocument.Load(xmlDocPath);
                xmlDocAssembly = new XmlDocAssembly(xDocument);
            }
            else
            {
                xmlDocAssembly = new XmlDocAssembly();
            }

            var namedTexts = generator.GenerateOutput(assembly, xmlDocAssembly);

            var namedTextsToWrite = new List <NamedText>();

            foreach (var namedText in namedTexts)
            {
                string existingFilePath = Path.Combine(outputPath, namedText.Name);
                if (File.Exists(existingFilePath))
                {
                    // ignore CR when comparing files
                    if (namedText.Text.Replace("\r", "") != File.ReadAllText(existingFilePath).Replace("\r", ""))
                    {
                        namedTextsToWrite.Add(namedText);
                        result.Changed.Add(namedText.Name);
                        if (!settings.IsQuiet)
                        {
                            result.Messages.Add("changed " + namedText.Name);
                        }
                    }
                }
                else
                {
                    namedTextsToWrite.Add(namedText);
                    result.Added.Add(namedText.Name);
                    if (!settings.IsQuiet)
                    {
                        result.Messages.Add("added " + namedText.Name);
                    }
                }
            }

            var namesToDelete = new List <string>();

            if (settings.ShouldClean)
            {
                var directoryInfo = new DirectoryInfo(outputPath);
                if (directoryInfo.Exists)
                {
                    string assemblyName     = assembly.GetName().Name;
                    string assemblyFilePath = assembly.Modules.FirstOrDefault()?.FullyQualifiedName;
                    string assemblyFileName = assemblyFilePath != null?Path.GetFileName(assemblyFilePath) : assemblyName;

                    string assemblyFolder = Path.GetFileNameWithoutExtension(assemblyFileName);
                    var    patterns       = new[] { $"{assemblyFolder}/*.md", $"{assemblyFolder}/*/*.md" };
                    string codeGenComment = MarkdownGenerator.GetCodeGenComment(assemblyFileName);

                    foreach (string nameMatchingPattern in FindNamesMatchingPatterns(directoryInfo, patterns, codeGenComment))
                    {
                        if (namedTexts.All(x => x.Name != nameMatchingPattern))
                        {
                            namesToDelete.Add(nameMatchingPattern);
                            result.Removed.Add(nameMatchingPattern);
                            if (!settings.IsQuiet)
                            {
                                result.Messages.Add("removed " + nameMatchingPattern);
                            }
                        }
                    }
                }
            }

            if (!settings.IsDryRun)
            {
                if (!Directory.Exists(outputPath))
                {
                    Directory.CreateDirectory(outputPath);
                }

                foreach (var namedText in namedTextsToWrite)
                {
                    string outputFilePath = Path.Combine(outputPath, namedText.Name);

                    string outputFileDirectoryPath = Path.GetDirectoryName(outputFilePath);
                    if (outputFileDirectoryPath != null && outputFileDirectoryPath != outputPath && !Directory.Exists(outputFileDirectoryPath))
                    {
                        Directory.CreateDirectory(outputFileDirectoryPath);
                    }

                    File.WriteAllText(outputFilePath, namedText.Text);
                }

                foreach (string nameToDelete in namesToDelete)
                {
                    File.Delete(Path.Combine(outputPath, nameToDelete));
                }
            }

            return(result);
        }
	public MarkdownGeneratorGlobals(MarkdownGenerator generator, ServiceInfo serviceInfo, HttpServiceInfo? httpServiceInfo)
	{
		Service = serviceInfo;
		HttpService = httpServiceInfo;
		CodeGenCommentText = CodeGenUtility.GetCodeGenComment(generator.GeneratorName ?? "");
	}
示例#21
0
        private static async Task Main(string[] args)
        {
            if (args == null || args.Length == 0)
            {
#if DEBUG
                args = new string[] { @"..\..\..\..\.." };
#else
                args = new string[] { Environment.CurrentDirectory };
#endif
            }

            string rootPath = args[0];

            StringComparer comparer = StringComparer.InvariantCulture;

            var metadata = new RoslynatorMetadata(rootPath);

            ImmutableArray <AnalyzerMetadata>           analyzers           = metadata.Analyzers;
            ImmutableArray <RefactoringMetadata>        refactorings        = metadata.Refactorings;
            ImmutableArray <CodeFixMetadata>            codeFixes           = metadata.CodeFixes;
            ImmutableArray <CompilerDiagnosticMetadata> compilerDiagnostics = metadata.CompilerDiagnostics;

            WriteAnalyzersReadMe(@"Analyzers\README.md", analyzers);

            WriteAnalyzersByCategory(@"Analyzers\AnalyzersByCategory.md", analyzers);
#if !DEBUG
            VisualStudioInstance instance = MSBuildLocator.QueryVisualStudioInstances().First(f => f.Version.Major == 15);

            MSBuildLocator.RegisterInstance(instance);

            using (MSBuildWorkspace workspace = MSBuildWorkspace.Create())
            {
                workspace.WorkspaceFailed += (o, e) => Console.WriteLine(e.Diagnostic.Message);

                string solutionPath = Path.Combine(rootPath, "Roslynator.sln");

                Console.WriteLine($"Loading solution '{solutionPath}'");

                Solution solution = await workspace.OpenSolutionAsync(solutionPath).ConfigureAwait(false);

                Console.WriteLine($"Finished loading solution '{solutionPath}'");

                RoslynatorInfo roslynatorInfo = await RoslynatorInfo.Create(solution).ConfigureAwait(false);

                IOrderedEnumerable <SourceFile> sourceFiles = analyzers
                                                              .Select(f => new SourceFile(f.Id, roslynatorInfo.GetAnalyzerFilesAsync(f.Identifier).Result))
                                                              .Concat(refactorings
                                                                      .Select(f => new SourceFile(f.Id, roslynatorInfo.GetRefactoringFilesAsync(f.Identifier).Result)))
                                                              .OrderBy(f => f.Id);

                MetadataFile.SaveSourceFiles(sourceFiles, @"..\SourceFiles.xml");
            }
#endif
            foreach (AnalyzerMetadata analyzer in analyzers)
            {
                WriteAllText(
                    $@"..\docs\analyzers\{analyzer.Id}.md",
                    MarkdownGenerator.CreateAnalyzerMarkdown(analyzer, Array.Empty <string>()),
                    fileMustExists: false);
            }

            foreach (RefactoringMetadata refactoring in refactorings)
            {
                WriteAllText(
                    $@"..\docs\refactorings\{refactoring.Id}.md",
                    MarkdownGenerator.CreateRefactoringMarkdown(refactoring, Array.Empty <string>()),
                    fileMustExists: false);
            }

            foreach (CompilerDiagnosticMetadata diagnostic in compilerDiagnostics)
            {
                WriteAllText(
                    $@"..\docs\cs\{diagnostic.Id}.md",
                    MarkdownGenerator.CreateCompilerDiagnosticMarkdown(diagnostic, codeFixes, comparer, Array.Empty <string>()),
                    fileMustExists: false);
            }

            WriteAllText(
                @"..\docs\refactorings\Refactorings.md",
                MarkdownGenerator.CreateRefactoringsMarkdown(refactorings, comparer));

            WriteAllText(
                @"Refactorings\README.md",
                MarkdownGenerator.CreateRefactoringsReadMe(refactorings.Where(f => !f.IsObsolete), comparer));

            WriteAllText(
                @"CodeFixes\README.md",
                MarkdownGenerator.CreateCodeFixesReadMe(compilerDiagnostics, comparer));

            WriteAllText(
                "DefaultConfigFile.xml",
                XmlGenerator.CreateDefaultConfigFile(refactorings, codeFixes));

            WriteAllText(
                "default.ruleset",
                XmlGenerator.CreateDefaultRuleSet(analyzers));

            // find files to delete
            foreach (string path in Directory.EnumerateFiles(GetPath(@"..\docs\refactorings")))
            {
                if (Path.GetFileName(path) != "Refactorings.md" &&
                    !refactorings.Any(f => f.Id == Path.GetFileNameWithoutExtension(path)))
                {
                    Console.WriteLine($"FILE TO DELETE: {path}");
                }
            }

            // find missing samples
            foreach (RefactoringMetadata refactoring in refactorings)
            {
                if (refactoring.Samples.Count == 0)
                {
                    foreach (ImageMetadata image in refactoring.ImagesOrDefaultImage())
                    {
                        string imagePath = Path.Combine(GetPath(@"..\images\refactorings"), image.Name + ".png");

                        if (!File.Exists(imagePath))
                        {
                            Console.WriteLine($"MISSING SAMPLE: {imagePath}");
                        }
                    }
                }
            }

            void WriteAnalyzersReadMe(string path, ImmutableArray <AnalyzerMetadata> descriptors)
            {
                WriteAllText(
                    path,
                    MarkdownGenerator.CreateAnalyzersReadMe(descriptors.Where(f => !f.IsObsolete), comparer));
            }

            void WriteAnalyzersByCategory(string path, ImmutableArray <AnalyzerMetadata> descriptors)
            {
                WriteAllText(
                    path,
                    MarkdownGenerator.CreateAnalyzersByCategoryMarkdown(descriptors.Where(f => !f.IsObsolete), comparer));
            }

            void WriteAllText(string relativePath, string content, bool onlyIfChanges = true, bool fileMustExists = true)
            {
                string path = GetPath(relativePath);

                Encoding encoding = (Path.GetExtension(path) == ".md") ? _utf8NoBom : Encoding.UTF8;

                FileHelper.WriteAllText(path, content, encoding, onlyIfChanges, fileMustExists);
            }

            string GetPath(string path)
            {
                return(Path.Combine(rootPath, path));
            }
        }
示例#22
0
        static async Task <int> Main(string[] args)
        {
            var logCommand = new Command("azlogs", "Download portfolio backend diagnostic log files from an Azure Blob Storage Container")
            {
                new Option <int?>("--days", getDefaultValue: () => null, "Only output logs going back this number of days"),
                new Option <bool>("--today", getDefaultValue: () => false, "Only output logs generated today"),
                new Option <bool>("--web", getDefaultValue: () => false, "Get web server logs"),
                new Option <string>("--env", getDefaultValue: () => "LIVE", "The environment to download from. Requires settings for each environment to be configured in appSettings e.g. AzureStorageConnectionString.LIVE & AzureStorageConnectionString.TEST.")
            };

            var fieldDocsCommand = new Command("markdown", "Generate markdown files")
            {
                new Option <string>("--file", getDefaultValue: () => "fields", "Generate markdown file for project fields.")
            };

            var rootCommand = new RootCommand("Portfolio utitlies")
            {
                logCommand, fieldDocsCommand
            };

            logCommand.Handler       = CommandHandler.Create <int?, bool, bool, string>(async(days, today, web, env) => await AzureBlobClient.OutputBlobText(days, today, web, env));
            fieldDocsCommand.Handler = CommandHandler.Create <string>(async(file) => await MarkdownGenerator.OutputFile(file));

            return(await rootCommand.InvokeAsync(args));
        }
        /// <summary>
        /// Generates Markdown from .NET XML documentation comments.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <param name="outputPath">The output directory.</param>
        /// <param name="settings">The settings.</param>
        /// <returns>The names of files that were added, changed, or removed.</returns>
        public static XmlDocMarkdownResult Generate(XmlDocInput input, string outputPath, XmlDocMarkdownSettings settings)
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }
            if (outputPath == null)
            {
                throw new ArgumentNullException(nameof(outputPath));
            }

            var result = new XmlDocMarkdownResult();

            settings = settings ?? new XmlDocMarkdownSettings();

            var generator = new MarkdownGenerator
            {
                SourceCodePath  = settings.SourceCodePath,
                RootNamespace   = settings.RootNamespace,
                IncludeObsolete = settings.IncludeObsolete,
                SkipUnbrowsable = settings.SkipUnbrowsable,
                Visibility      = settings.VisibilityLevel ?? XmlDocVisibilityLevel.Protected,
                ExternalDocs    = settings.ExternalDocs,
                NamespacePages  = settings.NamespacePages,
                FrontMatter     = settings.FrontMatter,
            };

            if (settings.NewLine != null)
            {
                generator.NewLine = settings.NewLine;
            }

            if (string.Compare(settings.PermalinkStyle, "pretty", StringComparison.OrdinalIgnoreCase) == 0)
            {
                generator.PermalinkPretty = true;
            }

            XmlDocAssembly xmlDocAssembly;

            var assembly = input.Assembly;

            if (assembly == null)
            {
                assembly = Assembly.LoadFrom(input.AssemblyPath);
            }

            var xmlDocPath = input.XmlDocPath;

            if (xmlDocPath == null)
            {
                var assemblyPath = input.AssemblyPath ?? assembly.Location;

                xmlDocPath = Path.ChangeExtension(assemblyPath, ".xml");
                if (!File.Exists(xmlDocPath))
                {
                    xmlDocPath = Path.ChangeExtension(assemblyPath, ".XML");
                }
            }

            if (xmlDocPath != null && File.Exists(xmlDocPath))
            {
                var xDocument = XDocument.Load(xmlDocPath);
                xmlDocAssembly = new XmlDocAssembly(xDocument);
            }
            else
            {
                xmlDocAssembly = new XmlDocAssembly();
            }

            var namedTexts = generator.GenerateOutput(assembly, xmlDocAssembly);

            var namedTextsToWrite = new List <NamedText>();

            foreach (var namedText in namedTexts)
            {
                string existingFilePath = Path.Combine(outputPath, namedText.Name);
                if (File.Exists(existingFilePath))
                {
                    // ignore CR when comparing files
                    if (namedText.Text.Replace("\r", "") != File.ReadAllText(existingFilePath).Replace("\r", ""))
                    {
                        namedTextsToWrite.Add(namedText);
                        result.Changed.Add(namedText.Name);
                        if (!settings.IsQuiet)
                        {
                            result.Messages.Add("changed " + namedText.Name);
                        }
                    }
                }
                else
                {
                    namedTextsToWrite.Add(namedText);
                    result.Added.Add(namedText.Name);
                    if (!settings.IsQuiet)
                    {
                        result.Messages.Add("added " + namedText.Name);
                    }
                }
            }

            if (settings.GenerateToc)
            {
                string tocPath = Path.Combine(outputPath, "toc.yml");

                NamedText root = namedTexts.FirstOrDefault();
                if (root != null)
                {
                    XmlDocToc toc = new XmlDocToc()
                    {
                        Path = root.Name, Title = root.Title, Prefix = settings.TocPrefix
                    };

                    foreach (var namedText in namedTexts.Skip(1))
                    {
                        toc.AddChild(namedText.Name, namedText.Parent, namedText.Title);
                    }

                    toc.Save(tocPath);
                }
            }

            var namesToDelete = new List <string>();

            if (settings.ShouldClean)
            {
                var directoryInfo = new DirectoryInfo(outputPath);
                if (directoryInfo.Exists)
                {
                    string assemblyName     = assembly.GetName().Name;
                    string assemblyFilePath = assembly.Modules.FirstOrDefault()?.FullyQualifiedName;
                    string assemblyFileName = assemblyFilePath != null?Path.GetFileName(assemblyFilePath) : assemblyName;

                    string assemblyFolder = Path.GetFileNameWithoutExtension(assemblyFileName);
                    var    patterns       = new[] { $"{assemblyFolder}/*.md", $"{assemblyFolder}/*/*.md" };
                    string codeGenComment = MarkdownGenerator.GetCodeGenComment(assemblyFileName);

                    foreach (string nameMatchingPattern in FindNamesMatchingPatterns(directoryInfo, patterns, codeGenComment))
                    {
                        if (namedTexts.All(x => x.Name != nameMatchingPattern))
                        {
                            namesToDelete.Add(nameMatchingPattern);
                            result.Removed.Add(nameMatchingPattern);
                            if (!settings.IsQuiet)
                            {
                                result.Messages.Add("removed " + nameMatchingPattern);
                            }
                        }
                    }
                }
            }

            if (!settings.IsDryRun)
            {
                if (!Directory.Exists(outputPath))
                {
                    Directory.CreateDirectory(outputPath);
                }

                foreach (var namedText in namedTextsToWrite)
                {
                    string outputFilePath = Path.Combine(outputPath, namedText.Name);

                    string outputFileDirectoryPath = Path.GetDirectoryName(outputFilePath);
                    if (outputFileDirectoryPath != null && outputFileDirectoryPath != outputPath && !Directory.Exists(outputFileDirectoryPath))
                    {
                        Directory.CreateDirectory(outputFileDirectoryPath);
                    }

                    File.WriteAllText(outputFilePath, namedText.Text);
                }

                foreach (string nameToDelete in namesToDelete)
                {
                    File.Delete(Path.Combine(outputPath, nameToDelete));
                }
            }

            return(result);
        }