提交 1c4be1a0 编写于 作者: B Brett V. Forsgren

audit usage of SyntaxKind.SingleLineCommentTrivia and add tests

上级 7386e6cb
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Collections;
using Roslyn.Utilities;
using System.Diagnostics;
......@@ -347,7 +345,8 @@ public override Microsoft.CodeAnalysis.SyntaxToken CreateSeparator<TNode>(Syntax
public override bool IsTriviaWithEndOfLine()
{
return this.Kind == SyntaxKind.EndOfLineTrivia
|| this.Kind == SyntaxKind.SingleLineCommentTrivia;
|| this.Kind == SyntaxKind.SingleLineCommentTrivia
|| this.Kind == SyntaxKind.ShebangCommentTrivia;
}
// Use conditional weak table so we always return same identity for structured trivia
......
......@@ -8,7 +8,6 @@
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
using InternalSyntax = Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax;
namespace Microsoft.CodeAnalysis.CSharp
......@@ -194,6 +193,7 @@ public static SyntaxTrivia SyntaxTrivia(SyntaxKind kind, string text)
case SyntaxKind.EndOfLineTrivia:
case SyntaxKind.MultiLineCommentTrivia:
case SyntaxKind.SingleLineCommentTrivia:
case SyntaxKind.ShebangCommentTrivia:
case SyntaxKind.WhitespaceTrivia:
return new SyntaxTrivia(default(SyntaxToken), new Syntax.InternalSyntax.SyntaxTrivia(kind, text, null, null), 0, 0);
......
......@@ -209,6 +209,7 @@ public static bool IsTrivia(SyntaxKind kind)
case SyntaxKind.WhitespaceTrivia:
case SyntaxKind.SingleLineCommentTrivia:
case SyntaxKind.MultiLineCommentTrivia:
case SyntaxKind.ShebangCommentTrivia:
case SyntaxKind.SingleLineDocumentationCommentTrivia:
case SyntaxKind.MultiLineDocumentationCommentTrivia:
case SyntaxKind.DisabledTextTrivia:
......
......@@ -114,6 +114,7 @@ private static bool IsEndOfLine(SyntaxTrivia trivia)
{
return trivia.Kind() == SyntaxKind.EndOfLineTrivia
|| trivia.Kind() == SyntaxKind.SingleLineCommentTrivia
|| trivia.Kind() == SyntaxKind.ShebangCommentTrivia
|| trivia.IsDirective;
}
......
......@@ -666,6 +666,7 @@ private static bool NeedsLineBreakAfter(SyntaxTrivia trivia, bool isTrailingTriv
switch (kind)
{
case SyntaxKind.SingleLineCommentTrivia:
case SyntaxKind.ShebangCommentTrivia:
return true;
case SyntaxKind.MultiLineCommentTrivia:
return !isTrailingTrivia;
......
......@@ -8367,5 +8367,12 @@ class Class2
}";
VerifyItemExists(markup, "Property1");
}
[Fact, Trait(Traits.Feature, Traits.Features.Completion)]
public void NoCompletionInShebangComments()
{
VerifyNoItemsExist("#!$$", sourceCodeKind: SourceCodeKind.Script);
VerifyNoItemsExist("#! S$$", sourceCodeKind: SourceCodeKind.Script, usePreviousCharAsTrigger: true);
}
}
}
......@@ -318,10 +318,7 @@ private SyntaxTriviaList GetTriviaToPreserve(SyntaxTriviaList syntaxTriviaList)
private static bool ShouldPreserve(SyntaxTriviaList trivia)
{
return trivia.Any(
t => t.Kind() == SyntaxKind.SingleLineCommentTrivia ||
t.Kind() == SyntaxKind.MultiLineCommentTrivia ||
t.IsDirective);
return trivia.Any(t => t.IsRegularComment() || t.IsDirective);
}
private SyntaxNode RemoveDeclaratorFromVariableList(VariableDeclaratorSyntax variableDeclarator, VariableDeclarationSyntax variableDeclaration)
......
......@@ -1180,8 +1180,7 @@ private IList<SyntaxTrivia> CollectComments(IList<SyntaxTrivia> triviaList)
for (int i = triviaList.Count - 1; i >= 0; i--)
{
var trivia = triviaList[i];
if (trivia.Kind() == SyntaxKind.SingleLineCommentTrivia ||
trivia.Kind() == SyntaxKind.MultiLineCommentTrivia)
if (trivia.IsRegularComment())
{
commentList.Add(trivia);
}
......@@ -1210,8 +1209,7 @@ public override string GetComment(SyntaxNode node)
var textBuilder = new StringBuilder();
foreach (var trivia in commentList)
{
if (trivia.Kind() == SyntaxKind.SingleLineCommentTrivia ||
trivia.Kind() == SyntaxKind.MultiLineCommentTrivia)
if (trivia.IsRegularComment())
{
textBuilder.AppendLine(trivia.GetCommentText());
}
......
......@@ -8,11 +8,9 @@
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.LanguageServices.Implementation.F1Help;
using Roslyn.Utilities;
......@@ -77,7 +75,7 @@ public override async Task<string> GetHelpTermAsync(Document document, TextSpan
return "#region";
}
if (trivia.MatchesKind(SyntaxKind.MultiLineDocumentationCommentTrivia, SyntaxKind.SingleLineDocumentationCommentTrivia, SyntaxKind.SingleLineCommentTrivia, SyntaxKind.MultiLineCommentTrivia))
if (trivia.IsRegularOrDocComment())
{
// just find the first "word" that intersects with our position
var text = await syntaxTree.GetTextAsync(cancellationToken).ConfigureAwait(false);
......
......@@ -121,9 +121,7 @@ private void ClassifyToken(SyntaxToken token)
private void ClassifyTrivia(SyntaxTrivia trivia)
{
if (trivia.Kind() == SyntaxKind.SingleLineCommentTrivia ||
trivia.Kind() == SyntaxKind.MultiLineCommentTrivia ||
trivia.Kind() == SyntaxKind.ShebangCommentTrivia)
if (trivia.IsRegularComment())
{
AddClassification(trivia, ClassificationTypeNames.Comment);
}
......
......@@ -175,9 +175,10 @@ static SyntaxNodeExtensions()
var endOfLine = Match(SyntaxKind.EndOfLineTrivia, "\\n");
var singleBlankLine = Matcher.Sequence(whitespace, endOfLine);
var shebangComment = Match(SyntaxKind.ShebangCommentTrivia, "#!");
var singleLineComment = Match(SyntaxKind.SingleLineCommentTrivia, "//");
var multiLineComment = Match(SyntaxKind.MultiLineCommentTrivia, "/**/");
var anyCommentMatcher = Matcher.Choice(singleLineComment, multiLineComment);
var anyCommentMatcher = Matcher.Choice(shebangComment, singleLineComment, multiLineComment);
var commentLine = Matcher.Sequence(whitespace, anyCommentMatcher, whitespace, endOfLine);
......
......@@ -348,7 +348,7 @@ public static bool IsEntirelyWithinCrefSyntax(this SyntaxTree syntaxTree, int po
trivia = trivia.GetPreviousTrivia(syntaxTree, cancellationToken);
}
if (trivia.IsSingleLineComment())
if (trivia.IsSingleLineComment() || trivia.IsShebangComment())
{
var span = trivia.FullSpan;
......
......@@ -2,10 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Extensions
......@@ -35,7 +31,7 @@ public static bool Any(this SyntaxTriviaList triviaList, params SyntaxKind[] kin
public static SyntaxTrivia? GetLastComment(this SyntaxTriviaList triviaList)
{
return triviaList
.Where(t => t.MatchesKind(SyntaxKind.SingleLineCommentTrivia, SyntaxKind.MultiLineCommentTrivia))
.Where(t => t.IsRegularComment())
.LastOrNullable();
}
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Shared.Utilities
{
......@@ -9,25 +8,30 @@ internal partial class Matcher<T>
{
private class ChoiceMatcher : Matcher<T>
{
private readonly Matcher<T> _matcher1;
private readonly Matcher<T> _matcher2;
private readonly IEnumerable<Matcher<T>> _matchers;
public ChoiceMatcher(Matcher<T> matcher1, Matcher<T> matcher2)
public ChoiceMatcher(params Matcher<T>[] matchers)
{
_matcher1 = matcher1;
_matcher2 = matcher2;
_matchers = matchers;
}
public override bool TryMatch(IList<T> sequence, ref int index)
{
return
_matcher1.TryMatch(sequence, ref index) ||
_matcher2.TryMatch(sequence, ref index);
// we can't use .Any() here because ref parameters can't be used in lambdas
foreach (var matcher in _matchers)
{
if (matcher.TryMatch(sequence, ref index))
{
return true;
}
}
return false;
}
public override string ToString()
{
return string.Format("({0}|{1})", _matcher1, _matcher2);
return $"({string.Join("|", _matchers)})";
}
}
}
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Shared.Utilities
{
......@@ -24,11 +23,11 @@ public static Matcher<T> OneOrMore<T>(Matcher<T> matcher)
}
/// <summary>
/// Matcher equivalent to (m_1|m_2)
/// Matcher equivalent to (m_1|m_2|...|m_n)
/// </summary>
public static Matcher<T> Choice<T>(Matcher<T> matcher1, Matcher<T> matcher2)
public static Matcher<T> Choice<T>(params Matcher<T>[] matchers)
{
return Matcher<T>.Choice(matcher1, matcher2);
return Matcher<T>.Choice(matchers);
}
/// <summary>
......
......@@ -2,7 +2,6 @@
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Shared.Utilities
{
......@@ -29,9 +28,9 @@ internal static Matcher<T> OneOrMore(Matcher<T> matcher)
return Sequence(matcher, Repeat(matcher));
}
internal static Matcher<T> Choice(Matcher<T> matcher1, Matcher<T> matcher2)
internal static Matcher<T> Choice(params Matcher<T>[] matchers)
{
return new ChoiceMatcher(matcher1, matcher2);
return new ChoiceMatcher(matchers);
}
internal static Matcher<T> Sequence(params Matcher<T>[] matchers)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册