private static SyntaxToken GetNewEndToken(SyntaxToken endToken, Diagnostic diagnostic, AbstractSuppressionCodeFixProvider fixer) { ImmutableArray <SyntaxTrivia> trivia; var isEOF = fixer.IsEndOfFileToken(endToken); if (isEOF) { trivia = endToken.LeadingTrivia.ToImmutableArray(); } else { trivia = endToken.TrailingTrivia.ToImmutableArray(); } SyntaxTrivia lastNonEOLTrivia = trivia.LastOrDefault(t => !fixer.IsEndOfLine(t)); // Insert the #pragma restore directive after the last trailing trivia that is not a new line trivia. int index; if (lastNonEOLTrivia == default(SyntaxTrivia)) { index = 0; } else { index = trivia.IndexOf(lastNonEOLTrivia) + 1; } bool needsTrailingEOL; if (index < trivia.Length) { needsTrailingEOL = !fixer.IsEndOfLine(trivia[index]); } else if (isEOF) { needsTrailingEOL = false; } else { needsTrailingEOL = true; } var pragmaRestoreTrivia = fixer.CreatePragmaRestoreDirectiveTrivia(diagnostic, needsTrailingEOL); if (isEOF) { return(endToken.WithLeadingTrivia(trivia.InsertRange(index, pragmaRestoreTrivia))); } else { return(endToken.WithTrailingTrivia(trivia.InsertRange(index, pragmaRestoreTrivia))); } }
private static bool IsEndOfLineOrContainsEndOfLine( SyntaxTrivia trivia, AbstractSuppressionCodeFixProvider fixer ) { return(fixer.IsEndOfLine(trivia) || ( trivia.HasStructure && trivia.GetStructure().DescendantTrivia().Any(t => fixer.IsEndOfLine(t)) )); }
private static bool IsEndOfLineOrHasTrailingEndOfLine( SyntaxTrivia trivia, AbstractSuppressionCodeFixProvider fixer ) { return(fixer.IsEndOfLine(trivia) || ( trivia.HasStructure && fixer.IsEndOfLine( trivia.GetStructure().DescendantTrivia().LastOrDefault() ) )); }
internal static SyntaxToken GetNewStartTokenWithAddedPragma(SyntaxToken startToken, TextSpan currentDiagnosticSpan, Diagnostic diagnostic, AbstractSuppressionCodeFixProvider fixer, Func <SyntaxNode, SyntaxNode> formatNode, bool isRemoveSuppression = false) { var trivia = startToken.LeadingTrivia.ToImmutableArray(); SyntaxTrivia insertAfterTrivia; var index = GetPositionForPragmaInsertion(trivia, currentDiagnosticSpan, fixer, isStartToken: true, triviaAtIndex: out insertAfterTrivia); index++; bool needsLeadingEOL; if (index > 0) { needsLeadingEOL = !fixer.IsEndOfLine(insertAfterTrivia); } else if (startToken.FullSpan.Start == 0) { needsLeadingEOL = false; } else { needsLeadingEOL = true; } var pragmaTrivia = !isRemoveSuppression? fixer.CreatePragmaDisableDirectiveTrivia(diagnostic, formatNode, needsLeadingEOL, needsTrailingEndOfLine : true) : fixer.CreatePragmaRestoreDirectiveTrivia(diagnostic, formatNode, needsLeadingEOL, needsTrailingEndOfLine: true); return(startToken.WithLeadingTrivia(trivia.InsertRange(index, pragmaTrivia))); }
private static SyntaxToken GetNewStartToken(SyntaxToken startToken, Diagnostic diagnostic, AbstractSuppressionCodeFixProvider fixer) { var trivia = startToken.LeadingTrivia.ToImmutableArray(); // Insert the #pragma disable directive after all leading new line trivia but before first trivia of any other kind. int index; SyntaxTrivia firstNonEOLTrivia = trivia.FirstOrDefault(t => !fixer.IsEndOfLine(t)); if (firstNonEOLTrivia == default(SyntaxTrivia)) { index = trivia.Length; } else { index = trivia.IndexOf(firstNonEOLTrivia); } bool needsLeadingEOL; if (index > 0) { needsLeadingEOL = !fixer.IsEndOfLine(trivia[index - 1]); } else if (startToken.FullSpan.Start == 0) { needsLeadingEOL = false; } else { needsLeadingEOL = true; } var pragmaWarningTrivia = fixer.CreatePragmaDisableDirectiveTrivia(diagnostic, needsLeadingEOL); return startToken.WithLeadingTrivia(trivia.InsertRange(index, pragmaWarningTrivia)); }
private static int GetPositionForPragmaInsertion(ImmutableArray<SyntaxTrivia> triviaList, TextSpan currentDiagnosticSpan, AbstractSuppressionCodeFixProvider fixer, bool isStartToken, out SyntaxTrivia triviaAtIndex) { // Start token: Insert the #pragma disable directive just **before** the first end of line trivia prior to diagnostic location. // End token: Insert the #pragma disable directive just **after** the first end of line trivia after diagnostic location. Func<int, int> getNextIndex = cur => isStartToken ? cur - 1 : cur + 1; Func<SyntaxTrivia, bool> shouldConsiderTrivia = trivia => isStartToken ? trivia.FullSpan.End <= currentDiagnosticSpan.Start : trivia.FullSpan.Start >= currentDiagnosticSpan.End; var walkedPastDiagnosticSpan = false; var seenEndOfLineTrivia = false; var index = isStartToken ? triviaList.Length - 1 : 0; while (index >= 0 && index < triviaList.Length) { var trivia = triviaList[index]; walkedPastDiagnosticSpan = walkedPastDiagnosticSpan || shouldConsiderTrivia(trivia); seenEndOfLineTrivia = seenEndOfLineTrivia || (fixer.IsEndOfLine(trivia) || (trivia.HasStructure && trivia.GetStructure().DescendantTrivia().Any(t => fixer.IsEndOfLine(t)))); if (walkedPastDiagnosticSpan && seenEndOfLineTrivia) { break; } index = getNextIndex(index); } triviaAtIndex = index >= 0 && index < triviaList.Length ? triviaList[index] : default(SyntaxTrivia); return index; }
private static SyntaxToken GetNewStartToken(SyntaxToken startToken, Diagnostic diagnostic, AbstractSuppressionCodeFixProvider fixer) { var trivia = startToken.LeadingTrivia.ToImmutableArray(); // Insert the #pragma disable directive after all leading new line trivia but before first trivia of any other kind. int index; SyntaxTrivia firstNonEOLTrivia = trivia.FirstOrDefault(t => !fixer.IsEndOfLine(t)); if (firstNonEOLTrivia == default(SyntaxTrivia)) { index = trivia.Length; } else { index = trivia.IndexOf(firstNonEOLTrivia); } bool needsLeadingEOL; if (index > 0) { needsLeadingEOL = !fixer.IsEndOfLine(trivia[index - 1]); } else if (startToken.FullSpan.Start == 0) { needsLeadingEOL = false; } else { needsLeadingEOL = true; } var pragmaWarningTrivia = fixer.CreatePragmaDisableDirectiveTrivia(diagnostic, needsLeadingEOL); return(startToken.WithLeadingTrivia(trivia.InsertRange(index, pragmaWarningTrivia))); }
internal static SyntaxToken GetNewEndTokenWithAddedPragma(SyntaxToken endToken, TextSpan currentDiagnosticSpan, Diagnostic diagnostic, AbstractSuppressionCodeFixProvider fixer, Func <SyntaxNode, SyntaxNode> formatNode, bool isRemoveSuppression = false) { ImmutableArray <SyntaxTrivia> trivia; var isEOF = fixer.IsEndOfFileToken(endToken); if (isEOF) { trivia = endToken.LeadingTrivia.ToImmutableArray(); } else { trivia = endToken.TrailingTrivia.ToImmutableArray(); } SyntaxTrivia insertBeforeTrivia; var index = GetPositionForPragmaInsertion(trivia, currentDiagnosticSpan, fixer, isStartToken: false, triviaAtIndex: out insertBeforeTrivia); bool needsTrailingEOL; if (index < trivia.Length) { needsTrailingEOL = !fixer.IsEndOfLine(insertBeforeTrivia); } else if (isEOF) { needsTrailingEOL = false; } else { needsTrailingEOL = true; } var pragmaTrivia = !isRemoveSuppression? fixer.CreatePragmaRestoreDirectiveTrivia(diagnostic, formatNode, needsLeadingEndOfLine : true, needsTrailingEndOfLine : needsTrailingEOL) : fixer.CreatePragmaDisableDirectiveTrivia(diagnostic, formatNode, needsLeadingEndOfLine: true, needsTrailingEndOfLine: needsTrailingEOL); if (isEOF) { return(endToken.WithLeadingTrivia(trivia.InsertRange(index, pragmaTrivia))); } else { return(endToken.WithTrailingTrivia(trivia.InsertRange(index, pragmaTrivia))); }; }
private static int GetPositionForPragmaInsertion(ImmutableArray <SyntaxTrivia> triviaList, TextSpan currentDiagnosticSpan, AbstractSuppressionCodeFixProvider fixer, bool isStartToken, out SyntaxTrivia triviaAtIndex) { // Start token: Insert the #pragma disable directive just **before** the first end of line trivia prior to diagnostic location. // End token: Insert the #pragma disable directive just **after** the first end of line trivia after diagnostic location. Func <int, int> getNextIndex = cur => isStartToken ? cur - 1 : cur + 1; Func <SyntaxTrivia, bool> shouldConsiderTrivia = trivia => isStartToken ? trivia.FullSpan.End <= currentDiagnosticSpan.Start : trivia.FullSpan.Start >= currentDiagnosticSpan.End; var walkedPastDiagnosticSpan = false; var seenEndOfLineTrivia = false; var index = isStartToken ? triviaList.Length - 1 : 0; while (index >= 0 && index < triviaList.Length) { var trivia = triviaList[index]; walkedPastDiagnosticSpan = walkedPastDiagnosticSpan || shouldConsiderTrivia(trivia); seenEndOfLineTrivia = seenEndOfLineTrivia || (fixer.IsEndOfLine(trivia) || (trivia.HasStructure && trivia.GetStructure().DescendantTrivia().Any(t => fixer.IsEndOfLine(t)))); if (walkedPastDiagnosticSpan && seenEndOfLineTrivia) { break; } index = getNextIndex(index); } triviaAtIndex = index >= 0 && index < triviaList.Length ? triviaList[index] : default(SyntaxTrivia); return(index); }
private static bool IsEndOfLineOrContainsEndOfLine(SyntaxTrivia trivia, AbstractSuppressionCodeFixProvider fixer) { return fixer.IsEndOfLine(trivia) || (trivia.HasStructure && trivia.GetStructure().DescendantTrivia().Any(t => fixer.IsEndOfLine(t))); }
private static bool IsEndOfLineOrHasTrailingEndOfLine(SyntaxTrivia trivia, AbstractSuppressionCodeFixProvider fixer) { return fixer.IsEndOfLine(trivia) || (trivia.HasStructure && fixer.IsEndOfLine(trivia.GetStructure().DescendantTrivia().LastOrDefault())); }
private static SyntaxToken GetNewEndToken(SyntaxToken endToken, Diagnostic diagnostic, AbstractSuppressionCodeFixProvider fixer) { ImmutableArray<SyntaxTrivia> trivia; var isEOF = fixer.IsEndOfFileToken(endToken); if (isEOF) { trivia = endToken.LeadingTrivia.ToImmutableArray(); } else { trivia = endToken.TrailingTrivia.ToImmutableArray(); } SyntaxTrivia lastNonEOLTrivia = trivia.LastOrDefault(t => !fixer.IsEndOfLine(t)); // Insert the #pragma restore directive after the last trailing trivia that is not a new line trivia. int index; if (lastNonEOLTrivia == default(SyntaxTrivia)) { index = 0; } else { index = trivia.IndexOf(lastNonEOLTrivia) + 1; } bool needsTrailingEOL; if (index < trivia.Length) { needsTrailingEOL = !fixer.IsEndOfLine(trivia[index]); } else if (isEOF) { needsTrailingEOL = false; } else { needsTrailingEOL = true; } var pragmaRestoreTrivia = fixer.CreatePragmaRestoreDirectiveTrivia(diagnostic, needsTrailingEOL); if (isEOF) { return endToken.WithLeadingTrivia(trivia.InsertRange(index, pragmaRestoreTrivia)); } else { return endToken.WithTrailingTrivia(trivia.InsertRange(index, pragmaRestoreTrivia)); } }
internal static SyntaxToken GetNewEndTokenWithAddedPragma(SyntaxToken endToken, TextSpan currentDiagnosticSpan, Diagnostic diagnostic, AbstractSuppressionCodeFixProvider fixer, Func<SyntaxNode, SyntaxNode> formatNode, bool isRemoveSuppression = false) { ImmutableArray<SyntaxTrivia> trivia; var isEOF = fixer.IsEndOfFileToken(endToken); if (isEOF) { trivia = endToken.LeadingTrivia.ToImmutableArray(); } else { trivia = endToken.TrailingTrivia.ToImmutableArray(); } SyntaxTrivia insertBeforeTrivia; var index = GetPositionForPragmaInsertion(trivia, currentDiagnosticSpan, fixer, isStartToken: false, triviaAtIndex: out insertBeforeTrivia); bool needsTrailingEOL; if (index < trivia.Length) { needsTrailingEOL = !fixer.IsEndOfLine(insertBeforeTrivia); } else if (isEOF) { needsTrailingEOL = false; } else { needsTrailingEOL = true; } var pragmaTrivia = !isRemoveSuppression ? fixer.CreatePragmaRestoreDirectiveTrivia(diagnostic, formatNode, needsLeadingEndOfLine: true, needsTrailingEndOfLine: needsTrailingEOL) : fixer.CreatePragmaDisableDirectiveTrivia(diagnostic, formatNode, needsLeadingEndOfLine: true, needsTrailingEndOfLine: needsTrailingEOL); if (isEOF) { return endToken.WithLeadingTrivia(trivia.InsertRange(index, pragmaTrivia)); } else { return endToken.WithTrailingTrivia(trivia.InsertRange(index, pragmaTrivia)); }; }
internal static SyntaxToken GetNewStartTokenWithAddedPragma(SyntaxToken startToken, TextSpan currentDiagnosticSpan, Diagnostic diagnostic, AbstractSuppressionCodeFixProvider fixer, Func<SyntaxNode, SyntaxNode> formatNode, bool isRemoveSuppression = false) { var trivia = startToken.LeadingTrivia.ToImmutableArray(); SyntaxTrivia insertAfterTrivia; var index = GetPositionForPragmaInsertion(trivia, currentDiagnosticSpan, fixer, isStartToken: true, triviaAtIndex: out insertAfterTrivia); index++; bool needsLeadingEOL; if (index > 0) { needsLeadingEOL = !fixer.IsEndOfLine(insertAfterTrivia); } else if (startToken.FullSpan.Start == 0) { needsLeadingEOL = false; } else { needsLeadingEOL = true; } var pragmaTrivia = !isRemoveSuppression ? fixer.CreatePragmaDisableDirectiveTrivia(diagnostic, formatNode, needsLeadingEOL, needsTrailingEndOfLine: true) : fixer.CreatePragmaRestoreDirectiveTrivia(diagnostic, formatNode, needsLeadingEOL, needsTrailingEndOfLine: true); return startToken.WithLeadingTrivia(trivia.InsertRange(index, pragmaTrivia)); }