private bool GeneratePlantUmlFromFile(Dictionary <string, string> parameters)
        {
            var inputFileName = parameters["in"];

            if (!File.Exists(inputFileName))
            {
                OnError(new Exception($"\"{inputFileName}\" does not exist."));
                return(false);
            }
            var outputFileName = "";

            if (parameters.ContainsKey("out"))
            {
                outputFileName = parameters["out"];
                try
                {
                    var outdir = Path.GetDirectoryName(outputFileName);
                    Directory.CreateDirectory(outdir);
                }
                catch (Exception e)
                {
                    OnError(e);
                    return(false);
                }
            }
            else
            {
                outputFileName = CombinePath(Path.GetDirectoryName(inputFileName),
                                             Path.GetFileNameWithoutExtension(inputFileName) + ".puml");
            }

            try
            {
                using (var stream = new FileStream(inputFileName, FileMode.Open, FileAccess.Read))
                {
                    var             tree      = CSharpSyntaxTree.ParseText(SourceText.From(stream));
                    var             root      = tree.GetRoot();
                    Accessibilities ignoreAcc = GetIgnoreAccessibilities(parameters);

                    using (var filestream = new FileStream(outputFileName, FileMode.Create, FileAccess.Write))
                        using (var writer = new StreamWriter(filestream))
                        {
                            var gen = new PlantUmlClassDiagramGenerator.Library.ClassDiagramGenerator(writer, "    ", ignoreAcc, parameters.ContainsKey("-createAssociation"));
                            gen.Generate(root);
                        }
                }
            }
            catch (Exception e)
            {
                OnError(e);
                return(false);
            }
            return(true);
        }
        private void GenerateInnerTypeDeclarations()
        {
            foreach (var node in _innerTypeDeclarationNodes)
            {
                var generator = new ClassDiagramGenerator(writer, indent);
                generator.GenerateInternal(node);

                var outerTypeNode = node.Parent as BaseTypeDeclarationSyntax;
                var innerTypeNode = node as BaseTypeDeclarationSyntax;
                if (outerTypeNode != null && innerTypeNode != null)
                {
                    var outerTypeName = TypeNameText.From(outerTypeNode);
                    var innerTypeName = TypeNameText.From(innerTypeNode);
                    WriteLine($"{outerTypeName.Identifier} +-- {innerTypeName.Identifier}");
                }
            }
        }
        private bool GeneratePlantUmlFromDir(Dictionary <string, string> parameters)
        {
            var inputRoot = parameters["in"];

            if (!Directory.Exists(inputRoot))
            {
                OnError(new Exception($"Directory \"{inputRoot}\" does not exist."));
                return(false);
            }

            // Use GetFullPath to fully support relative paths.
            var outputRoot = Path.GetFullPath(inputRoot);

            if (parameters.ContainsKey("out"))
            {
                outputRoot = parameters["out"];
                try
                {
                    Directory.CreateDirectory(outputRoot);
                }
                catch (Exception e)
                {
                    OnError(e);
                    return(false);
                }
            }

            var excludePaths = new List <string>();
            var pumlexclude  = CombinePath(inputRoot, ".pumlexclude");

            if (File.Exists(pumlexclude))
            {
                excludePaths = File.ReadAllLines(pumlexclude).ToList();
            }
            if (parameters.ContainsKey("-excludePaths"))
            {
                excludePaths.AddRange(parameters["-excludePaths"].Split(','));
            }

            var files = Directory.EnumerateFiles(inputRoot, "*.cs", SearchOption.AllDirectories);

            var includeRefs = new StringBuilder();

            includeRefs.AppendLine("@startuml");

            var error = false;

            foreach (var inputFile in files)
            {
                if (excludePaths
                    .Select(p => CombinePath(inputRoot, p))
                    .Any(p => inputFile.StartsWith(p, StringComparison.InvariantCultureIgnoreCase)))
                {
                    OnProgress($"Skipped \"{inputFile}\"...");
                    continue;
                }

                OnProgress($"Create puml: \"{inputFile}\"...");
                try
                {
                    var outputDir = CombinePath(outputRoot, Path.GetDirectoryName(inputFile).Replace(inputRoot, ""));
                    Directory.CreateDirectory(outputDir);
                    var outputFile = CombinePath(outputDir,
                                                 Path.GetFileNameWithoutExtension(inputFile) + ".puml");

                    using (var stream = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
                    {
                        var             tree      = CSharpSyntaxTree.ParseText(SourceText.From(stream));
                        var             root      = tree.GetRoot();
                        Accessibilities ignoreAcc = GetIgnoreAccessibilities(parameters);

                        using (var filestream = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                            using (var writer = new StreamWriter(filestream))
                            {
                                var gen = new PlantUmlClassDiagramGenerator.Library.ClassDiagramGenerator(writer, "    ", ignoreAcc, parameters.ContainsKey("-createAssociation"));
                                gen.Generate(root);
                            }
                    }

                    if (parameters.ContainsKey("-allInOne"))
                    {
                        var lines = File.ReadAllLines(outputFile);
                        foreach (string line in lines.Skip(1).SkipLast(1))
                        {
                            includeRefs.AppendLine(line);
                        }
                    }
                    else
                    {
                        var newRoot = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @".\" : @".";
                        includeRefs.AppendLine("!include " + outputFile.Replace(outputRoot, newRoot));
                    }
                }
                catch (Exception e)
                {
                    Exception ex = new Exception($"Error {inputFile}, {e.Message}", e);
                    OnError(ex);
                    error = true;
                }
            }
            includeRefs.AppendLine("@enduml");
            File.WriteAllText(CombinePath(outputRoot, "include.puml"), includeRefs.ToString());

            if (error)
            {
                OnError(new Exception("There were files that could not be processed."));
                return(false);
            }
            return(true);
        }