public DirectiveSpan AddChild(int start) { var newChild = new DirectiveSpan(start); this.children.Add(newChild); return(newChild); }
public UsingsHelper(Document document, CompilationUnitSyntax compilationUnit) { this.conditionalDirectiveTree = DirectiveSpan.BuildConditionalDirectiveTree(compilationUnit); this.separateSystemDirectives = !document.Project.CompilationOptions.IsAnalyzerSuppressed(SA1208SystemUsingDirectivesMustBePlacedBeforeOtherUsingDirectives.DiagnosticId); this.ProcessUsingDirectives(compilationUnit.Usings); this.ProcessMembers(compilationUnit.Members); }
public UsingsHelper(StyleCopSettings settings, SemanticModel semanticModel, Document document, CompilationUnitSyntax compilationUnit) { this.settings = settings; this.semanticModel = semanticModel; this.conditionalDirectiveTree = DirectiveSpan.BuildConditionalDirectiveTree(compilationUnit); this.separateSystemDirectives = settings.OrderingRules.SystemUsingDirectivesFirst; this.ProcessUsingDirectives(compilationUnit.Usings); this.ProcessMembers(compilationUnit.Members); }
public UsingsHelper(StyleCopSettings settings, SemanticModel semanticModel, CompilationUnitSyntax compilationUnit, ImmutableArray <SyntaxTrivia> fileHeader) { this.settings = settings; this.semanticModel = semanticModel; this.fileHeader = fileHeader; this.conditionalDirectiveTree = DirectiveSpan.BuildConditionalDirectiveTree(compilationUnit); this.separateSystemDirectives = settings.OrderingRules.SystemUsingDirectivesFirst; this.ProcessUsingDirectives(compilationUnit.Usings); this.ProcessMembers(compilationUnit.Members); }
public static DirectiveSpan BuildConditionalDirectiveTree(CompilationUnitSyntax compilationUnit) { var root = new DirectiveSpan(0) { End = compilationUnit.Span.End }; var directiveStack = new Stack <DirectiveSpan>(); directiveStack.Push(root); for (var directiveTrivia = compilationUnit.GetFirstDirective(); directiveTrivia != null; directiveTrivia = directiveTrivia.GetNextDirective()) { DirectiveSpan previousDirectiveSpan; DirectiveSpan newDirectiveSpan; switch (directiveTrivia.Kind()) { case SyntaxKind.IfDirectiveTrivia: newDirectiveSpan = directiveStack.Peek().AddChild(directiveTrivia.SpanStart); directiveStack.Push(newDirectiveSpan); break; case SyntaxKind.ElifDirectiveTrivia: case SyntaxKind.ElseDirectiveTrivia: previousDirectiveSpan = directiveStack.Pop(); previousDirectiveSpan.End = directiveTrivia.SpanStart; newDirectiveSpan = directiveStack.Peek().AddChild(directiveTrivia.SpanStart); directiveStack.Push(newDirectiveSpan); break; case SyntaxKind.EndIfDirectiveTrivia: previousDirectiveSpan = directiveStack.Pop(); previousDirectiveSpan.End = directiveTrivia.SpanStart; break; default: // ignore all other directive trivia break; } } // cleanup the stack if for some reason the tree of directives has not reached closure. while (directiveStack.Count > 1) { var directiveSpan = directiveStack.Pop(); directiveSpan.End = compilationUnit.Span.End; } return(root); }
public List <UsingDirectiveSyntax> GetContainedUsings(DirectiveSpan directiveSpan) { List <UsingDirectiveSyntax> result = new List <UsingDirectiveSyntax>(); List <UsingDirectiveSyntax> usingsList; if (this.NamespaceUsings.TryGetValue(directiveSpan, out usingsList)) { result.AddRange(usingsList); } if (this.Aliases.TryGetValue(directiveSpan, out usingsList)) { result.AddRange(usingsList); } if (this.StaticImports.TryGetValue(directiveSpan, out usingsList)) { result.AddRange(usingsList); } return(result); }
public SyntaxList <UsingDirectiveSyntax> GenerateGroupedUsings(DirectiveSpan directiveSpan, string indentation, bool withTrailingBlankLine, bool qualifyNames) { var usingList = new List <UsingDirectiveSyntax>(); List <SyntaxTrivia> triviaToMove = new List <SyntaxTrivia>(); usingList.AddRange(this.GenerateUsings(this.NamespaceUsings, directiveSpan, indentation, triviaToMove, qualifyNames)); usingList.AddRange(this.GenerateUsings(this.StaticImports, directiveSpan, indentation, triviaToMove, qualifyNames)); usingList.AddRange(this.GenerateUsings(this.Aliases, directiveSpan, indentation, triviaToMove, qualifyNames)); if (triviaToMove.Count > 0) { var newLeadingTrivia = SyntaxFactory.TriviaList(triviaToMove).AddRange(usingList[0].GetLeadingTrivia()); usingList[0] = usingList[0].WithLeadingTrivia(newLeadingTrivia); } if (withTrailingBlankLine && (usingList.Count > 0)) { var lastUsing = usingList[usingList.Count - 1]; usingList[usingList.Count - 1] = lastUsing.WithTrailingTrivia(lastUsing.GetTrailingTrivia().Add(SyntaxFactory.CarriageReturnLineFeed)); } return(SyntaxFactory.List(usingList)); }
public List<UsingDirectiveSyntax> GetContainedUsings(DirectiveSpan directiveSpan) { List<UsingDirectiveSyntax> result = new List<UsingDirectiveSyntax>(); List<UsingDirectiveSyntax> usingsList; if (this.NamespaceUsings.TryGetValue(directiveSpan, out usingsList)) { result.AddRange(usingsList); } if (this.Aliases.TryGetValue(directiveSpan, out usingsList)) { result.AddRange(usingsList); } if (this.StaticImports.TryGetValue(directiveSpan, out usingsList)) { result.AddRange(usingsList); } return result; }
public UsingsHelper(CompilationUnitSyntax compilationUnit) { this.conditionalDirectiveTree = DirectiveSpan.BuildConditionalDirectiveTree(compilationUnit); this.ProcessUsingDirectives(compilationUnit.Usings); this.ProcessMembers(compilationUnit.Members); }
private static void BuildReplaceMapForConditionalDirectives(UsingsHelper usingsHelper, Dictionary<UsingDirectiveSyntax, UsingDirectiveSyntax> replaceMap, IndentationSettings indentationSettings, DirectiveSpan rootSpan) { foreach (var childSpan in rootSpan.Children) { var originalUsings = usingsHelper.GetContainedUsings(childSpan); if (originalUsings.Count > 0) { // sort the original using declarations on Span.Start, in order to have the correct replace mapping. originalUsings.Sort(CompareSpanStart); var indentationSteps = IndentationHelper.GetIndentationSteps(indentationSettings, originalUsings[0].Parent); if (originalUsings[0].Parent is NamespaceDeclarationSyntax) { indentationSteps++; } var indentation = IndentationHelper.GenerateIndentationString(indentationSettings, indentationSteps); var modifiedUsings = usingsHelper.GenerateGroupedUsings(childSpan, indentation, false, qualifyNames: false); for (var i = 0; i < originalUsings.Count; i++) { replaceMap.Add(originalUsings[i], modifiedUsings[i]); } } BuildReplaceMapForConditionalDirectives(usingsHelper, replaceMap, indentationSettings, childSpan); } }
private void AddUsingDirective(Dictionary<DirectiveSpan, List<UsingDirectiveSyntax>> container, UsingDirectiveSyntax usingDirective, DirectiveSpan owningSpan) { List<UsingDirectiveSyntax> usingList; if (!container.TryGetValue(owningSpan, out usingList)) { usingList = new List<UsingDirectiveSyntax>(); container.Add(owningSpan, usingList); } usingList.Add(usingDirective); }
private static void BuildReplaceMapForConditionalDirectives(UsingsHelper usingsHelper, Dictionary <UsingDirectiveSyntax, UsingDirectiveSyntax> replaceMap, IndentationOptions indentationOptions, DirectiveSpan rootSpan) { foreach (var childSpan in rootSpan.Children) { var originalUsings = usingsHelper.GetContainedUsings(childSpan); if (originalUsings.Count > 0) { // sort the original using declarations on Span.Start, in order to have the correct replace mapping. originalUsings.Sort(CompareSpanStart); var indentationSteps = IndentationHelper.GetIndentationSteps(indentationOptions, originalUsings[0].Parent); if (originalUsings[0].Parent is NamespaceDeclarationSyntax) { indentationSteps++; } var indentation = IndentationHelper.GenerateIndentationString(indentationOptions, indentationSteps); var modifiedUsings = usingsHelper.GenerateGroupedUsings(childSpan, indentation, false, qualifyNames: false); for (var i = 0; i < originalUsings.Count; i++) { replaceMap.Add(originalUsings[i], modifiedUsings[i]); } } BuildReplaceMapForConditionalDirectives(usingsHelper, replaceMap, indentationOptions, childSpan); } }
private List<UsingDirectiveSyntax> GenerateUsings(Dictionary<DirectiveSpan, List<UsingDirectiveSyntax>> usingsGroup, DirectiveSpan directiveSpan, string indentation, List<SyntaxTrivia> triviaToMove, bool qualifyNames) { List<UsingDirectiveSyntax> result = new List<UsingDirectiveSyntax>(); List<UsingDirectiveSyntax> usingsList; if (!usingsGroup.TryGetValue(directiveSpan, out usingsList)) { return result; } return this.GenerateUsings(usingsList, indentation, triviaToMove, qualifyNames); }
public static DirectiveSpan BuildConditionalDirectiveTree(CompilationUnitSyntax compilationUnit) { var root = new DirectiveSpan(0) { End = compilationUnit.Span.End }; var directiveStack = new Stack<DirectiveSpan>(); directiveStack.Push(root); for (var directiveTrivia = compilationUnit.GetFirstDirective(); directiveTrivia != null; directiveTrivia = directiveTrivia.GetNextDirective()) { DirectiveSpan previousDirectiveSpan; DirectiveSpan newDirectiveSpan; switch (directiveTrivia.Kind()) { case SyntaxKind.IfDirectiveTrivia: newDirectiveSpan = directiveStack.Peek().AddChild(directiveTrivia.SpanStart); directiveStack.Push(newDirectiveSpan); break; case SyntaxKind.ElifDirectiveTrivia: case SyntaxKind.ElseDirectiveTrivia: previousDirectiveSpan = directiveStack.Pop(); previousDirectiveSpan.End = directiveTrivia.SpanStart; newDirectiveSpan = directiveStack.Peek().AddChild(directiveTrivia.SpanStart); directiveStack.Push(newDirectiveSpan); break; case SyntaxKind.EndIfDirectiveTrivia: previousDirectiveSpan = directiveStack.Pop(); previousDirectiveSpan.End = directiveTrivia.SpanStart; break; default: // ignore all other directive trivia break; } } // cleanup the stack if for some reason the tree of directives has not reached closure. while (directiveStack.Count > 1) { var directiveSpan = directiveStack.Pop(); directiveSpan.End = compilationUnit.Span.End; } return root; }
private List <UsingDirectiveSyntax> GenerateUsings(Dictionary <DirectiveSpan, List <UsingDirectiveSyntax> > usingsGroup, DirectiveSpan directiveSpan, string indentation, List <SyntaxTrivia> triviaToMove, bool qualifyNames) { List <UsingDirectiveSyntax> result = new List <UsingDirectiveSyntax>(); List <UsingDirectiveSyntax> usingsList; if (!usingsGroup.TryGetValue(directiveSpan, out usingsList)) { return(result); } return(this.GenerateUsings(usingsList, indentation, triviaToMove, qualifyNames)); }
public UsingsHelper(StyleCopSettings settings, SemanticModel semanticModel, CompilationUnitSyntax compilationUnit, ImmutableArray<SyntaxTrivia> fileHeader) { this.settings = settings; this.semanticModel = semanticModel; this.fileHeader = fileHeader; this.conditionalDirectiveTree = DirectiveSpan.BuildConditionalDirectiveTree(compilationUnit); this.separateSystemDirectives = settings.OrderingRules.SystemUsingDirectivesFirst; this.ProcessUsingDirectives(compilationUnit.Usings); this.ProcessMembers(compilationUnit.Members); }
public DirectiveSpan AddChild(int start) { var newChild = new DirectiveSpan(start); this.children.Add(newChild); return newChild; }
private void AddUsingDirective(Dictionary <DirectiveSpan, List <UsingDirectiveSyntax> > container, UsingDirectiveSyntax usingDirective, DirectiveSpan owningSpan) { List <UsingDirectiveSyntax> usingList; if (!container.TryGetValue(owningSpan, out usingList)) { usingList = new List <UsingDirectiveSyntax>(); container.Add(owningSpan, usingList); } usingList.Add(usingDirective); }
public SyntaxList<UsingDirectiveSyntax> GenerateGroupedUsings(DirectiveSpan directiveSpan, string indentation, bool withTrailingBlankLine, bool qualifyNames) { var usingList = new List<UsingDirectiveSyntax>(); List<SyntaxTrivia> triviaToMove = new List<SyntaxTrivia>(); usingList.AddRange(this.GenerateUsings(this.NamespaceUsings, directiveSpan, indentation, triviaToMove, qualifyNames)); usingList.AddRange(this.GenerateUsings(this.StaticImports, directiveSpan, indentation, triviaToMove, qualifyNames)); usingList.AddRange(this.GenerateUsings(this.Aliases, directiveSpan, indentation, triviaToMove, qualifyNames)); if (triviaToMove.Count > 0) { var newLeadingTrivia = SyntaxFactory.TriviaList(triviaToMove).AddRange(usingList[0].GetLeadingTrivia()); usingList[0] = usingList[0].WithLeadingTrivia(newLeadingTrivia); } if (withTrailingBlankLine && (usingList.Count > 0)) { var lastUsing = usingList[usingList.Count - 1]; usingList[usingList.Count - 1] = lastUsing.WithTrailingTrivia(lastUsing.GetTrailingTrivia().Add(SyntaxFactory.CarriageReturnLineFeed)); } return SyntaxFactory.List(usingList); }