提交 baf44ce0 编写于 作者: C CyrusNajmabadi

Have a single SyntaxNavigator object that is shared between C# and VB.

上级 8eafb6f4
...@@ -843,7 +843,6 @@ ...@@ -843,7 +843,6 @@
<Compile Include="Syntax\SyntaxListBuilder.cs" /> <Compile Include="Syntax\SyntaxListBuilder.cs" />
<Compile Include="Syntax\SyntaxListBuilder`1.cs" /> <Compile Include="Syntax\SyntaxListBuilder`1.cs" />
<Compile Include="Syntax\SyntaxListBuilderExtensions.cs" /> <Compile Include="Syntax\SyntaxListBuilderExtensions.cs" />
<Compile Include="Syntax\SyntaxNavigator.cs" />
<Compile Include="Syntax\SyntaxNodeExtensions.cs" /> <Compile Include="Syntax\SyntaxNodeExtensions.cs" />
<Compile Include="Syntax\SyntaxFacts.cs" /> <Compile Include="Syntax\SyntaxFacts.cs" />
<Compile Include="Syntax\SyntaxNodeOrTokenListBuilder.cs" /> <Compile Include="Syntax\SyntaxNodeOrTokenListBuilder.cs" />
...@@ -925,4 +924,4 @@ ...@@ -925,4 +924,4 @@
<ImportGroup Label="Targets"> <ImportGroup Label="Targets">
<Import Project="..\..\..\..\build\Targets\VSL.Imports.targets" /> <Import Project="..\..\..\..\build\Targets\VSL.Imports.targets" />
</ImportGroup> </ImportGroup>
</Project> </Project>
\ No newline at end of file
...@@ -37,14 +37,6 @@ internal CSharpSyntaxNode(GreenNode green, int position, SyntaxTree syntaxTree) ...@@ -37,14 +37,6 @@ internal CSharpSyntaxNode(GreenNode green, int position, SyntaxTree syntaxTree)
{ {
} }
internal override AbstractSyntaxNavigator Navigator
{
get
{
return SyntaxNavigator.Instance;
}
}
//TODO: move to common //TODO: move to common
/// <summary> /// <summary>
/// Creates a clone of a red node that can be used as a root of given syntaxTree. /// Creates a clone of a red node that can be used as a root of given syntaxTree.
......
...@@ -95,6 +95,9 @@ public override bool IsDirective ...@@ -95,6 +95,9 @@ public override bool IsDirective
} }
} }
public override bool IsSkippedTokensTrivia => this.Kind == SyntaxKind.SkippedTokensTrivia;
public override bool IsDocumentationCommentTrivia => SyntaxFacts.IsDocumentationCommentTrivia(this.Kind);
public override int GetSlotOffset(int index) public override int GetSlotOffset(int index)
{ {
// This implementation should not support arbitrary // This implementation should not support arbitrary
...@@ -298,14 +301,6 @@ internal static NodeFlags SetFactoryContext(NodeFlags flags, SyntaxFactoryContex ...@@ -298,14 +301,6 @@ internal static NodeFlags SetFactoryContext(NodeFlags flags, SyntaxFactoryContex
return flags; return flags;
} }
public override AbstractSyntaxNavigator Navigator
{
get
{
return SyntaxNavigator.Instance;
}
}
public override GreenNode CreateList(IEnumerable<GreenNode> nodes, bool alwaysCreateListNode) public override GreenNode CreateList(IEnumerable<GreenNode> nodes, bool alwaysCreateListNode)
{ {
if (nodes == null) if (nodes == null)
......
// 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;
namespace Microsoft.CodeAnalysis.CSharp.Syntax
{
internal sealed class SyntaxNavigator : AbstractSyntaxNavigator
{
public static readonly AbstractSyntaxNavigator Instance = new SyntaxNavigator();
[Flags]
private enum SyntaxKinds
{
DocComments = 1,
Directives = 2,
SkippedTokens = 4,
}
private static readonly Func<SyntaxTrivia, bool>[] s_stepIntoFunctions = new Func<SyntaxTrivia, bool>[]
{
/* 000 */ null,
/* 001 */ t => SyntaxFacts.IsDocumentationCommentTrivia((SyntaxKind)t.RawKind),
/* 010 */ t => t.IsDirective ,
/* 011 */ t => t.IsDirective || SyntaxFacts.IsDocumentationCommentTrivia((SyntaxKind)t.RawKind),
/* 100 */ t => t.RawKind == (int)SyntaxKind.SkippedTokensTrivia ,
/* 101 */ t => t.RawKind == (int)SyntaxKind.SkippedTokensTrivia || SyntaxFacts.IsDocumentationCommentTrivia((SyntaxKind)t.RawKind),
/* 110 */ t => t.RawKind == (int)SyntaxKind.SkippedTokensTrivia || t.IsDirective ,
/* 111 */ t => t.RawKind == (int)SyntaxKind.SkippedTokensTrivia || t.IsDirective || SyntaxFacts.IsDocumentationCommentTrivia((SyntaxKind)t.RawKind),
};
protected override Func<SyntaxTrivia, bool> GetStepIntoFunction(bool skipped, bool directives, bool docComments)
{
var index = (skipped ? SyntaxKinds.SkippedTokens : 0) |
(directives ? SyntaxKinds.Directives : 0) |
(docComments ? SyntaxKinds.DocComments : 0);
return s_stepIntoFunctions[(int)index];
}
}
}
...@@ -644,7 +644,7 @@ ...@@ -644,7 +644,7 @@
<Compile Include="Symbols\TypeParameterKind.cs" /> <Compile Include="Symbols\TypeParameterKind.cs" />
<Compile Include="Symbols\VarianceKind.cs" /> <Compile Include="Symbols\VarianceKind.cs" />
<Compile Include="Symbols\WellKnownMemberNames.cs" /> <Compile Include="Symbols\WellKnownMemberNames.cs" />
<Compile Include="Syntax\AbstractSyntaxNavigator.cs" /> <Compile Include="Syntax\SyntaxNavigator.cs" />
<Compile Include="Syntax\AbstractWarningStateMap.cs" /> <Compile Include="Syntax\AbstractWarningStateMap.cs" />
<Compile Include="Syntax\AnnotationExtensions.cs" /> <Compile Include="Syntax\AnnotationExtensions.cs" />
<Compile Include="Syntax\ChildSyntaxList.cs" /> <Compile Include="Syntax\ChildSyntaxList.cs" />
......
...@@ -120,9 +120,12 @@ public bool IsList ...@@ -120,9 +120,12 @@ public bool IsList
} }
public abstract string KindText { get; } public abstract string KindText { get; }
public virtual bool IsStructuredTrivia { get { return false; } }
public virtual bool IsDirective { get { return false; } } public virtual bool IsStructuredTrivia => false;
public virtual bool IsToken { get { return false; } } public virtual bool IsDirective => false;
public virtual bool IsToken => false;
public virtual bool IsSkippedTokensTrivia => false;
public virtual bool IsDocumentationCommentTrivia => false;
#endregion #endregion
...@@ -598,12 +601,12 @@ protected internal virtual void WriteTo(System.IO.TextWriter writer, bool leadin ...@@ -598,12 +601,12 @@ protected internal virtual void WriteTo(System.IO.TextWriter writer, bool leadin
#endregion #endregion
#region Tokens #region Tokens
public virtual int RawContextualKind { get { return this.RawKind; } } public virtual int RawContextualKind { get { return this.RawKind; } }
public virtual object GetValue() { return null; } public virtual object GetValue() { return null; }
public virtual string GetValueText() { return string.Empty; } public virtual string GetValueText() { return string.Empty; }
public virtual GreenNode GetLeadingTriviaCore() { return null; } public virtual GreenNode GetLeadingTriviaCore() { return null; }
public virtual GreenNode GetTrailingTriviaCore() { return null; } public virtual GreenNode GetTrailingTriviaCore() { return null; }
public abstract AbstractSyntaxNavigator Navigator { get; }
public virtual GreenNode WithLeadingTrivia(GreenNode trivia) public virtual GreenNode WithLeadingTrivia(GreenNode trivia)
{ {
......
...@@ -7,11 +7,39 @@ ...@@ -7,11 +7,39 @@
namespace Microsoft.CodeAnalysis namespace Microsoft.CodeAnalysis
{ {
internal abstract class AbstractSyntaxNavigator internal class SyntaxNavigator
{ {
private const int None = 0; private const int None = 0;
protected abstract Func<SyntaxTrivia, bool> GetStepIntoFunction(bool skipped, bool directives, bool docComments); public static readonly SyntaxNavigator Instance = new SyntaxNavigator();
[Flags]
private enum SyntaxKinds
{
DocComments = 1,
Directives = 2,
SkippedTokens = 4,
}
private static readonly Func<SyntaxTrivia, bool>[] s_stepIntoFunctions = new Func<SyntaxTrivia, bool>[]
{
/* 000 */ null,
/* 001 */ t => t.IsDocumentationCommentTrivia,
/* 010 */ t => t.IsDirective,
/* 011 */ t => t.IsDirective || t.IsDocumentationCommentTrivia,
/* 100 */ t => t.IsSkippedTokensTrivia,
/* 101 */ t => t.IsSkippedTokensTrivia || t.IsDocumentationCommentTrivia,
/* 110 */ t => t.IsSkippedTokensTrivia || t.IsDirective,
/* 111 */ t => t.IsSkippedTokensTrivia || t.IsDirective || t.IsDocumentationCommentTrivia,
};
private Func<SyntaxTrivia, bool> GetStepIntoFunction(bool skipped, bool directives, bool docComments)
{
var index = (skipped ? SyntaxKinds.SkippedTokens : 0) |
(directives ? SyntaxKinds.Directives : 0) |
(docComments ? SyntaxKinds.DocComments : 0);
return s_stepIntoFunctions[(int)index];
}
private static Func<SyntaxToken, bool> GetPredicateFunction(bool includeZeroWidth) private static Func<SyntaxToken, bool> GetPredicateFunction(bool includeZeroWidth)
{ {
...@@ -594,4 +622,4 @@ internal SyntaxToken GetNextToken(SyntaxToken current, Func<SyntaxToken, bool> p ...@@ -594,4 +622,4 @@ internal SyntaxToken GetNextToken(SyntaxToken current, Func<SyntaxToken, bool> p
return default(SyntaxToken); return default(SyntaxToken);
} }
} }
} }
\ No newline at end of file
...@@ -44,8 +44,6 @@ internal SyntaxNode(GreenNode green, int position, SyntaxTree syntaxTree) ...@@ -44,8 +44,6 @@ internal SyntaxNode(GreenNode green, int position, SyntaxTree syntaxTree)
this._syntaxTree = syntaxTree; this._syntaxTree = syntaxTree;
} }
internal abstract AbstractSyntaxNavigator Navigator { get; }
private string GetDebuggerDisplay() private string GetDebuggerDisplay()
{ {
return GetType().Name + " " + KindText + " " + ToString(); return GetType().Name + " " + KindText + " " + ToString();
...@@ -822,7 +820,7 @@ public SyntaxToken FindToken(int position, bool findInsideTrivia = false) ...@@ -822,7 +820,7 @@ public SyntaxToken FindToken(int position, bool findInsideTrivia = false)
/// <returns>The first token or <c>default(SyntaxToken)</c> if it doesn't exist.</returns> /// <returns>The first token or <c>default(SyntaxToken)</c> if it doesn't exist.</returns>
public SyntaxToken GetFirstToken(bool includeZeroWidth = false, bool includeSkipped = false, bool includeDirectives = false, bool includeDocumentationComments = false) public SyntaxToken GetFirstToken(bool includeZeroWidth = false, bool includeSkipped = false, bool includeDirectives = false, bool includeDocumentationComments = false)
{ {
return this.Navigator.GetFirstToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments); return SyntaxNavigator.Instance.GetFirstToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments);
} }
/// <summary> /// <summary>
...@@ -831,7 +829,7 @@ public SyntaxToken GetFirstToken(bool includeZeroWidth = false, bool includeSkip ...@@ -831,7 +829,7 @@ public SyntaxToken GetFirstToken(bool includeZeroWidth = false, bool includeSkip
/// <returns>The last token or <c>default(SyntaxToken)</c> if it doesn't exist.</returns> /// <returns>The last token or <c>default(SyntaxToken)</c> if it doesn't exist.</returns>
public SyntaxToken GetLastToken(bool includeZeroWidth = false, bool includeSkipped = false, bool includeDirectives = false, bool includeDocumentationComments = false) public SyntaxToken GetLastToken(bool includeZeroWidth = false, bool includeSkipped = false, bool includeDirectives = false, bool includeDocumentationComments = false)
{ {
return this.Navigator.GetLastToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments); return SyntaxNavigator.Instance.GetLastToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments);
} }
/// <summary> /// <summary>
......
...@@ -578,7 +578,7 @@ public SyntaxToken GetNextToken(bool includeZeroWidth = false, bool includeSkipp ...@@ -578,7 +578,7 @@ public SyntaxToken GetNextToken(bool includeZeroWidth = false, bool includeSkipp
return default(SyntaxToken); return default(SyntaxToken);
} }
return Node.Navigator.GetNextToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments); return SyntaxNavigator.Instance.GetNextToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments);
} }
/// <summary> /// <summary>
...@@ -595,7 +595,7 @@ internal SyntaxToken GetNextToken(Func<SyntaxToken, bool> predicate, Func<Syntax ...@@ -595,7 +595,7 @@ internal SyntaxToken GetNextToken(Func<SyntaxToken, bool> predicate, Func<Syntax
return default(SyntaxToken); return default(SyntaxToken);
} }
return Node.Navigator.GetNextToken(this, predicate, stepInto); return SyntaxNavigator.Instance.GetNextToken(this, predicate, stepInto);
} }
/// <summary> /// <summary>
...@@ -609,7 +609,7 @@ public SyntaxToken GetPreviousToken(bool includeZeroWidth = false, bool includeS ...@@ -609,7 +609,7 @@ public SyntaxToken GetPreviousToken(bool includeZeroWidth = false, bool includeS
return default(SyntaxToken); return default(SyntaxToken);
} }
return Node.Navigator.GetPreviousToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments); return SyntaxNavigator.Instance.GetPreviousToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments);
} }
/// <summary> /// <summary>
...@@ -621,7 +621,7 @@ public SyntaxToken GetPreviousToken(bool includeZeroWidth = false, bool includeS ...@@ -621,7 +621,7 @@ public SyntaxToken GetPreviousToken(bool includeZeroWidth = false, bool includeS
/// included in the search.</param> /// included in the search.</param>
internal SyntaxToken GetPreviousToken(Func<SyntaxToken, bool> predicate, Func<SyntaxTrivia, bool> stepInto = null) internal SyntaxToken GetPreviousToken(Func<SyntaxToken, bool> predicate, Func<SyntaxTrivia, bool> stepInto = null)
{ {
return Node.Navigator.GetPreviousToken(this, predicate, stepInto); return SyntaxNavigator.Instance.GetPreviousToken(this, predicate, stepInto);
} }
/// <summary> /// <summary>
......
...@@ -184,6 +184,9 @@ public IEnumerable<SyntaxAnnotation> GetAnnotations(params string[] annotationKi ...@@ -184,6 +184,9 @@ public IEnumerable<SyntaxAnnotation> GetAnnotations(params string[] annotationKi
/// </summary> /// </summary>
public bool IsDirective => UnderlyingNode?.IsDirective ?? false; public bool IsDirective => UnderlyingNode?.IsDirective ?? false;
internal bool IsSkippedTokensTrivia => UnderlyingNode?.IsSkippedTokensTrivia ?? false;
internal bool IsDocumentationCommentTrivia => UnderlyingNode?.IsDocumentationCommentTrivia ?? false;
/// <summary> /// <summary>
/// Returns the child non-terminal node representing the syntax tree structure under this structured trivia. /// Returns the child non-terminal node representing the syntax tree structure under this structured trivia.
/// </summary> /// </summary>
......
...@@ -902,7 +902,6 @@ ...@@ -902,7 +902,6 @@
<Compile Include="Syntax\SyntaxList.WithThreeChildren.vb" /> <Compile Include="Syntax\SyntaxList.WithThreeChildren.vb" />
<Compile Include="Syntax\SyntaxList.WithTwoChildren.vb" /> <Compile Include="Syntax\SyntaxList.WithTwoChildren.vb" />
<Compile Include="Syntax\SyntaxListBuilder.vb" /> <Compile Include="Syntax\SyntaxListBuilder.vb" />
<Compile Include="Syntax\SyntaxNavigator.vb" />
<Compile Include="Syntax\SyntaxNodeExtensions.vb" /> <Compile Include="Syntax\SyntaxNodeExtensions.vb" />
<Compile Include="Syntax\SyntaxNodeFactories.vb" /> <Compile Include="Syntax\SyntaxNodeFactories.vb" />
<Compile Include="Syntax\SyntaxNodeOrTokenListBuilder.vb" /> <Compile Include="Syntax\SyntaxNodeOrTokenListBuilder.vb" />
...@@ -1016,4 +1015,4 @@ ...@@ -1016,4 +1015,4 @@
<ImportGroup Label="Targets"> <ImportGroup Label="Targets">
<Import Project="..\..\..\..\build\Targets\VSL.Imports.targets" /> <Import Project="..\..\..\..\build\Targets\VSL.Imports.targets" />
</ImportGroup> </ImportGroup>
</Project> </Project>
\ No newline at end of file
...@@ -180,6 +180,18 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax ...@@ -180,6 +180,18 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax
End Get End Get
End Property End Property
Public Overrides ReadOnly Property IsSkippedTokensTrivia As Boolean
Get
Return Me.Kind = SyntaxKind.SkippedTokensTrivia
End Get
End Property
Public Overrides ReadOnly Property IsDocumentationCommentTrivia As Boolean
Get
Return Me.Kind = SyntaxKind.DocumentationCommentTrivia
End Get
End Property
Protected Overrides Function GetSlotCount() As Integer Protected Overrides Function GetSlotCount() As Integer
Throw ExceptionUtilities.Unreachable Throw ExceptionUtilities.Unreachable
End Function End Function
...@@ -439,12 +451,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax ...@@ -439,12 +451,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax
Return [structure] Return [structure]
End Function End Function
Public Overrides ReadOnly Property Navigator As AbstractSyntaxNavigator
Get
Return SyntaxNavigator.Instance
End Get
End Property
Public Overrides Function CreateList(nodes As IEnumerable(Of GreenNode), Optional alwaysCreateListNode As Boolean = False) As GreenNode Public Overrides Function CreateList(nodes As IEnumerable(Of GreenNode), Optional alwaysCreateListNode As Boolean = False) As GreenNode
If nodes Is Nothing Then If nodes Is Nothing Then
Return Nothing Return Nothing
......
' 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
Friend Class SyntaxNavigator
Inherits AbstractSyntaxNavigator
<Flags()>
Private Enum SyntaxKinds
DocComments = 1
Directives = 2
SkippedTokens = 4
End Enum
Public Shared ReadOnly Instance As AbstractSyntaxNavigator = New SyntaxNavigator()
Private ReadOnly _stepIntoFunctions As Func(Of SyntaxTrivia, Boolean)() = New Func(Of SyntaxTrivia, Boolean)() {
Nothing,
Function(t) t.RawKind = SyntaxKind.DocumentationCommentTrivia,
Function(t) t.IsDirective,
Function(t) t.IsDirective OrElse t.RawKind = SyntaxKind.DocumentationCommentTrivia,
Function(t) t.RawKind = SyntaxKind.SkippedTokensTrivia,
Function(t) t.RawKind = SyntaxKind.SkippedTokensTrivia OrElse t.RawKind = SyntaxKind.DocumentationCommentTrivia,
Function(t) t.RawKind = SyntaxKind.SkippedTokensTrivia OrElse t.IsDirective,
Function(t) t.RawKind = SyntaxKind.SkippedTokensTrivia OrElse t.IsDirective OrElse t.RawKind = SyntaxKind.DocumentationCommentTrivia
}
Protected Overrides Function GetStepIntoFunction(skipped As Boolean, directives As Boolean, docComments As Boolean) As Func(Of SyntaxTrivia, Boolean)
Dim index = If(skipped, SyntaxKinds.SkippedTokens, 0) Or If(directives, SyntaxKinds.Directives, 0) Or If(docComments, SyntaxKinds.DocComments, 0)
Return _stepIntoFunctions(index)
End Function
End Class
End Namespace
...@@ -31,12 +31,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ...@@ -31,12 +31,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
_syntaxTree = syntaxTree _syntaxTree = syntaxTree
End Sub End Sub
Friend Overrides ReadOnly Property Navigator As AbstractSyntaxNavigator
Get
Return SyntaxNavigator.Instance
End Get
End Property
'TODO: may be eventually not needed 'TODO: may be eventually not needed
Friend ReadOnly Property VbGreen As InternalSyntax.VisualBasicSyntaxNode Friend ReadOnly Property VbGreen As InternalSyntax.VisualBasicSyntaxNode
Get Get
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<ProjectGuid>cd77a8cc-2885-47a7-b99c-fbf13353400b</ProjectGuid> <ProjectGuid>c1930979-c824-496b-a630-70f5369a636f</ProjectGuid>
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion> <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册