Наследование: Microsoft.CodeAnalysis.CSharp.CSharpSyntaxWalker
        private static bool GeneratePlantUmlFromFile(Dictionary <string, string> parameters)
        {
            var inputFileName = parameters["in"];

            if (!File.Exists(inputFileName))
            {
                Console.WriteLine($"\"{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)
                {
                    Console.WriteLine(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 ClassDiagramGenerator(writer, "    ", ignoreAcc);
                            gen.Generate(root);
                        }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(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}");
                }
            }
        }
        public void GenerateTest_All()
        {
            var code = File.ReadAllText("testData\\inputClasses.cs");
            var tree = CSharpSyntaxTree.ParseText(code);
            var root = tree.GetRoot();

            var output = new StringBuilder();
            using (var writer = new StringWriter(output))
            {
                var gen = new ClassDiagramGenerator(writer, "    ");
                gen.Generate(root);
            }

            var expected = ConvertNewLineCode(File.ReadAllText(@"uml\all.puml"),Environment.NewLine);
            var actual = output.ToString();
            Console.Write(actual);
            Assert.AreEqual(expected, actual);
        }
        public void GenerateTest_GenericsTypes()
        {
            var code = File.ReadAllText("testData\\GenericsType.cs");
            var tree = CSharpSyntaxTree.ParseText(code);
            var root = tree.GetRoot();

            var output = new StringBuilder();
            using (var writer = new StringWriter(output))
            {
                var gen = new ClassDiagramGenerator(writer, "    ", Accessibilities.Private | Accessibilities.Internal
                    | Accessibilities.Protected | Accessibilities.ProtectedInternal);
                gen.Generate(root);
            }

            var expected = ConvertNewLineCode(File.ReadAllText(@"uml\genericsType.puml"), Environment.NewLine);
            var actual = output.ToString();
            Console.Write(actual);
            Assert.AreEqual(expected, actual);
        }
        private static bool GeneratePlantUmlFromDir(Dictionary <string, string> parameters)
        {
            var inputRoot = parameters["in"];

            if (!Directory.Exists(inputRoot))
            {
                Console.WriteLine($"Directory \"{inputRoot}\" does not exist.");
                return(false);
            }
            var outputRoot = inputRoot;

            if (parameters.ContainsKey("out"))
            {
                outputRoot = parameters["out"];
                try
                {
                    Directory.CreateDirectory(outputRoot);
                }
                catch (Exception e)
                {
                    Console.WriteLine(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)))
                {
                    Console.WriteLine($"Skipped \"{inputFile}\"...");
                    continue;
                }
                Console.WriteLine($"Processing \"{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 ClassDiagramGenerator(writer, "    ", ignoreAcc);
                                gen.Generate(root);
                            }
                    }

                    includeRefs.AppendLine("!include " + outputFile.Replace(outputRoot, @".\"));
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    error = true;
                }
            }
            includeRefs.AppendLine("@enduml");
            File.WriteAllText(CombinePath(outputRoot, "include.puml"), includeRefs.ToString());
            if (error)
            {
                Console.WriteLine("There were files that could not be processed.");
                return(false);
            }
            return(true);
        }
        private static bool GeneratePlantUmlFromDir(Dictionary<string, string> parameters)
        {
            var inputRoot = parameters["in"];
            if (!Directory.Exists(inputRoot))
            {
                Console.WriteLine($"Directory \"{inputRoot}\" does not exist.");
                return false;
            }
            var outputRoot = inputRoot;
            if (parameters.ContainsKey("out"))
            {
                outputRoot = parameters["out"];
                try
                {
                    Directory.CreateDirectory(outputRoot);
                }
                catch (Exception e)
                {
                    Console.WriteLine(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)))
                {
                    Console.WriteLine($"Skipped \"{inputFile}\"...");
                    continue;
                }
                Console.WriteLine($"Processing \"{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 ClassDiagramGenerator(writer, "    ", ignoreAcc);
                            gen.Generate(root);
                        }
                    }

                    includeRefs.AppendLine("!include " + outputFile.Replace(outputRoot, @".\"));
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    error = true;
                }
            }
            includeRefs.AppendLine("@enduml");
            File.WriteAllText(CombinePath(outputRoot, "include.puml"), includeRefs.ToString());
            if (error)
            {
                Console.WriteLine("There were files that could not be processed.");
                return false;
            }
            return true;
        }
        private static bool GeneratePlantUmlFromFile(Dictionary<string, string> parameters)
        {
            var inputFileName = parameters["in"];
            if (!File.Exists(inputFileName))
            {
                Console.WriteLine($"\"{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)
                {
                    Console.WriteLine(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 ClassDiagramGenerator(writer, "    ", ignoreAcc);
                        gen.Generate(root);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(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}");
                }
            }
        }