/// <summary>
        /// add documentation for the constructor.
        /// </summary>
        /// <param name="context">the code fix context.</param>
        /// <param name="root">the syntax root.</param>
        /// <param name="constructorDeclaration">the constructor declaration syntax.</param>
        /// <param name="documentComment">the document content.</param>
        /// <returns>the resulting document.</returns>
        private Task<Document> AddDocumentationAsync(CodeFixContext context, SyntaxNode root, ConstructorDeclarationSyntax constructorDeclaration, DocumentationCommentTriviaSyntax documentComment)
        {
            var lines = documentComment.GetExistingSummaryCommentDocumentation() ?? new string[] { };
            var standardCommentText = this._commentNodeFactory.PrependStandardCommentText(constructorDeclaration, lines);

            var parameters = this._commentNodeFactory.CreateParameters(constructorDeclaration, documentComment);

            var summaryPlusParameters = new XmlNodeSyntax[] { standardCommentText }
                .Concat(parameters)
                .ToArray();

            var comment = this._commentNodeFactory
                .CreateDocumentComment(summaryPlusParameters)
                .AddLeadingEndOfLineTriviaFrom(constructorDeclaration.GetLeadingTrivia());

            var trivia = SyntaxFactory.Trivia(comment);
            var result = documentComment != null
                ? root.ReplaceNode(documentComment, comment.AdjustDocumentationCommentNewLineTrivia())
                : root.ReplaceNode(constructorDeclaration, constructorDeclaration.WithLeadingTrivia(trivia));

            var newDocument = context.Document.WithSyntaxRoot(result);
            return Task.FromResult(newDocument);
        }
        private Constructor TransverseConstructors(ConstructorDeclarationSyntax cds)
        {
            Constructor retConstructor = new Constructor();
            //public int DecisionsCount { get; }
            //public int ExitPoints { get; set; }
            //public bool IsFriend { get; }
            //public bool IsPolymophic { get; }
            //public bool IsPublic { get; }
            //public bool IsStatic { get; }
            //public List<Preprocessor> Preprocessors { get; set; }
            retConstructor.Name = cds.Identifier.ValueText;

            if (cds.HasLeadingTrivia)
            {
                SetOuterComments(retConstructor, cds.GetLeadingTrivia().ToFullString());
            }

            if (cds.HasTrailingTrivia)
            {
                SetInnerComments(retConstructor, cds.GetTrailingTrivia().ToFullString());
            }

            foreach (SyntaxToken st in cds.Modifiers)
            {
                string modifier = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(st.ValueText);
                Encapsulation encap;
                Qualifiers qual;
                if (System.Enum.TryParse<Encapsulation>(modifier, out encap))
                {
                    retConstructor.Encapsulation.Add(encap);
                }
                else if (System.Enum.TryParse<Qualifiers>(modifier, out qual))
                {
                    retConstructor.Qualifiers.Add(qual);
                }
            }

            //TypeSyntax ts = cds.ReturnType;
            //Model.Type retType = new Model.Type();
            //retType.Name = ts.ToString();
            //retType.IsKnownType = ts.Kind.IsKeywordKind();
            //retType.IsNotUserDefined = ts.Kind.IsKeywordKind();
            //TODO
            //rettype.generictype
            //retConstructor.ReturnType = retType;

            ParameterListSyntax pls = cds.ParameterList;
            foreach (ParameterSyntax ps in pls.Parameters)
            {
                retConstructor.Parameters.Add(TraverseParamaters(ps));
            }
            BlockSyntax bs = cds.Body;
            var labelStatements = from aLabelStatement in bs.ChildNodes().OfType<LabeledStatementSyntax>() select aLabelStatement;
            foreach (LabeledStatementSyntax lss in labelStatements)
            {
                retConstructor.LabelStatements.Add(TraverseLabelStatements(lss));
            }

            var goToStatements = from aGoToStatement in bs.ChildNodes().OfType<GotoStatementSyntax>() select aGoToStatement;
            foreach (GotoStatementSyntax gtss in goToStatements)
            {
                GoTo gt = TraverseGoToStatements(gtss);
                retConstructor.GoToStatements.Add(gt);
            }

            //Preprocessors = new List<Preprocessor>();
            //Base = new List<InvokedMethod>();
            //Decisions = new Decisions();

            var accessVarsDecl = from aAccessVarsDecl in bs.ChildNodes().OfType<LocalDeclarationStatementSyntax>() select aAccessVarsDecl;
            foreach (LocalDeclarationStatementSyntax ldss in accessVarsDecl)
            {
                Method tempMethod = TransverseAccessVars(ldss);
                retConstructor.AccessedVariables.AddRange(tempMethod.AccessedVariables);
                retConstructor.InvokedMethods.AddRange(tempMethod.InvokedMethods);
            }

            var ifStatements = from aIfStatement in bs.ChildNodes().OfType<IfStatementSyntax>() select aIfStatement;
            foreach (IfStatementSyntax iss in ifStatements)
            {
                int exitPoints = retConstructor.ExitPoints;
                Decisions tempDecision = TraverseIfStatements(iss, ref exitPoints);
                retConstructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retConstructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retConstructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retConstructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retConstructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retConstructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retConstructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retConstructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retConstructor.ExitPoints = exitPoints;
            }
            var elseStatements = from aElseStatements in bs.ChildNodes().OfType<ElseClauseSyntax>() select aElseStatements;
            foreach (ElseClauseSyntax ecs in elseStatements)
            {
                int exitPoints = retConstructor.ExitPoints;
                Decisions tempDecision = TraverseElseClauses(ecs, ref exitPoints);
                retConstructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retConstructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retConstructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retConstructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retConstructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retConstructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retConstructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retConstructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retConstructor.ExitPoints = exitPoints;
            }
            var whileLoops = from aWhileLoop in bs.ChildNodes().OfType<WhileStatementSyntax>() select aWhileLoop;
            foreach (WhileStatementSyntax wss in whileLoops)
            {
                int exitPoints = retConstructor.ExitPoints;
                Decisions tempDecision = TraverseWhileLoops(wss, ref exitPoints);
                retConstructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retConstructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retConstructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retConstructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retConstructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retConstructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retConstructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retConstructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retConstructor.ExitPoints = exitPoints;
            }
            var doWhileLoops = from aDoWhileLoop in bs.ChildNodes().OfType<DoStatementSyntax>() select aDoWhileLoop;
            foreach (DoStatementSyntax dss in doWhileLoops)
            {
                int exitPoints = retConstructor.ExitPoints;
                Decisions tempDecision = TraverseDoStatements(dss, ref exitPoints);
                retConstructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retConstructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retConstructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retConstructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retConstructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retConstructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retConstructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retConstructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retConstructor.ExitPoints = exitPoints;
            }
            var forLoops = from aForLoop in bs.ChildNodes().OfType<ForStatementSyntax>() select aForLoop;
            foreach (ForStatementSyntax fss in forLoops)
            {
                int exitPoints = retConstructor.ExitPoints;
                Decisions tempDecision = TraverseForStatements(fss, ref exitPoints);
                retConstructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retConstructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retConstructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retConstructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retConstructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retConstructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retConstructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retConstructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retConstructor.ExitPoints = exitPoints;
            }
            var foreachLoops = from aForeachLoop in bs.ChildNodes().OfType<ForEachStatementSyntax>() select aForeachLoop;
            foreach(ForEachStatementSyntax fess in foreachLoops)
            {
                int exitPoints = retConstructor.ExitPoints;
                Decisions tempDecision = TraverseForEachStatements(fess, ref exitPoints);
                retConstructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retConstructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retConstructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retConstructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retConstructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retConstructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retConstructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retConstructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retConstructor.ExitPoints = exitPoints;
            }
            var switches = from aSwitch in bs.ChildNodes().OfType<SwitchStatementSyntax>() select aSwitch;
            foreach (SwitchStatementSyntax sss in switches)
            {
                int exitPoints = retConstructor.ExitPoints;
                Decisions tempDecision = TraverseSwitchStatements(sss, ref exitPoints);
                retConstructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retConstructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retConstructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retConstructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retConstructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retConstructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retConstructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retConstructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retConstructor.ExitPoints = exitPoints;
            }
            var catches = from aCatch in bs.ChildNodes().OfType<CatchClauseSyntax>() select aCatch;
            foreach (CatchClauseSyntax ccs in catches)
            {
                int exitPoints = retConstructor.ExitPoints;
                Decisions tempDecision = TraverseCatchClauses(ccs, ref exitPoints);
                retConstructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retConstructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retConstructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retConstructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retConstructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retConstructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retConstructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retConstructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retConstructor.ExitPoints = exitPoints;
            }
            var breaks = from aBreak in bs.ChildNodes().OfType<BreakStatementSyntax>() select aBreak;
            foreach(BreakStatementSyntax bss in breaks)
            {
                //TODO get breaks
                //note that breaks are NOT in retMethod.Decisions
            }
            var checks = from aCheck in bs.ChildNodes().OfType<CheckedStatementSyntax>() select aCheck;
            foreach(CheckedStatementSyntax css in checks)
            {
                //TODO get checks
                //note that checks are NOT in retMethod.Decisions
            }
            var continues = from aContinue in bs.ChildNodes().OfType<ContinueStatementSyntax>() select aContinue;
            foreach(ContinueStatementSyntax css in continues)
            {
                //TODO get continues
                //note that continues are NOT in retMethod.Decisions
            }
            var emptys = from aEmpty in bs.ChildNodes().OfType<EmptyStatementSyntax>() select aEmpty;
            foreach(EmptyStatementSyntax ess in emptys)
            {
                //TODO get emptys
                //note that emptys are NOT in retMethod.Decisions
            }
            var exprs = from aExpr in bs.ChildNodes().OfType<ExpressionStatementSyntax>() select aExpr;
            foreach(ExpressionStatementSyntax ess in exprs)
            {
                //TODO get expressions
                //note that expressions are NOT in retMethod.Decisions
            }
            var fixeds = from aFixed in bs.ChildNodes().OfType<FixedStatementSyntax>() select aFixed;
            foreach(FixedStatementSyntax fss in fixeds)
            {
                //TODO get fixed
                //note that these are NOT in retMethod.Decisions
            }
            var locks = from aLock in bs.ChildNodes().OfType<LockStatementSyntax>() select aLock;
            foreach(LockStatementSyntax lss in locks)
            {
                //TODO get lock
                //note that these are NOT in retMethod.Decisions
            }
            var returns = from aReturn in bs.ChildNodes().OfType<ReturnStatementSyntax>() select aReturn;
            foreach(ReturnStatementSyntax rss in returns)
            {
                //TODO get returns
                //note that these are NOT in retMethod.Decisions
            }
            var throws = from aThrow in bs.ChildNodes().OfType<ThrowStatementSyntax>() select aThrow;
            foreach(ThrowStatementSyntax tss in throws)
            {
                //TODO get throws
                //note that these are NOT in retMethod.Decisions
            }
            var trys = from aTry in bs.ChildNodes().OfType<TryStatementSyntax>() select aTry;
            foreach(TryStatementSyntax tss in trys)
            {
                //TODO get trys
                //note that these are NOT in retMethod.Decisions
            }
            var unsafes = from aUnsafe in bs.ChildNodes().OfType<UnsafeStatementSyntax>() select aUnsafe;
            foreach(UnsafeStatementSyntax uss in unsafes)
            {
                //TODO get unsafes
                //note that these are NOT in retMethod.Decisions
            }
            var usings = from aUsing in bs.ChildNodes().OfType<UsingStatementSyntax>() select aUsing;
            foreach(UsingStatementSyntax uss in usings)
            {
                //TODO get usings
                //note that these are NOT in retMethod.Decisions
            }
            var yields = from aYield in bs.ChildNodes().OfType<YieldStatementSyntax>() select aYield;
            foreach(YieldStatementSyntax yss in yields)
            {
                //TODO get yields
                //note that these are NOT in retMethod.Decisions
            }
            var invokedMethods = from aInvokedMethod in bs.ChildNodes().OfType<InvocationExpressionSyntax>() select aInvokedMethod;
            foreach(InvocationExpressionSyntax ies in invokedMethods)
            {
                Method tempMethod = TraverseInvocationExpression(ies);
                retConstructor.InvokedMethods.AddRange(tempMethod.InvokedMethods);
                retConstructor.AccessedVariables.AddRange(tempMethod.AccessedVariables);
            }

            //InvokedMethods = new List<InvokedMethod>();
            return retConstructor;
        }