提交 ba17fe1a 编写于 作者: D Dustin Campbell

Merge pull request #7902 from DustinCampbell/unify-find-token-on-left-or-right-apis

Unify FindTokenOnLeftOfPosition and FindTokenOnRightOfPosition helpers
......@@ -802,6 +802,7 @@
<Compile Include="Syntax\SeparatedSyntaxListBuilder.cs" />
<Compile Include="Syntax\SimpleNameSyntax.cs" />
<Compile Include="Syntax\SimpleSyntaxReference.cs" />
<Compile Include="Syntax\SkippedTokensTriviaSyntax.cs" />
<Compile Include="Syntax\StructuredTriviaSyntax.cs" />
<Compile Include="Syntax\SyntaxEquivalence.cs" />
<Compile Include="Syntax\SyntaxExtensions.cs" />
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.CodeAnalysis.CSharp.Syntax
{
public sealed partial class SkippedTokensTriviaSyntax : StructuredTriviaSyntax, ISkippedTokensTriviaSyntax
{
}
}
......@@ -76,6 +76,7 @@
<Compile Include="ReferenceManager\MergedAliases.cs" />
<Compile Include="StrongName\CryptoBlobParser.cs" />
<Compile Include="Syntax\ICompilationUnitSyntax.cs" />
<Compile Include="Syntax\ISkippedTokensTriviaSyntax.cs" />
<Compile Include="Text\LargeTextWriter.cs" />
<Compile Include="Text\SourceTextWriter.cs" />
<Compile Include="Text\StringTextWriter.cs" />
......
......@@ -88,6 +88,8 @@ Microsoft.CodeAnalysis.IAssemblySymbol.GetMetadata() -> Microsoft.CodeAnalysis.A
Microsoft.CodeAnalysis.ICompilationUnitSyntax
Microsoft.CodeAnalysis.ICompilationUnitSyntax.EndOfFileToken.get -> Microsoft.CodeAnalysis.SyntaxToken
Microsoft.CodeAnalysis.IModuleSymbol.GetMetadata() -> Microsoft.CodeAnalysis.ModuleMetadata
Microsoft.CodeAnalysis.ISkippedTokensTriviaSyntax
Microsoft.CodeAnalysis.ISkippedTokensTriviaSyntax.Tokens.get -> Microsoft.CodeAnalysis.SyntaxTokenList
Microsoft.CodeAnalysis.Metadata.Id.get -> Microsoft.CodeAnalysis.MetadataId
Microsoft.CodeAnalysis.MetadataId
Microsoft.CodeAnalysis.MetadataReference.MetadataReference(Microsoft.CodeAnalysis.MetadataReferenceProperties properties) -> void
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.CodeAnalysis
{
#pragma warning disable RS0010
/// <summary>
/// Represents structured trivia that contains skipped tokens. This is implemented by
/// <see cref="T:Microsoft.CodeAnalysis.CSharp.Syntax.SkippedTokensTriviaSyntax"/> and
/// <see cref="T:Microsoft.CodeAnalysis.VisualBasic.Syntax.SkippedTokensTriviaSyntax"/>.
/// </summary>
#pragma warning restore RS0010
public interface ISkippedTokensTriviaSyntax
{
SyntaxTokenList Tokens { get; }
}
}
......@@ -876,6 +876,7 @@
<Compile Include="Syntax\SeparatedSyntaxListBuilder.vb" />
<Compile Include="Syntax\SimpleSyntaxReference.vb" />
<Compile Include="Syntax\SingleLineLambdaExpressionSyntax.vb" />
<Compile Include="Syntax\SkippedTokensTriviaSyntax.vb" />
<Compile Include="Syntax\StructuredTriviaSyntax.vb" />
<Compile Include="Syntax\SyntaxEquivalence.vb" />
<Compile Include="Syntax\SyntaxExtensions.vb" />
......@@ -1008,4 +1009,4 @@
<ImportGroup Label="Targets">
<Import Project="..\..\..\..\build\Targets\VSL.Imports.targets" />
</ImportGroup>
</Project>
</Project>
\ No newline at end of file
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax
Partial Public Class SkippedTokensTriviaSyntax
Implements ISkippedTokensTriviaSyntax
Private ReadOnly Property ISkippedTokensTriviaSyntax_Tokens As SyntaxTokenList Implements ISkippedTokensTriviaSyntax.Tokens
Get
Return Me.Tokens
End Get
End Property
End Class
End Namespace
......@@ -5,6 +5,7 @@
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Extensions.ContextQuery;
using Microsoft.CodeAnalysis.Editor.Implementation.AutomaticCompletion;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.VisualStudio.Text.BraceCompletion;
using Roslyn.Utilities;
......
......@@ -4,6 +4,7 @@
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.Editor.Implementation.AutomaticCompletion;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.VisualStudio.Text.BraceCompletion;
using Roslyn.Utilities;
......
......@@ -11,7 +11,6 @@
using Microsoft.CodeAnalysis.Editor.Host;
using Microsoft.CodeAnalysis.Editor.Implementation.DocumentationComments;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Operations;
using Microsoft.VisualStudio.Utilities;
......
......@@ -7,6 +7,7 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editor.Host;
using Microsoft.CodeAnalysis.Editor.Implementation.DocumentationComments;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Operations;
......
......@@ -7,6 +7,7 @@
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editor;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.LanguageServices.Implementation.DebuggerIntelliSense;
using Microsoft.VisualStudio.Text;
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.ComponentModel.Composition
Imports System.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Editor
Imports Microsoft.CodeAnalysis.Editor.Shared.Extensions
Imports Microsoft.CodeAnalysis.Shared.Extensions
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Extensions
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.VisualStudio.Editor
Imports Microsoft.VisualStudio.LanguageServices.Implementation.Snippets
Imports Microsoft.VisualStudio.Shell
Imports Microsoft.VisualStudio.Text
Imports Microsoft.VisualStudio.Text.Editor
Imports Microsoft.VisualStudio.TextManager.Interop
Imports Microsoft.VisualStudio.Utilities
Imports Microsoft.VisualStudio.LanguageServices.Implementation.Snippets
Imports Microsoft.CodeAnalysis.Editor.Shared.Extensions
Imports System.ComponentModel.Composition
Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Snippets
<ExportCommandHandler("VB Snippets", ContentTypeNames.VisualBasicContentType)>
......
......@@ -2,14 +2,15 @@
Imports System.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Editor.Shared.Extensions
Imports Microsoft.CodeAnalysis.Shared.Extensions
Imports Microsoft.CodeAnalysis.Simplification
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Extensions
Imports Microsoft.CodeAnalysis.Editor.Shared.Extensions
Imports Microsoft.VisualStudio.LanguageServices.Implementation.Snippets.SnippetFunctions
Imports Microsoft.VisualStudio.Text
Imports Microsoft.VisualStudio.Text.Editor
Imports Microsoft.VisualStudio.LanguageServices.Implementation.Snippets.SnippetFunctions
Imports TextSpan = Microsoft.CodeAnalysis.Text.TextSpan
Imports VsTextSpan = Microsoft.VisualStudio.TextManager.Interop.TextSpan
......
......@@ -754,78 +754,6 @@ public static IEnumerable<SyntaxNode> GetAncestorsOrThis(this SyntaxNode node, F
}
}
/// <summary>
/// Look inside a trivia list for a skipped token that contains the given position.
/// </summary>
private static readonly Func<SyntaxTriviaList, int, SyntaxToken> s_findSkippedTokenForward =
(l, p) => FindTokenHelper.FindSkippedTokenForward(GetSkippedTokens(l), p);
/// <summary>
/// Look inside a trivia list for a skipped token that contains the given position.
/// </summary>
private static readonly Func<SyntaxTriviaList, int, SyntaxToken> s_findSkippedTokenBackward =
(l, p) => FindTokenHelper.FindSkippedTokenBackward(GetSkippedTokens(l), p);
/// <summary>
/// return only skipped tokens
/// </summary>
private static IEnumerable<SyntaxToken> GetSkippedTokens(SyntaxTriviaList list)
{
// PERF: Avoid allocations in the most common case of no skipped tokens.
if (!HasSkippedTokens(list))
{
return SpecializedCollections.EmptyEnumerable<SyntaxToken>();
}
return list.Where(trivia => trivia.RawKind == (int)SyntaxKind.SkippedTokensTrivia)
.SelectMany(t => ((SkippedTokensTriviaSyntax)t.GetStructure()).Tokens);
}
private static bool HasSkippedTokens(SyntaxTriviaList list)
{
foreach (var trivia in list)
{
if (trivia.RawKind == (int)SyntaxKind.SkippedTokensTrivia)
{
return true;
}
}
return false;
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the right.
/// </summary>
public static SyntaxToken FindTokenOnRightOfPosition(
this SyntaxNode root,
int position,
bool includeSkipped = true,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
var skippedTokenFinder = includeSkipped ? s_findSkippedTokenForward : null;
return FindTokenHelper.FindTokenOnRightOfPosition<CompilationUnitSyntax>(
root, position, skippedTokenFinder, includeSkipped, includeDirectives, includeDocumentationComments);
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the left.
/// </summary>
public static SyntaxToken FindTokenOnLeftOfPosition(
this SyntaxNode root,
int position,
bool includeSkipped = true,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
var skippedTokenFinder = includeSkipped ? s_findSkippedTokenBackward : null;
return FindTokenHelper.FindTokenOnLeftOfPosition<CompilationUnitSyntax>(
root, position, skippedTokenFinder, includeSkipped, includeDirectives, includeDocumentationComments);
}
/// <summary>
/// Returns child node or token that contains given position.
/// </summary>
......
......@@ -107,36 +107,6 @@ private static bool BaseTypeDeclarationContainsPosition(BaseTypeDeclarationSynta
return token.GetAncestors<BaseTypeDeclarationSyntax>().Where(t => BaseTypeDeclarationContainsPosition(t, position));
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the right.
/// </summary>
public static SyntaxToken FindTokenOnRightOfPosition(
this SyntaxTree syntaxTree,
int position,
CancellationToken cancellationToken,
bool includeSkipped = true,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
return syntaxTree.GetRoot(cancellationToken).FindTokenOnRightOfPosition(
position, includeSkipped, includeDirectives, includeDocumentationComments);
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the left.
/// </summary>
public static SyntaxToken FindTokenOnLeftOfPosition(
this SyntaxTree syntaxTree,
int position,
CancellationToken cancellationToken,
bool includeSkipped = true,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
return syntaxTree.GetRoot(cancellationToken).FindTokenOnLeftOfPosition(
position, includeSkipped, includeDirectives, includeDocumentationComments);
}
private static readonly Func<SyntaxKind, bool> s_isDotOrArrow = k => k == SyntaxKind.DotToken || k == SyntaxKind.MinusGreaterThanToken;
private static readonly Func<SyntaxKind, bool> s_isDotOrArrowOrColonColon =
k => k == SyntaxKind.DotToken || k == SyntaxKind.MinusGreaterThanToken || k == SyntaxKind.ColonColonToken;
......
......@@ -548,5 +548,158 @@ public static bool OverlapsHiddenPosition(this SyntaxNode declaration, SyntaxNod
return root;
}
/// <summary>
/// Look inside a trivia list for a skipped token that contains the given position.
/// </summary>
private static readonly Func<SyntaxTriviaList, int, SyntaxToken> s_findSkippedTokenForward = FindSkippedTokenForward;
/// <summary>
/// Look inside a trivia list for a skipped token that contains the given position.
/// </summary>
private static SyntaxToken FindSkippedTokenForward(SyntaxTriviaList triviaList, int position)
{
foreach (var trivia in triviaList)
{
if (trivia.HasStructure)
{
var skippedTokensTrivia = trivia.GetStructure() as ISkippedTokensTriviaSyntax;
if (skippedTokensTrivia != null)
{
foreach (var token in skippedTokensTrivia.Tokens)
{
if (token.Span.Length > 0 && position <= token.Span.End)
{
return token;
}
}
}
}
}
return default(SyntaxToken);
}
/// <summary>
/// Look inside a trivia list for a skipped token that contains the given position.
/// </summary>
private static readonly Func<SyntaxTriviaList, int, SyntaxToken> s_findSkippedTokenBackward = FindSkippedTokenBackward;
/// <summary>
/// Look inside a trivia list for a skipped token that contains the given position.
/// </summary>
private static SyntaxToken FindSkippedTokenBackward(SyntaxTriviaList triviaList, int position)
{
foreach (var trivia in triviaList.Reverse())
{
if (trivia.HasStructure)
{
var skippedTokensTrivia = trivia.GetStructure() as ISkippedTokensTriviaSyntax;
if (skippedTokensTrivia != null)
{
foreach (var token in skippedTokensTrivia.Tokens)
{
if (token.Span.Length > 0 && token.SpanStart <= position)
{
return token;
}
}
}
}
}
return default(SyntaxToken);
}
private static SyntaxToken GetInitialToken(
SyntaxNode root,
int position,
bool includeSkipped = false,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
return (position < root.FullSpan.End || !(root is ICompilationUnitSyntax))
? root.FindToken(position, includeSkipped || includeDirectives || includeDocumentationComments)
: root.GetLastToken(includeZeroWidth: true, includeSkipped: true, includeDirectives: true, includeDocumentationComments: true)
.GetPreviousToken(includeZeroWidth: false, includeSkipped: includeSkipped, includeDirectives: includeDirectives, includeDocumentationComments: includeDocumentationComments);
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the right.
/// </summary>
public static SyntaxToken FindTokenOnRightOfPosition(
this SyntaxNode root,
int position,
bool includeSkipped = false,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
var findSkippedToken = includeSkipped ? s_findSkippedTokenForward : ((l, p) => default(SyntaxToken));
var token = GetInitialToken(root, position, includeSkipped, includeDirectives, includeDocumentationComments);
if (position < token.SpanStart)
{
var skippedToken = findSkippedToken(token.LeadingTrivia, position);
token = skippedToken.RawKind != 0 ? skippedToken : token;
}
else if (token.Span.End <= position)
{
do
{
var skippedToken = findSkippedToken(token.TrailingTrivia, position);
token = skippedToken.RawKind != 0
? skippedToken
: token.GetNextToken(includeZeroWidth: false, includeSkipped: includeSkipped, includeDirectives: includeDirectives, includeDocumentationComments: includeDocumentationComments);
}
while (token.RawKind != 0 && token.Span.End <= position && token.Span.End <= root.FullSpan.End);
}
if (token.Span.Length == 0)
{
token = token.GetNextToken();
}
return token;
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the left.
/// </summary>
public static SyntaxToken FindTokenOnLeftOfPosition(
this SyntaxNode root,
int position,
bool includeSkipped = false,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
var findSkippedToken = includeSkipped ? s_findSkippedTokenBackward : ((l, p) => default(SyntaxToken));
var token = GetInitialToken(root, position, includeSkipped, includeDirectives, includeDocumentationComments);
if (position <= token.SpanStart)
{
do
{
var skippedToken = findSkippedToken(token.LeadingTrivia, position);
token = skippedToken.RawKind != 0
? skippedToken
: token.GetPreviousToken(includeZeroWidth: false, includeSkipped: includeSkipped, includeDirectives: includeDirectives, includeDocumentationComments: includeDocumentationComments);
}
while (position <= token.SpanStart && root.FullSpan.Start < token.SpanStart);
}
else if (token.Span.End < position)
{
var skippedToken = findSkippedToken(token.TrailingTrivia, position);
token = skippedToken.RawKind != 0 ? skippedToken : token;
}
if (token.Span.Length == 0)
{
token = token.GetPreviousToken();
}
return token;
}
}
}
......@@ -203,5 +203,36 @@ public static bool IsHiddenPosition(this SyntaxTree tree, int position, Cancella
return trivia;
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the right.
/// </summary>
public static SyntaxToken FindTokenOnRightOfPosition(
this SyntaxTree syntaxTree,
int position,
CancellationToken cancellationToken,
bool includeSkipped = true,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
return syntaxTree.GetRoot(cancellationToken).FindTokenOnRightOfPosition(
position, includeSkipped, includeDirectives, includeDocumentationComments);
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the left.
/// </summary>
public static SyntaxToken FindTokenOnLeftOfPosition(
this SyntaxTree syntaxTree,
int position,
CancellationToken cancellationToken,
bool includeSkipped = true,
bool includeDirectives = false,
bool includeDocumentationComments = false)
{
return syntaxTree.GetRoot(cancellationToken).FindTokenOnLeftOfPosition(
position, includeSkipped, includeDirectives, includeDocumentationComments);
}
}
}
\ No newline at end of file
// 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.Text;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Shared.Utilities
{
internal static class FindTokenHelper
{
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the right.
/// </summary>
public static SyntaxToken FindTokenOnRightOfPosition<TRoot>(
SyntaxNode root,
int position,
Func<SyntaxTriviaList, int, SyntaxToken> skippedTokenFinder,
bool includeSkipped = false,
bool includeDirectives = false,
bool includeDocumentationComments = false)
where TRoot : SyntaxNode
{
var findSkippedToken = skippedTokenFinder ?? ((l, p) => default(SyntaxToken));
var token = GetInitialToken<TRoot>(root, position, includeSkipped, includeDirectives, includeDocumentationComments);
if (position < token.SpanStart)
{
var skippedToken = findSkippedToken(token.LeadingTrivia, position);
token = skippedToken.RawKind != 0 ? skippedToken : token;
}
else if (token.Span.End <= position)
{
do
{
var skippedToken = findSkippedToken(token.TrailingTrivia, position);
token = skippedToken.RawKind != 0
? skippedToken
: token.GetNextToken(includeZeroWidth: false, includeSkipped: includeSkipped, includeDirectives: includeDirectives, includeDocumentationComments: includeDocumentationComments);
}
while (token.RawKind != 0 && token.Span.End <= position && token.Span.End <= root.FullSpan.End);
}
if (token.Span.Length == 0)
{
token = token.GetNextToken();
}
return token;
}
/// <summary>
/// If the position is inside of token, return that token; otherwise, return the token to the left.
/// </summary>
public static SyntaxToken FindTokenOnLeftOfPosition<TRoot>(
SyntaxNode root,
int position,
Func<SyntaxTriviaList, int, SyntaxToken> skippedTokenFinder,
bool includeSkipped = false,
bool includeDirectives = false,
bool includeDocumentationComments = false)
where TRoot : SyntaxNode
{
var findSkippedToken = skippedTokenFinder ?? ((l, p) => default(SyntaxToken));
var token = GetInitialToken<TRoot>(root, position, includeSkipped, includeDirectives, includeDocumentationComments);
if (position <= token.SpanStart)
{
do
{
var skippedToken = findSkippedToken(token.LeadingTrivia, position);
token = skippedToken.RawKind != 0
? skippedToken
: token.GetPreviousToken(includeZeroWidth: false, includeSkipped: includeSkipped, includeDirectives: includeDirectives, includeDocumentationComments: includeDocumentationComments);
}
while (position <= token.SpanStart && root.FullSpan.Start < token.SpanStart);
}
else if (token.Span.End < position)
{
var skippedToken = findSkippedToken(token.TrailingTrivia, position);
token = skippedToken.RawKind != 0 ? skippedToken : token;
}
if (token.Span.Length == 0)
{
token = token.GetPreviousToken();
}
return token;
}
private static SyntaxToken GetInitialToken<TRoot>(
SyntaxNode root,
int position,
bool includeSkipped = false,
bool includeDirectives = false,
bool includeDocumentationComments = false)
where TRoot : SyntaxNode
{
var token = (position < root.FullSpan.End || !(root is TRoot))
? root.FindToken(position, includeSkipped || includeDirectives || includeDocumentationComments)
: root.GetLastToken(includeZeroWidth: true, includeSkipped: true, includeDirectives: true, includeDocumentationComments: true)
.GetPreviousToken(includeZeroWidth: false, includeSkipped: includeSkipped, includeDirectives: includeDirectives, includeDocumentationComments: includeDocumentationComments);
return token;
}
/// <summary>
/// Look inside a trivia list for a skipped token that contains the given position.
/// </summary>
public static SyntaxToken FindSkippedTokenBackward(IEnumerable<SyntaxToken> skippedTokenList, int position)
{
// the given skipped token list is already in order
// PERF: Expansion of return skippedTokenList.LastOrDefault(skipped => skipped.Span.Length > 0 && skipped.SpanStart <= position);
var skippedTokenContainingPosition = default(SyntaxToken);
foreach (var skipped in skippedTokenList)
{
if (skipped.Span.Length > 0 && skipped.SpanStart <= position)
{
skippedTokenContainingPosition = skipped;
}
}
return skippedTokenContainingPosition;
}
/// <summary>
/// Look inside a trivia list for a skipped token that contains the given position.
/// </summary>
public static SyntaxToken FindSkippedTokenForward(IEnumerable<SyntaxToken> skippedTokenList, int position)
{
// the given token list is already in order
var skippedTokenContainingPosition = skippedTokenList.FirstOrDefault(skipped => skipped.Span.Length > 0 && position <= skipped.Span.End);
if (skippedTokenContainingPosition != default(SyntaxToken))
{
return skippedTokenContainingPosition;
}
return default(SyntaxToken);
}
}
}
......@@ -741,7 +741,6 @@
<Compile Include="Shared\Utilities\ExtensionOrderer.cs" />
<Compile Include="Shared\Utilities\ExtensionOrderer.Graph.cs" />
<Compile Include="Shared\Utilities\ExtensionOrderer.Node.cs" />
<Compile Include="Shared\Utilities\FindTokenHelper.cs" />
<Compile Include="Shared\Utilities\IntegerUtilities.cs" />
<Compile Include="Shared\Utilities\Matcher.ChoiceMatcher.cs" />
<Compile Include="Shared\Utilities\Matcher.cs" />
......
......@@ -656,46 +656,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
Return Nothing
End Function
''' <summary>
''' If the position is inside of token, return that token; otherwise, return the token to right.
''' </summary>
<Extension()>
Public Function FindTokenOnRightOfPosition(
root As SyntaxNode,
position As Integer,
Optional includeSkipped As Boolean = True,
Optional includeDirectives As Boolean = False,
Optional includeDocumentationComments As Boolean = False) As SyntaxToken
Dim skippedTokenFinder As Func(Of SyntaxTriviaList, Integer, SyntaxToken) = Nothing
skippedTokenFinder =
If(includeSkipped, s_findSkippedTokenForward, CType(Nothing, Func(Of SyntaxTriviaList, Integer, SyntaxToken)))
Return FindTokenHelper.FindTokenOnRightOfPosition(Of CompilationUnitSyntax)(
root, position, skippedTokenFinder, includeSkipped, includeDirectives, includeDocumentationComments)
End Function
''' <summary>
''' If the position is inside of token, return that token; otherwise, return the token to left.
''' </summary>
<Extension()>
Public Function FindTokenOnLeftOfPosition(
root As SyntaxNode,
position As Integer,
Optional includeSkipped As Boolean = True,
Optional includeDirectives As Boolean = False,
Optional includeDocumentationComments As Boolean = False) As SyntaxToken
Dim skippedTokenFinder As Func(Of SyntaxTriviaList, Integer, SyntaxToken) = Nothing
skippedTokenFinder =
If(includeSkipped, s_findSkippedTokenBackward, CType(Nothing, Func(Of SyntaxTriviaList, Integer, SyntaxToken)))
Return FindTokenHelper.FindTokenOnLeftOfPosition(Of CompilationUnitSyntax)(
root, position, skippedTokenFinder, includeSkipped, includeDirectives, includeDocumentationComments)
End Function
''' <summary>
''' Returns child node or token that contains given position.
''' </summary>
......@@ -725,27 +685,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions
Throw New ArgumentOutOfRangeException(NameOf(position))
End Function
''' <summary>
''' Look inside a trivia list for a skipped token that contains the given position.
''' </summary>
Private ReadOnly s_findSkippedTokenForward As Func(Of SyntaxTriviaList, Integer, SyntaxToken) =
Function(l, p) FindTokenHelper.FindSkippedTokenForward(GetSkippedTokens(l), p)
''' <summary>
''' Look inside a trivia list for a skipped token that contains the given position.
''' </summary>
Private ReadOnly s_findSkippedTokenBackward As Func(Of SyntaxTriviaList, Integer, SyntaxToken) =
Function(l, p) FindTokenHelper.FindSkippedTokenBackward(GetSkippedTokens(l), p)
''' <summary>
''' get skipped tokens from the trivia list
''' </summary>
Private Function GetSkippedTokens(list As SyntaxTriviaList) As IEnumerable(Of SyntaxToken)
Return list.Where(Function(t) t.RawKind = SyntaxKind.SkippedTokensTrivia) _
.SelectMany(Function(t) DirectCast(t.GetStructure(), SkippedTokensTriviaSyntax).Tokens)
End Function
<Extension()>
Public Function ReplaceStatements(node As SyntaxNode,
statements As SyntaxList(Of StatementSyntax),
......
......@@ -207,38 +207,6 @@ recurse:
Return IsGlobalStatementContext(token, position)
End Function
''' <summary>
''' If the position is inside of token, return that token; otherwise, return the token to right.
''' </summary>
<Extension()>
Public Function FindTokenOnRightOfPosition(
syntaxTree As SyntaxTree,
position As Integer,
cancellationToken As CancellationToken,
Optional includeSkipped As Boolean = True,
Optional includeDirectives As Boolean = False,
Optional includeDocumentationComments As Boolean = False) As SyntaxToken
Return syntaxTree.GetRoot(cancellationToken).FindTokenOnRightOfPosition(
position, includeSkipped, includeDirectives, includeDocumentationComments)
End Function
''' <summary>
''' If the position is inside of token, return that token; otherwise, return the token to left.
''' </summary>
<Extension()>
Public Function FindTokenOnLeftOfPosition(
syntaxTree As SyntaxTree,
position As Integer,
cancellationToken As CancellationToken,
Optional includeSkipped As Boolean = True,
Optional includeDirectives As Boolean = False,
Optional includeDocumentationComments As Boolean = False) As SyntaxToken
Return syntaxTree.GetRoot(cancellationToken).FindTokenOnLeftOfPosition(
position, includeSkipped, includeDirectives, includeDocumentationComments)
End Function
<Extension()>
Public Function IsRightOfDot(syntaxTree As SyntaxTree, position As Integer, cancellationToken As CancellationToken) As Boolean
Dim token = syntaxTree.FindTokenOnLeftOfPosition(position, cancellationToken)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册