提交 750e1eb7 编写于 作者: M Manish Vasani

Move certain syntax generator internal methods down to shared layer

上级 74c510f2
...@@ -12,6 +12,6 @@ namespace Microsoft.CodeAnalysis.CodeStyle ...@@ -12,6 +12,6 @@ namespace Microsoft.CodeAnalysis.CodeStyle
internal class CSharpFormattingAnalyzer : AbstractFormattingAnalyzer internal class CSharpFormattingAnalyzer : AbstractFormattingAnalyzer
{ {
protected override ISyntaxFormattingService SyntaxFormattingService protected override ISyntaxFormattingService SyntaxFormattingService
=> new CSharpSyntaxFormattingService(); => CSharpSyntaxFormattingService.Instance;
} }
} }
...@@ -21,6 +21,6 @@ public CSharpFormattingCodeFixProvider() ...@@ -21,6 +21,6 @@ public CSharpFormattingCodeFixProvider()
{ {
} }
protected override ISyntaxFormattingService SyntaxFormattingService => new CSharpSyntaxFormattingService(); protected override ISyntaxFormattingService SyntaxFormattingService => CSharpSyntaxFormattingService.Instance;
} }
} }
...@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.CodeStyle ...@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.CodeStyle
Protected Overrides ReadOnly Property SyntaxFormattingService As ISyntaxFormattingService Protected Overrides ReadOnly Property SyntaxFormattingService As ISyntaxFormattingService
Get Get
Return New VisualBasicSyntaxFormattingService() Return VisualBasicSyntaxFormattingService.Instance
End Get End Get
End Property End Property
End Class End Class
......
...@@ -21,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.CodeStyle ...@@ -21,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.CodeStyle
Protected Overrides ReadOnly Property SyntaxFormattingService As ISyntaxFormattingService Protected Overrides ReadOnly Property SyntaxFormattingService As ISyntaxFormattingService
Get Get
Return New VisualBasicSyntaxFormattingService() Return VisualBasicSyntaxFormattingService.Instance
End Get End Get
End Property End Property
End Class End Class
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing; using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Simplification;
...@@ -43,8 +42,6 @@ public CSharpSyntaxGenerator() ...@@ -43,8 +42,6 @@ public CSharpSyntaxGenerator()
internal override bool RequiresExplicitImplementationForInterfaceMembers => false; internal override bool RequiresExplicitImplementationForInterfaceMembers => false;
internal override ISyntaxFacts SyntaxFacts => CSharpSyntaxFacts.Instance;
internal override SyntaxGeneratorInternal SyntaxGeneratorInternal => CSharpSyntaxGeneratorInternal.Instance; internal override SyntaxGeneratorInternal SyntaxGeneratorInternal => CSharpSyntaxGeneratorInternal.Instance;
internal override SyntaxTrivia EndOfLine(string text) internal override SyntaxTrivia EndOfLine(string text)
...@@ -2940,9 +2937,6 @@ public override SyntaxNode NameOfExpression(SyntaxNode expression) ...@@ -2940,9 +2937,6 @@ public override SyntaxNode NameOfExpression(SyntaxNode expression)
public override SyntaxNode ReturnStatement(SyntaxNode expressionOpt = null) public override SyntaxNode ReturnStatement(SyntaxNode expressionOpt = null)
=> SyntaxFactory.ReturnStatement((ExpressionSyntax)expressionOpt); => SyntaxFactory.ReturnStatement((ExpressionSyntax)expressionOpt);
internal override SyntaxNode YieldReturnStatement(SyntaxNode expressionOpt = null)
=> SyntaxFactory.YieldStatement(SyntaxKind.YieldReturnStatement, (ExpressionSyntax)expressionOpt);
public override SyntaxNode ThrowStatement(SyntaxNode expressionOpt = null) public override SyntaxNode ThrowStatement(SyntaxNode expressionOpt = null)
=> SyntaxFactory.ThrowStatement((ExpressionSyntax)expressionOpt); => SyntaxFactory.ThrowStatement((ExpressionSyntax)expressionOpt);
...@@ -3134,11 +3128,8 @@ public override SyntaxNode DefaultExpression(ITypeSymbol type) ...@@ -3134,11 +3128,8 @@ public override SyntaxNode DefaultExpression(ITypeSymbol type)
return DefaultExpression(type.GenerateTypeSyntax()); return DefaultExpression(type.GenerateTypeSyntax());
} }
internal override SyntaxNode AddParentheses(SyntaxNode expression, bool includeElasticTrivia = true, bool addSimplifierAnnotation = true)
=> Parenthesize(expression, includeElasticTrivia, addSimplifierAnnotation);
private static ExpressionSyntax Parenthesize(SyntaxNode expression, bool includeElasticTrivia = true, bool addSimplifierAnnotation = true) private static ExpressionSyntax Parenthesize(SyntaxNode expression, bool includeElasticTrivia = true, bool addSimplifierAnnotation = true)
=> ((ExpressionSyntax)expression).Parenthesize(includeElasticTrivia, addSimplifierAnnotation); => CSharpSyntaxGeneratorInternal.Parenthesize(expression, includeElasticTrivia, addSimplifierAnnotation);
public override SyntaxNode IsTypeExpression(SyntaxNode expression, SyntaxNode type) public override SyntaxNode IsTypeExpression(SyntaxNode expression, SyntaxNode type)
=> SyntaxFactory.BinaryExpression(SyntaxKind.IsExpression, Parenthesize(expression), (TypeSyntax)type); => SyntaxFactory.BinaryExpression(SyntaxKind.IsExpression, Parenthesize(expression), (TypeSyntax)type);
...@@ -3479,9 +3470,6 @@ internal override SyntaxNode NamedAnonymousObjectMemberDeclarator(SyntaxNode ide ...@@ -3479,9 +3470,6 @@ internal override SyntaxNode NamedAnonymousObjectMemberDeclarator(SyntaxNode ide
(ExpressionSyntax)expression); (ExpressionSyntax)expression);
} }
internal override SyntaxNode RefExpression(SyntaxNode expression)
=> SyntaxFactory.RefExpression((ExpressionSyntax)expression);
public override SyntaxNode TupleExpression(IEnumerable<SyntaxNode> arguments) public override SyntaxNode TupleExpression(IEnumerable<SyntaxNode> arguments)
=> SyntaxFactory.TupleExpression(SyntaxFactory.SeparatedList(arguments.Select(AsArgument))); => SyntaxFactory.TupleExpression(SyntaxFactory.SeparatedList(arguments.Select(AsArgument)));
......
...@@ -36,7 +36,7 @@ public abstract class SyntaxGenerator : ILanguageService ...@@ -36,7 +36,7 @@ public abstract class SyntaxGenerator : ILanguageService
internal abstract SyntaxTrivia CarriageReturnLineFeed { get; } internal abstract SyntaxTrivia CarriageReturnLineFeed { get; }
internal abstract SyntaxTrivia ElasticCarriageReturnLineFeed { get; } internal abstract SyntaxTrivia ElasticCarriageReturnLineFeed { get; }
internal abstract bool RequiresExplicitImplementationForInterfaceMembers { get; } internal abstract bool RequiresExplicitImplementationForInterfaceMembers { get; }
internal abstract ISyntaxFacts SyntaxFacts { get; } internal ISyntaxFacts SyntaxFacts => SyntaxGeneratorInternal.SyntaxFacts;
internal abstract SyntaxGeneratorInternal SyntaxGeneratorInternal { get; } internal abstract SyntaxGeneratorInternal SyntaxGeneratorInternal { get; }
internal abstract SyntaxTrivia EndOfLine(string text); internal abstract SyntaxTrivia EndOfLine(string text);
...@@ -1353,7 +1353,8 @@ protected static SyntaxList<TNode> RemoveRange<TNode>(SyntaxList<TNode> list, in ...@@ -1353,7 +1353,8 @@ protected static SyntaxList<TNode> RemoveRange<TNode>(SyntaxList<TNode> list, in
/// Creates a statement that can be used to yield a value from an iterator method. /// Creates a statement that can be used to yield a value from an iterator method.
/// </summary> /// </summary>
/// <param name="expression">An expression that can be yielded.</param> /// <param name="expression">An expression that can be yielded.</param>
internal abstract SyntaxNode YieldReturnStatement(SyntaxNode expression); internal SyntaxNode YieldReturnStatement(SyntaxNode expression)
=> SyntaxGeneratorInternal.YieldReturnStatement(expression);
/// <summary> /// <summary>
/// Creates a statement that can be used to throw an exception. /// Creates a statement that can be used to throw an exception.
...@@ -1924,7 +1925,8 @@ public virtual SyntaxNode MemberAccessExpression(SyntaxNode expression, SyntaxNo ...@@ -1924,7 +1925,8 @@ public virtual SyntaxNode MemberAccessExpression(SyntaxNode expression, SyntaxNo
internal abstract SyntaxNode MemberAccessExpressionWorker(SyntaxNode expression, SyntaxNode memberName); internal abstract SyntaxNode MemberAccessExpressionWorker(SyntaxNode expression, SyntaxNode memberName);
internal abstract SyntaxNode RefExpression(SyntaxNode expression); internal SyntaxNode RefExpression(SyntaxNode expression)
=> SyntaxGeneratorInternal.RefExpression(expression);
/// <summary> /// <summary>
/// Creates a member access expression. /// Creates a member access expression.
...@@ -2140,7 +2142,8 @@ public SyntaxNode LambdaParameter(string identifier, ITypeSymbol type) ...@@ -2140,7 +2142,8 @@ public SyntaxNode LambdaParameter(string identifier, ITypeSymbol type)
/// <summary> /// <summary>
/// Wraps with parens. /// Wraps with parens.
/// </summary> /// </summary>
internal abstract SyntaxNode AddParentheses(SyntaxNode expression, bool includeElasticTrivia = true, bool addSimplifierAnnotation = true); internal SyntaxNode AddParentheses(SyntaxNode expression, bool includeElasticTrivia = true, bool addSimplifierAnnotation = true)
=> SyntaxGeneratorInternal.AddParentheses(expression, includeElasticTrivia, addSimplifierAnnotation);
/// <summary> /// <summary>
/// Creates an nameof expression. /// Creates an nameof expression.
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities; using Roslyn.Utilities;
using static Microsoft.CodeAnalysis.Formatting.FormattingExtensions;
namespace Microsoft.CodeAnalysis.Formatting namespace Microsoft.CodeAnalysis.Formatting
{ {
...@@ -298,73 +299,6 @@ internal static IList<TextChange> GetFormattedTextChanges(SyntaxNode node, IEnum ...@@ -298,73 +299,6 @@ internal static IList<TextChange> GetFormattedTextChanges(SyntaxNode node, IEnum
: formattingResult.GetTextChanges(cancellationToken); : formattingResult.GetTextChanges(cancellationToken);
} }
private static IEnumerable<TextSpan> GetAnnotatedSpans(SyntaxNode node, SyntaxAnnotation annotation)
{
foreach (var nodeOrToken in node.GetAnnotatedNodesAndTokens(annotation))
{
var firstToken = nodeOrToken.IsNode ? nodeOrToken.AsNode().GetFirstToken(includeZeroWidth: true) : nodeOrToken.AsToken();
var lastToken = nodeOrToken.IsNode ? nodeOrToken.AsNode().GetLastToken(includeZeroWidth: true) : nodeOrToken.AsToken();
yield return GetSpan(firstToken, lastToken);
}
}
private static TextSpan GetSpan(SyntaxToken firstToken, SyntaxToken lastToken)
{
var previousToken = firstToken.GetPreviousToken();
var nextToken = lastToken.GetNextToken();
if (previousToken.RawKind != 0)
{
firstToken = previousToken;
}
if (nextToken.RawKind != 0)
{
lastToken = nextToken;
}
return TextSpan.FromBounds(firstToken.SpanStart, lastToken.Span.End);
}
private static IEnumerable<TextSpan> GetElasticSpans(SyntaxNode root)
{
var tokens = root.GetAnnotatedTrivia(SyntaxAnnotation.ElasticAnnotation).Select(tr => tr.Token).Distinct();
return AggregateSpans(tokens.Select(t => GetElasticSpan(t)));
}
private static TextSpan GetElasticSpan(SyntaxToken token)
=> GetSpan(token, token);
private static IEnumerable<TextSpan> AggregateSpans(IEnumerable<TextSpan> spans)
{
var aggregateSpans = new List<TextSpan>();
var last = default(TextSpan);
foreach (var span in spans)
{
if (last == default)
{
last = span;
}
else if (span.IntersectsWith(last))
{
last = TextSpan.FromBounds(last.Start, span.End);
}
else
{
aggregateSpans.Add(last);
last = span;
}
}
if (last != default)
{
aggregateSpans.Add(last);
}
return aggregateSpans;
}
/// <summary> /// <summary>
/// Organizes the imports in the document. /// Organizes the imports in the document.
/// </summary> /// </summary>
......
...@@ -26,7 +26,10 @@ internal class CSharpSyntaxFormattingService : AbstractSyntaxFormattingService ...@@ -26,7 +26,10 @@ internal class CSharpSyntaxFormattingService : AbstractSyntaxFormattingService
{ {
private readonly ImmutableList<AbstractFormattingRule> _rules; private readonly ImmutableList<AbstractFormattingRule> _rules;
#if !CODE_STYLE #if CODE_STYLE
public static readonly CSharpSyntaxFormattingService Instance = new CSharpSyntaxFormattingService();
#else
[ImportingConstructor] [ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
#endif #endif
......
...@@ -279,5 +279,72 @@ public static TextChange SimpleDiff(this TextChange textChange, string text) ...@@ -279,5 +279,72 @@ public static TextChange SimpleDiff(this TextChange textChange, string text)
return new TextChange(span, newText); return new TextChange(span, newText);
} }
internal static IEnumerable<TextSpan> GetAnnotatedSpans(SyntaxNode node, SyntaxAnnotation annotation)
{
foreach (var nodeOrToken in node.GetAnnotatedNodesAndTokens(annotation))
{
var firstToken = nodeOrToken.IsNode ? nodeOrToken.AsNode().GetFirstToken(includeZeroWidth: true) : nodeOrToken.AsToken();
var lastToken = nodeOrToken.IsNode ? nodeOrToken.AsNode().GetLastToken(includeZeroWidth: true) : nodeOrToken.AsToken();
yield return GetSpan(firstToken, lastToken);
}
}
internal static TextSpan GetSpan(SyntaxToken firstToken, SyntaxToken lastToken)
{
var previousToken = firstToken.GetPreviousToken();
var nextToken = lastToken.GetNextToken();
if (previousToken.RawKind != 0)
{
firstToken = previousToken;
}
if (nextToken.RawKind != 0)
{
lastToken = nextToken;
}
return TextSpan.FromBounds(firstToken.SpanStart, lastToken.Span.End);
}
internal static IEnumerable<TextSpan> GetElasticSpans(SyntaxNode root)
{
var tokens = root.GetAnnotatedTrivia(SyntaxAnnotation.ElasticAnnotation).Select(tr => tr.Token).Distinct();
return AggregateSpans(tokens.Select(t => GetElasticSpan(t)));
}
internal static TextSpan GetElasticSpan(SyntaxToken token)
=> GetSpan(token, token);
private static IEnumerable<TextSpan> AggregateSpans(IEnumerable<TextSpan> spans)
{
var aggregateSpans = new List<TextSpan>();
var last = default(TextSpan);
foreach (var span in spans)
{
if (last == default)
{
last = span;
}
else if (span.IntersectsWith(last))
{
last = TextSpan.FromBounds(last.Start, span.End);
}
else
{
aggregateSpans.Add(last);
last = span;
}
}
if (last != default)
{
aggregateSpans.Add(last);
}
return aggregateSpans;
}
} }
} }
...@@ -4,9 +4,12 @@ ...@@ -4,9 +4,12 @@
using System.Composition; using System.Composition;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.LanguageServices;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing; using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageServices;
namespace Microsoft.CodeAnalysis.CSharp.CodeGeneration namespace Microsoft.CodeAnalysis.CSharp.CodeGeneration
{ {
...@@ -21,6 +24,8 @@ public CSharpSyntaxGeneratorInternal() ...@@ -21,6 +24,8 @@ public CSharpSyntaxGeneratorInternal()
public static readonly SyntaxGeneratorInternal Instance = new CSharpSyntaxGeneratorInternal(); public static readonly SyntaxGeneratorInternal Instance = new CSharpSyntaxGeneratorInternal();
internal override ISyntaxFacts SyntaxFacts => CSharpSyntaxFacts.Instance;
internal override SyntaxNode LocalDeclarationStatement(SyntaxNode type, SyntaxToken name, SyntaxNode initializer, bool isConst) internal override SyntaxNode LocalDeclarationStatement(SyntaxNode type, SyntaxToken name, SyntaxNode initializer, bool isConst)
{ {
return SyntaxFactory.LocalDeclarationStatement( return SyntaxFactory.LocalDeclarationStatement(
...@@ -52,5 +57,21 @@ internal override SyntaxNode ConditionalAccessExpression(SyntaxNode expression, ...@@ -52,5 +57,21 @@ internal override SyntaxNode ConditionalAccessExpression(SyntaxNode expression,
internal override SyntaxNode MemberBindingExpression(SyntaxNode name) internal override SyntaxNode MemberBindingExpression(SyntaxNode name)
=> SyntaxFactory.MemberBindingExpression((SimpleNameSyntax)name); => SyntaxFactory.MemberBindingExpression((SimpleNameSyntax)name);
internal override SyntaxNode RefExpression(SyntaxNode expression)
=> SyntaxFactory.RefExpression((ExpressionSyntax)expression);
internal override SyntaxNode AddParentheses(SyntaxNode expression, bool includeElasticTrivia = true, bool addSimplifierAnnotation = true)
{
return Parenthesize(expression, includeElasticTrivia, addSimplifierAnnotation);
}
internal static ExpressionSyntax Parenthesize(SyntaxNode expression, bool includeElasticTrivia = true, bool addSimplifierAnnotation = true)
{
return ((ExpressionSyntax)expression).Parenthesize(includeElasticTrivia, addSimplifierAnnotation);
}
internal override SyntaxNode YieldReturnStatement(SyntaxNode expressionOpt = null)
=> SyntaxFactory.YieldStatement(SyntaxKind.YieldReturnStatement, (ExpressionSyntax)expressionOpt);
} }
} }
...@@ -33,25 +33,28 @@ internal static partial class SyntaxGeneratorExtensions ...@@ -33,25 +33,28 @@ internal static partial class SyntaxGeneratorExtensions
public static SyntaxNode Negate( public static SyntaxNode Negate(
this SyntaxGenerator generator, this SyntaxGenerator generator,
SyntaxGeneratorInternal generatorInternal,
SyntaxNode expression, SyntaxNode expression,
SemanticModel semanticModel, SemanticModel semanticModel,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
return Negate(generator, expression, semanticModel, negateBinary: true, cancellationToken); return Negate(generator, generatorInternal, expression, semanticModel, negateBinary: true, cancellationToken);
} }
public static SyntaxNode Negate( public static SyntaxNode Negate(
this SyntaxGenerator generator, this SyntaxGenerator generator,
SyntaxGeneratorInternal generatorInternal,
SyntaxNode expression, SyntaxNode expression,
SemanticModel semanticModel, SemanticModel semanticModel,
bool negateBinary, bool negateBinary,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var syntaxFacts = generator.SyntaxFacts; var syntaxFacts = generatorInternal.SyntaxFacts;
if (syntaxFacts.IsParenthesizedExpression(expression)) if (syntaxFacts.IsParenthesizedExpression(expression))
{ {
return generator.AddParentheses( return generatorInternal.AddParentheses(
generator.Negate( generator.Negate(
generatorInternal,
syntaxFacts.GetExpressionOfParenthesizedExpression(expression), syntaxFacts.GetExpressionOfParenthesizedExpression(expression),
semanticModel, semanticModel,
negateBinary, negateBinary,
...@@ -60,7 +63,7 @@ internal static partial class SyntaxGeneratorExtensions ...@@ -60,7 +63,7 @@ internal static partial class SyntaxGeneratorExtensions
} }
if (negateBinary && syntaxFacts.IsBinaryExpression(expression)) if (negateBinary && syntaxFacts.IsBinaryExpression(expression))
{ {
return GetNegationOfBinaryExpression(expression, generator, semanticModel, cancellationToken); return GetNegationOfBinaryExpression(expression, generator, generatorInternal, semanticModel, cancellationToken);
} }
else if (syntaxFacts.IsLiteralExpression(expression)) else if (syntaxFacts.IsLiteralExpression(expression))
{ {
...@@ -77,10 +80,11 @@ internal static partial class SyntaxGeneratorExtensions ...@@ -77,10 +80,11 @@ internal static partial class SyntaxGeneratorExtensions
private static SyntaxNode GetNegationOfBinaryExpression( private static SyntaxNode GetNegationOfBinaryExpression(
SyntaxNode expressionNode, SyntaxNode expressionNode,
SyntaxGenerator generator, SyntaxGenerator generator,
SyntaxGeneratorInternal generatorInternal,
SemanticModel semanticModel, SemanticModel semanticModel,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var syntaxFacts = generator.SyntaxFacts; var syntaxFacts = generatorInternal.SyntaxFacts;
syntaxFacts.GetPartsOfBinaryExpression(expressionNode, out var leftOperand, out var operatorToken, out var rightOperand); syntaxFacts.GetPartsOfBinaryExpression(expressionNode, out var leftOperand, out var operatorToken, out var rightOperand);
var binaryOperation = semanticModel.GetOperation(expressionNode, cancellationToken) as IBinaryOperation; var binaryOperation = semanticModel.GetOperation(expressionNode, cancellationToken) as IBinaryOperation;
...@@ -122,8 +126,8 @@ internal static partial class SyntaxGeneratorExtensions ...@@ -122,8 +126,8 @@ internal static partial class SyntaxGeneratorExtensions
var newRightOperand = rightOperand; var newRightOperand = rightOperand;
if (negateOperands) if (negateOperands)
{ {
newLeftOperand = generator.Negate(leftOperand, semanticModel, cancellationToken); newLeftOperand = generator.Negate(generatorInternal, leftOperand, semanticModel, cancellationToken);
newRightOperand = generator.Negate(rightOperand, semanticModel, cancellationToken); newRightOperand = generator.Negate(generatorInternal, rightOperand, semanticModel, cancellationToken);
} }
var newBinaryExpressionSyntax = NewBinaryOperation(binaryOperation, newLeftOperand, negatedKind, newRightOperand, generator, cancellationToken) var newBinaryExpressionSyntax = NewBinaryOperation(binaryOperation, newLeftOperand, negatedKind, newRightOperand, generator, cancellationToken)
...@@ -135,7 +139,6 @@ internal static partial class SyntaxGeneratorExtensions ...@@ -135,7 +139,6 @@ internal static partial class SyntaxGeneratorExtensions
} }
} }
private static SyntaxNode NewBinaryOperation( private static SyntaxNode NewBinaryOperation(
IBinaryOperation binaryOperation, IBinaryOperation binaryOperation,
SyntaxNode leftOperand, SyntaxNode leftOperand,
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.LanguageServices;
namespace Microsoft.CodeAnalysis.Editing namespace Microsoft.CodeAnalysis.Editing
{ {
...@@ -15,6 +16,8 @@ namespace Microsoft.CodeAnalysis.Editing ...@@ -15,6 +16,8 @@ namespace Microsoft.CodeAnalysis.Editing
/// </summary> /// </summary>
internal abstract class SyntaxGeneratorInternal : ILanguageService internal abstract class SyntaxGeneratorInternal : ILanguageService
{ {
internal abstract ISyntaxFacts SyntaxFacts { get; }
/// <summary> /// <summary>
/// Creates a statement that declares a single local variable with an optional initializer. /// Creates a statement that declares a single local variable with an optional initializer.
/// </summary> /// </summary>
...@@ -36,5 +39,18 @@ internal SyntaxNode LocalDeclarationStatement(SyntaxToken name, SyntaxNode initi ...@@ -36,5 +39,18 @@ internal SyntaxNode LocalDeclarationStatement(SyntaxToken name, SyntaxNode initi
internal abstract SyntaxNode ConditionalAccessExpression(SyntaxNode expression, SyntaxNode whenNotNull); internal abstract SyntaxNode ConditionalAccessExpression(SyntaxNode expression, SyntaxNode whenNotNull);
internal abstract SyntaxNode MemberBindingExpression(SyntaxNode name); internal abstract SyntaxNode MemberBindingExpression(SyntaxNode name);
internal abstract SyntaxNode RefExpression(SyntaxNode expression);
/// <summary>
/// Wraps with parens.
/// </summary>
internal abstract SyntaxNode AddParentheses(SyntaxNode expression, bool includeElasticTrivia = true, bool addSimplifierAnnotation = true);
/// <summary>
/// Creates a statement that can be used to yield a value from an iterator method.
/// </summary>
/// <param name="expression">An expression that can be yielded.</param>
internal abstract SyntaxNode YieldReturnStatement(SyntaxNode expression);
} }
} }
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Extensions\ContextQuery\SyntaxContext.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Extensions\ContextQuery\SyntaxContext.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\HostWorkspaceServicesExtensions.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Extensions\HostWorkspaceServicesExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SyntaxGeneratorExtensions.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Extensions\SyntaxGeneratorExtensions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SyntaxGeneratorExtensions_Negate.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Helpers\SimplificationHelpers.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Helpers\SimplificationHelpers.cs" />
<Compile Include="$(MSBuildThisFileDirectory)LanguageServices\AddImports\AbstractAddImportsService.cs" /> <Compile Include="$(MSBuildThisFileDirectory)LanguageServices\AddImports\AbstractAddImportsService.cs" />
<Compile Include="$(MSBuildThisFileDirectory)LanguageServices\AddImports\AddImportHelpers.cs" /> <Compile Include="$(MSBuildThisFileDirectory)LanguageServices\AddImports\AddImportHelpers.cs" />
......
...@@ -6,6 +6,8 @@ Imports System.Composition ...@@ -6,6 +6,8 @@ Imports System.Composition
Imports System.Diagnostics.CodeAnalysis Imports System.Diagnostics.CodeAnalysis
Imports Microsoft.CodeAnalysis.Editing Imports Microsoft.CodeAnalysis.Editing
Imports Microsoft.CodeAnalysis.Host.Mef Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.LanguageServices
Imports Microsoft.CodeAnalysis.VisualBasic.LanguageServices
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
...@@ -20,6 +22,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration ...@@ -20,6 +22,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Public Sub New() Public Sub New()
End Sub End Sub
Friend Overrides ReadOnly Property SyntaxFacts As ISyntaxFacts
Get
Return VisualBasicSyntaxFacts.Instance
End Get
End Property
Friend Overloads Overrides Function LocalDeclarationStatement(type As SyntaxNode, identifier As SyntaxToken, Optional initializer As SyntaxNode = Nothing, Optional isConst As Boolean = False) As SyntaxNode Friend Overloads Overrides Function LocalDeclarationStatement(type As SyntaxNode, identifier As SyntaxToken, Optional initializer As SyntaxNode = Nothing, Optional isConst As Boolean = False) As SyntaxNode
Return SyntaxFactory.LocalDeclarationStatement( Return SyntaxFactory.LocalDeclarationStatement(
SyntaxFactory.TokenList(SyntaxFactory.Token(If(isConst, SyntaxKind.ConstKeyword, SyntaxKind.DimKeyword))), SyntaxFactory.TokenList(SyntaxFactory.Token(If(isConst, SyntaxKind.ConstKeyword, SyntaxKind.DimKeyword))),
...@@ -56,5 +64,21 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration ...@@ -56,5 +64,21 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Friend Overrides Function MemberBindingExpression(name As SyntaxNode) As SyntaxNode Friend Overrides Function MemberBindingExpression(name As SyntaxNode) As SyntaxNode
Return SyntaxFactory.SimpleMemberAccessExpression(DirectCast(name, SimpleNameSyntax)) Return SyntaxFactory.SimpleMemberAccessExpression(DirectCast(name, SimpleNameSyntax))
End Function End Function
Friend Overrides Function RefExpression(expression As SyntaxNode) As SyntaxNode
Return expression
End Function
Friend Overrides Function AddParentheses(expression As SyntaxNode, Optional includeElasticTrivia As Boolean = True, Optional addSimplifierAnnotation As Boolean = True) As SyntaxNode
Return Parenthesize(expression, addSimplifierAnnotation)
End Function
Friend Shared Function Parenthesize(expression As SyntaxNode, Optional addSimplifierAnnotation As Boolean = True) As ParenthesizedExpressionSyntax
Return DirectCast(expression, ExpressionSyntax).Parenthesize(addSimplifierAnnotation)
End Function
Friend Overrides Function YieldReturnStatement(expression As SyntaxNode) As SyntaxNode
Return SyntaxFactory.YieldStatement(DirectCast(expression, ExpressionSyntax))
End Function
End Class End Class
End Namespace End Namespace
...@@ -31,8 +31,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration ...@@ -31,8 +31,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Friend Overrides ReadOnly Property RequiresExplicitImplementationForInterfaceMembers As Boolean = True Friend Overrides ReadOnly Property RequiresExplicitImplementationForInterfaceMembers As Boolean = True
Friend Overrides ReadOnly Property SyntaxFacts As ISyntaxFacts = VisualBasicSyntaxFacts.Instance
Friend Overrides ReadOnly Property SyntaxGeneratorInternal As SyntaxGeneratorInternal = VisualBasicSyntaxGeneratorInternal.Instance Friend Overrides ReadOnly Property SyntaxGeneratorInternal As SyntaxGeneratorInternal = VisualBasicSyntaxGeneratorInternal.Instance
Friend Overrides Function EndOfLine(text As String) As SyntaxTrivia Friend Overrides Function EndOfLine(text As String) As SyntaxTrivia
...@@ -73,12 +71,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration ...@@ -73,12 +71,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return SyntaxFactory.TupleExpression(SyntaxFactory.SeparatedList(arguments.Select(AddressOf AsSimpleArgument))) Return SyntaxFactory.TupleExpression(SyntaxFactory.SeparatedList(arguments.Select(AddressOf AsSimpleArgument)))
End Function End Function
Friend Overrides Function AddParentheses(expression As SyntaxNode, Optional includeElasticTrivia As Boolean = True, Optional addSimplifierAnnotation As Boolean = True) As SyntaxNode
Return Parenthesize(expression, addSimplifierAnnotation)
End Function
Private Function Parenthesize(expression As SyntaxNode, Optional addSimplifierAnnotation As Boolean = True) As ParenthesizedExpressionSyntax Private Function Parenthesize(expression As SyntaxNode, Optional addSimplifierAnnotation As Boolean = True) As ParenthesizedExpressionSyntax
Return DirectCast(expression, ExpressionSyntax).Parenthesize(addSimplifierAnnotation) Return VisualBasicSyntaxGeneratorInternal.Parenthesize(expression, addSimplifierAnnotation)
End Function End Function
Public Overrides Function AddExpression(left As SyntaxNode, right As SyntaxNode) As SyntaxNode Public Overrides Function AddExpression(left As SyntaxNode, right As SyntaxNode) As SyntaxNode
...@@ -377,10 +371,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration ...@@ -377,10 +371,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return SyntaxFactory.ReturnStatement(DirectCast(expressionOpt, ExpressionSyntax)) Return SyntaxFactory.ReturnStatement(DirectCast(expressionOpt, ExpressionSyntax))
End Function End Function
Friend Overrides Function YieldReturnStatement(expression As SyntaxNode) As SyntaxNode
Return SyntaxFactory.YieldStatement(DirectCast(expression, ExpressionSyntax))
End Function
Public Overrides Function ThisExpression() As SyntaxNode Public Overrides Function ThisExpression() As SyntaxNode
Return SyntaxFactory.MeExpression() Return SyntaxFactory.MeExpression()
End Function End Function
...@@ -679,10 +669,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration ...@@ -679,10 +669,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Throw New NotSupportedException() Throw New NotSupportedException()
End Function End Function
Friend Overrides Function RefExpression(expression As SyntaxNode) As SyntaxNode
Return expression
End Function
#End Region #End Region
#Region "Declarations" #Region "Declarations"
......
...@@ -26,6 +26,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting ...@@ -26,6 +26,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Formatting
Private ReadOnly _rules As ImmutableList(Of AbstractFormattingRule) Private ReadOnly _rules As ImmutableList(Of AbstractFormattingRule)
#If CODE_STYLE Then
Public Shared ReadOnly Instance As New VisualBasicSyntaxFormattingService
#End If
#If Not CODE_STYLE Then #If Not CODE_STYLE Then
<ImportingConstructor> <ImportingConstructor>
<Obsolete(MefConstruction.ImportingConstructorMessage, True)> <Obsolete(MefConstruction.ImportingConstructorMessage, True)>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册