public override StatementSyntax Visit(ConversionContext context, TypeDeclarationStmt statement)
        {
            var typeDeclaration = (ClassOrInterfaceDeclaration)statement.getTypeDeclaration();
            var classSyntax     = ClassOrInterfaceDeclarationVisitor.VisitClassDeclaration(context, typeDeclaration);
            var text            = classSyntax.NormalizeWhitespace().GetText().ToString();

            return(SyntaxFactory.ParseStatement(text));
        }
        public static string ConvertText(string javaText, JavaConversionOptions options = null)
        {
            options ??= new JavaConversionOptions();

            options.ConversionStateChanged(ConversionState.Starting);

            var context = new ConversionContext(options);

            var textBytes = Encoding.UTF8.GetBytes(javaText ?? string.Empty);

            using var memoryStream = new MemoryStream(textBytes);
            using var wrapper      = new ikvm.io.InputStreamWrapper(memoryStream);

            options.ConversionStateChanged(ConversionState.ParsingJavaAst);

            var parsed = JavaParser.parse(wrapper);

            options.ConversionStateChanged(ConversionState.BuildingCSharpAst);

            var types   = parsed.getTypes().ToList <TypeDeclaration>();
            var imports = parsed.getImports().ToList <ImportDeclaration>();
            var package = parsed.getPackage();

            var usings = new List <UsingDirectiveSyntax>();

            //foreach (var import in imports)
            //{
            //    var usingSyntax = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(import.getName().toString()));
            //    usings.Add(usingSyntax);
            //}

            if (options.IncludeUsings)
            {
                foreach (string ns in options.Usings.Where(x => !string.IsNullOrWhiteSpace(x)))
                {
                    var usingSyntax = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(ns));
                    usings.Add(usingSyntax);
                }
            }

            var rootMembers = new List <MemberDeclarationSyntax>();
            NamespaceDeclarationSyntax namespaceSyntax = null;

            if (options.IncludeNamespace)
            {
                string packageName = package?.getName()?.toString() ?? "MyApp";

                foreach (var packageReplacement in options.PackageReplacements)
                {
                    packageName = packageReplacement.Replace(packageName);
                }

                packageName = TypeHelper.Capitalize(packageName);

                namespaceSyntax = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(packageName))
                                  .WithJavaComments(package);
            }

            foreach (var type in types)
            {
                if (type is ClassOrInterfaceDeclaration classOrIntType)
                {
                    if (classOrIntType.isInterface())
                    {
                        var interfaceSyntax = ClassOrInterfaceDeclarationVisitor.VisitInterfaceDeclaration(context, classOrIntType, false);

                        if (namespaceSyntax != null)
                        {
                            namespaceSyntax = namespaceSyntax.AddMembers(interfaceSyntax);
                        }
                        else
                        {
                            rootMembers.Add(interfaceSyntax);
                        }
                    }
                    else
                    {
                        var classSyntax = ClassOrInterfaceDeclarationVisitor.VisitClassDeclaration(context, classOrIntType, false);

                        if (namespaceSyntax != null)
                        {
                            namespaceSyntax = namespaceSyntax.AddMembers(classSyntax);
                        }
                        else
                        {
                            rootMembers.Add(classSyntax);
                        }
                    }
                }
            }

            if (namespaceSyntax != null)
            {
                rootMembers.Add(namespaceSyntax);
            }

            var root = SyntaxFactory.CompilationUnit(
                externs: new SyntaxList <ExternAliasDirectiveSyntax>(),
                usings: SyntaxFactory.List(usings.ToArray()),
                attributeLists: new SyntaxList <AttributeListSyntax>(),
                members: SyntaxFactory.List <MemberDeclarationSyntax>(rootMembers)
                )
                       .NormalizeWhitespace();

            root = root.WithJavaComments(parsed, "\r\n");

            var postConversionSanitizer = new SanitizingSyntaxRewriter();
            var sanitizedRoot           = postConversionSanitizer.VisitCompilationUnit(root);

            var tree = SyntaxFactory.SyntaxTree(sanitizedRoot);

            options.ConversionStateChanged(ConversionState.Done);

            return(tree.GetText().ToString());
        }