提交 baf44ce0 编写于 作者: C CyrusNajmabadi

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

上级 8eafb6f4
......@@ -843,7 +843,6 @@
<Compile Include="Syntax\SyntaxListBuilder.cs" />
<Compile Include="Syntax\SyntaxListBuilder`1.cs" />
<Compile Include="Syntax\SyntaxListBuilderExtensions.cs" />
<Compile Include="Syntax\SyntaxNavigator.cs" />
<Compile Include="Syntax\SyntaxNodeExtensions.cs" />
<Compile Include="Syntax\SyntaxFacts.cs" />
<Compile Include="Syntax\SyntaxNodeOrTokenListBuilder.cs" />
......@@ -925,4 +924,4 @@
<ImportGroup Label="Targets">
<Import Project="..\..\..\..\build\Targets\VSL.Imports.targets" />
</ImportGroup>
</Project>
</Project>
\ No newline at end of file
......@@ -37,14 +37,6 @@ internal CSharpSyntaxNode(GreenNode green, int position, SyntaxTree syntaxTree)
{
}
internal override AbstractSyntaxNavigator Navigator
{
get
{
return SyntaxNavigator.Instance;
}
}
//TODO: move to common
/// <summary>
/// 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
}
}
public override bool IsSkippedTokensTrivia => this.Kind == SyntaxKind.SkippedTokensTrivia;
public override bool IsDocumentationCommentTrivia => SyntaxFacts.IsDocumentationCommentTrivia(this.Kind);
public override int GetSlotOffset(int index)
{
// This implementation should not support arbitrary
......@@ -298,14 +301,6 @@ internal static NodeFlags SetFactoryContext(NodeFlags flags, SyntaxFactoryContex
return flags;
}
public override AbstractSyntaxNavigator Navigator
{
get
{
return SyntaxNavigator.Instance;
}
}
public override GreenNode CreateList(IEnumerable<GreenNode> nodes, bool alwaysCreateListNode)
{
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 @@
<Compile Include="Symbols\TypeParameterKind.cs" />
<Compile Include="Symbols\VarianceKind.cs" />
<Compile Include="Symbols\WellKnownMemberNames.cs" />
<Compile Include="Syntax\AbstractSyntaxNavigator.cs" />
<Compile Include="Syntax\SyntaxNavigator.cs" />
<Compile Include="Syntax\AbstractWarningStateMap.cs" />
<Compile Include="Syntax\AnnotationExtensions.cs" />
<Compile Include="Syntax\ChildSyntaxList.cs" />
......
......@@ -120,9 +120,12 @@ public bool IsList
}
public abstract string KindText { get; }
public virtual bool IsStructuredTrivia { get { return false; } }
public virtual bool IsDirective { get { return false; } }
public virtual bool IsToken { get { return false; } }
public virtual bool IsStructuredTrivia => false;
public virtual bool IsDirective => false;
public virtual bool IsToken => false;
public virtual bool IsSkippedTokensTrivia => false;
public virtual bool IsDocumentationCommentTrivia => false;
#endregion
......@@ -598,12 +601,12 @@ protected internal virtual void WriteTo(System.IO.TextWriter writer, bool leadin
#endregion
#region Tokens
public virtual int RawContextualKind { get { return this.RawKind; } }
public virtual object GetValue() { return null; }
public virtual string GetValueText() { return string.Empty; }
public virtual GreenNode GetLeadingTriviaCore() { return null; }
public virtual GreenNode GetTrailingTriviaCore() { return null; }
public abstract AbstractSyntaxNavigator Navigator { get; }
public virtual GreenNode WithLeadingTrivia(GreenNode trivia)
{
......
......@@ -7,11 +7,39 @@
namespace Microsoft.CodeAnalysis
{
internal abstract class AbstractSyntaxNavigator
internal class SyntaxNavigator
{
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)
{
......@@ -594,4 +622,4 @@ internal SyntaxToken GetNextToken(SyntaxToken current, Func<SyntaxToken, bool> p
return default(SyntaxToken);
}
}
}
}
\ No newline at end of file
......@@ -44,8 +44,6 @@ internal SyntaxNode(GreenNode green, int position, SyntaxTree syntaxTree)
this._syntaxTree = syntaxTree;
}
internal abstract AbstractSyntaxNavigator Navigator { get; }
private string GetDebuggerDisplay()
{
return GetType().Name + " " + KindText + " " + ToString();
......@@ -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>
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>
......@@ -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>
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>
......
......@@ -578,7 +578,7 @@ public SyntaxToken GetNextToken(bool includeZeroWidth = false, bool includeSkipp
return default(SyntaxToken);
}
return Node.Navigator.GetNextToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments);
return SyntaxNavigator.Instance.GetNextToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments);
}
/// <summary>
......@@ -595,7 +595,7 @@ internal SyntaxToken GetNextToken(Func<SyntaxToken, bool> predicate, Func<Syntax
return default(SyntaxToken);
}
return Node.Navigator.GetNextToken(this, predicate, stepInto);
return SyntaxNavigator.Instance.GetNextToken(this, predicate, stepInto);
}
/// <summary>
......@@ -609,7 +609,7 @@ public SyntaxToken GetPreviousToken(bool includeZeroWidth = false, bool includeS
return default(SyntaxToken);
}
return Node.Navigator.GetPreviousToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments);
return SyntaxNavigator.Instance.GetPreviousToken(this, includeZeroWidth, includeSkipped, includeDirectives, includeDocumentationComments);
}
/// <summary>
......@@ -621,7 +621,7 @@ public SyntaxToken GetPreviousToken(bool includeZeroWidth = false, bool includeS
/// included in the search.</param>
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>
......
......@@ -184,6 +184,9 @@ public IEnumerable<SyntaxAnnotation> GetAnnotations(params string[] annotationKi
/// </summary>
public bool IsDirective => UnderlyingNode?.IsDirective ?? false;
internal bool IsSkippedTokensTrivia => UnderlyingNode?.IsSkippedTokensTrivia ?? false;
internal bool IsDocumentationCommentTrivia => UnderlyingNode?.IsDocumentationCommentTrivia ?? false;
/// <summary>
/// Returns the child non-terminal node representing the syntax tree structure under this structured trivia.
/// </summary>
......
......@@ -902,7 +902,6 @@
<Compile Include="Syntax\SyntaxList.WithThreeChildren.vb" />
<Compile Include="Syntax\SyntaxList.WithTwoChildren.vb" />
<Compile Include="Syntax\SyntaxListBuilder.vb" />
<Compile Include="Syntax\SyntaxNavigator.vb" />
<Compile Include="Syntax\SyntaxNodeExtensions.vb" />
<Compile Include="Syntax\SyntaxNodeFactories.vb" />
<Compile Include="Syntax\SyntaxNodeOrTokenListBuilder.vb" />
......@@ -1016,4 +1015,4 @@
<ImportGroup Label="Targets">
<Import Project="..\..\..\..\build\Targets\VSL.Imports.targets" />
</ImportGroup>
</Project>
</Project>
\ No newline at end of file
......@@ -180,6 +180,18 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax
End Get
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
Throw ExceptionUtilities.Unreachable
End Function
......@@ -439,12 +451,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax
Return [structure]
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
If nodes Is Nothing Then
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
_syntaxTree = syntaxTree
End Sub
Friend Overrides ReadOnly Property Navigator As AbstractSyntaxNavigator
Get
Return SyntaxNavigator.Instance
End Get
End Property
'TODO: may be eventually not needed
Friend ReadOnly Property VbGreen As InternalSyntax.VisualBasicSyntaxNode
Get
......
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals">
<ProjectGuid>cd77a8cc-2885-47a7-b99c-fbf13353400b</ProjectGuid>
<ProjectGuid>c1930979-c824-496b-a630-70f5369a636f</ProjectGuid>
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
</PropertyGroup>
<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.
先完成此消息的编辑!
想要评论请 注册