/// <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; }