提交 fa407a64 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #19424 from CyrusNajmabadi/poolSimplifiers

Pool the simplifiers we use when simplifying code.
......@@ -209,22 +209,22 @@
<Compile Include="Rename\CSharpRenameRewriterLanguageService.cs" />
<Compile Include="Rename\LabelConflictVisitor.cs" />
<Compile Include="Rename\LocalConflictVisitor.cs" />
<Compile Include="Simplification\AbstractCSharpReducer.AbstractExpressionRewriter.cs" />
<Compile Include="Simplification\AbstractCSharpReducer.cs" />
<Compile Include="Simplification\CSharpCastReducer.cs" />
<Compile Include="Simplification\CSharpInferredMemberNameReducer.cs" />
<Compile Include="Simplification\CSharpInferredMemberNameReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpCastReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpEscapingReducer.cs" />
<Compile Include="Simplification\CSharpEscapingReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpExtensionMethodReducer.cs" />
<Compile Include="Simplification\CSharpExtensionMethodReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpMiscellaneousReducer.cs" />
<Compile Include="Simplification\CSharpMiscellaneousReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpNameReducer.cs" />
<Compile Include="Simplification\CSharpNameReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpParenthesesReducer.cs" />
<Compile Include="Simplification\CSharpParenthesesReducer.Rewriter.cs" />
<Compile Include="Simplification\Reducers\AbstractCSharpReducer.AbstractReductionRewriter.cs" />
<Compile Include="Simplification\Reducers\AbstractCSharpReducer.cs" />
<Compile Include="Simplification\Reducers\CSharpCastReducer.cs" />
<Compile Include="Simplification\Reducers\CSharpInferredMemberNameReducer.cs" />
<Compile Include="Simplification\Reducers\CSharpInferredMemberNameReducer.Rewriter.cs" />
<Compile Include="Simplification\Reducers\CSharpCastReducer.Rewriter.cs" />
<Compile Include="Simplification\Reducers\CSharpEscapingReducer.cs" />
<Compile Include="Simplification\Reducers\CSharpEscapingReducer.Rewriter.cs" />
<Compile Include="Simplification\Reducers\CSharpExtensionMethodReducer.cs" />
<Compile Include="Simplification\Reducers\CSharpExtensionMethodReducer.Rewriter.cs" />
<Compile Include="Simplification\Reducers\CSharpMiscellaneousReducer.cs" />
<Compile Include="Simplification\Reducers\CSharpMiscellaneousReducer.Rewriter.cs" />
<Compile Include="Simplification\Reducers\CSharpNameReducer.cs" />
<Compile Include="Simplification\Reducers\CSharpNameReducer.Rewriter.cs" />
<Compile Include="Simplification\Reducers\CSharpParenthesesReducer.cs" />
<Compile Include="Simplification\Reducers\CSharpParenthesesReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpSimplificationService.cs" />
<Compile Include="Simplification\CSharpSimplificationService.Expander.cs" />
<Compile Include="Simplification\CSharpSimplificationService.NodesAndTokensToReduceComputer.cs" />
......
......@@ -5,34 +5,51 @@
using System.Diagnostics;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal abstract partial class AbstractCSharpReducer
{
protected abstract class AbstractExpressionRewriter : CSharpSyntaxRewriter, IExpressionRewriter
protected abstract class AbstractReductionRewriter : CSharpSyntaxRewriter, IReductionRewriter
{
private readonly OptionSet _optionSet;
private readonly CancellationToken _cancellationToken;
private readonly HashSet<SyntaxNode> _processedParentNodes;
private readonly ObjectPool<IReductionRewriter> _pool;
private OptionSet _optionSet;
private CancellationToken _cancellationToken;
private SemanticModel _semanticModel;
protected AbstractExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken)
public bool HasMoreWork { get; private set; }
// can be used to simplify whole subtrees while just annotating one syntax node.
// This is e.g. useful in the name simplification, where a whole qualified name is annotated
protected bool alwaysSimplify;
private HashSet<SyntaxNode> _processedParentNodes = new HashSet<SyntaxNode>();
protected AbstractReductionRewriter(ObjectPool<IReductionRewriter> pool)
=> _pool = pool;
public void Initialize(OptionSet optionSet, CancellationToken cancellationToken)
{
_optionSet = optionSet;
_cancellationToken = cancellationToken;
_processedParentNodes = new HashSet<SyntaxNode>();
}
public bool HasMoreWork { get; private set; }
public void Dispose()
{
_optionSet = null;
_cancellationToken = CancellationToken.None;
_processedParentNodes.Clear();
_semanticModel = null;
HasMoreWork = false;
alwaysSimplify = false;
// can be used to simplify whole subtrees while just annotating one syntax node.
// This is e.g. useful in the name simplification, where a whole qualified name is annotated
protected bool alwaysSimplify;
_pool.Free(this);
}
private static SyntaxNode GetParentNode(SyntaxNode node)
{
......@@ -128,15 +145,6 @@ private static SyntaxNode GetParentNode(StatementSyntax statement)
return SimplifyNode(expression, newNode, parentNode, simplifier);
}
protected SyntaxNode SimplifyStatement<TStatement>(
TStatement statement,
SyntaxNode newNode,
Func<TStatement, SemanticModel, OptionSet, CancellationToken, SyntaxNode> simplifier)
where TStatement : ExpressionSyntax
{
return SimplifyNode(statement, newNode, GetParentNode(statement), simplifier);
}
protected SyntaxToken SimplifyToken(SyntaxToken token, Func<SyntaxToken, SemanticModel, OptionSet, CancellationToken, SyntaxToken> simplifier)
{
_cancellationToken.ThrowIfCancellationRequested();
......@@ -182,4 +190,4 @@ public SyntaxNodeOrToken VisitNodeOrToken(SyntaxNodeOrToken nodeOrToken, Semanti
}
}
}
}
}
\ 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 Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal abstract partial class AbstractCSharpReducer : AbstractReducer
{
protected AbstractCSharpReducer(ObjectPool<IReductionRewriter> pool) : base(pool)
{
}
}
}
}
\ 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.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpCastReducer
{
private class Rewriter : AbstractExpressionRewriter
private class Rewriter : AbstractReductionRewriter
{
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken)
: base(optionSet, cancellationToken)
public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(pool)
{
}
......@@ -22,7 +21,7 @@ public override SyntaxNode VisitCastExpression(CastExpressionSyntax node)
return SimplifyExpression(
node,
newNode: base.VisitCastExpression(node),
simplifier: SimplifyCast);
simplifier: s_simplifyCast);
}
public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node)
......@@ -69,4 +68,4 @@ public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node)
}
}
}
}
}
\ 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.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.Extensions;
......@@ -7,16 +8,21 @@
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpCastReducer : AbstractCSharpReducer
{
public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken)
private static readonly ObjectPool<IReductionRewriter> s_pool = new ObjectPool<IReductionRewriter>(
() => new Rewriter(s_pool));
public CSharpCastReducer() : base(s_pool)
{
return new Rewriter(optionSet, cancellationToken);
}
private static readonly Func<CastExpressionSyntax, SemanticModel, OptionSet, CancellationToken, ExpressionSyntax> s_simplifyCast = SimplifyCast;
private static ExpressionSyntax SimplifyCast(CastExpressionSyntax node, SemanticModel semanticModel, OptionSet optionSet, CancellationToken cancellationToken)
{
if (!node.IsUnnecessaryCast(semanticModel, cancellationToken))
......@@ -44,4 +50,4 @@ private static ExpressionSyntax SimplifyCast(CastExpressionSyntax node, Semantic
return resultNode;
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpEscapingReducer
{
private class Rewriter : AbstractExpressionRewriter
private class Rewriter : AbstractReductionRewriter
{
public Rewriter(CSharpEscapingReducer escapingSimplifierService, OptionSet optionSet, CancellationToken cancellationToken)
: base(optionSet, cancellationToken)
public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(pool)
{
_escapingSimplifierService = escapingSimplifierService;
}
private readonly CSharpEscapingReducer _escapingSimplifierService;
public override SyntaxToken VisitToken(SyntaxToken token)
{
var newToken = base.VisitToken(token);
return SimplifyToken(newToken, _escapingSimplifierService.SimplifyIdentifierToken);
return SimplifyToken(newToken, s_simplifyIdentifierToken);
}
}
}
}
}
\ 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.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.Extensions;
......@@ -7,17 +8,22 @@
using Microsoft.CodeAnalysis.CSharp.Utilities;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpEscapingReducer : AbstractCSharpReducer
{
public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken)
private static readonly ObjectPool<IReductionRewriter> s_pool = new ObjectPool<IReductionRewriter>(
() => new Rewriter(s_pool));
public CSharpEscapingReducer() : base(s_pool)
{
return new Rewriter(this, optionSet, cancellationToken);
}
private SyntaxToken SimplifyIdentifierToken(
private static Func<SyntaxToken, SemanticModel, OptionSet, CancellationToken, SyntaxToken> s_simplifyIdentifierToken = SimplifyIdentifierToken;
private static SyntaxToken SimplifyIdentifierToken(
SyntaxToken token,
SemanticModel semanticModel,
OptionSet optionSet,
......@@ -114,7 +120,7 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet
return result;
}
private SyntaxToken CreateNewIdentifierTokenFromToken(SyntaxToken originalToken, bool escape)
private static SyntaxToken CreateNewIdentifierTokenFromToken(SyntaxToken originalToken, bool escape)
{
var isVerbatimIdentifier = originalToken.IsVerbatimIdentifier();
if (isVerbatimIdentifier == escape)
......@@ -129,4 +135,4 @@ private SyntaxToken CreateNewIdentifierTokenFromToken(SyntaxToken originalToken,
: originalToken.CopyAnnotationsTo(SyntaxFactory.Identifier(originalToken.LeadingTrivia, SyntaxKind.IdentifierToken, unescapedText, originalToken.ValueText, originalToken.TrailingTrivia));
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpExtensionMethodReducer
{
private class Rewriter : AbstractExpressionRewriter
private class Rewriter : AbstractReductionRewriter
{
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken)
: base(optionSet, cancellationToken)
public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(pool)
{
}
......@@ -20,8 +19,8 @@ public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax
return SimplifyExpression(
node,
newNode: base.VisitInvocationExpression(node),
simplifier: SimplifyExtensionMethod);
simplifier: s_simplifyExtensionMethod);
}
}
}
}
}
\ 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.Diagnostics;
using System.Linq;
using System.Threading;
......@@ -7,16 +8,21 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpExtensionMethodReducer : AbstractCSharpReducer
{
public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken)
private static readonly ObjectPool<IReductionRewriter> s_pool = new ObjectPool<IReductionRewriter>(
() => new Rewriter(s_pool));
public CSharpExtensionMethodReducer() : base(s_pool)
{
return new Rewriter(optionSet, cancellationToken);
}
private static readonly Func<InvocationExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyExtensionMethod = SimplifyExtensionMethod;
private static SyntaxNode SimplifyExtensionMethod(
InvocationExpressionSyntax node,
SemanticModel semanticModel,
......@@ -64,19 +70,19 @@ private static InvocationExpressionSyntax TryReduceExtensionMethod(InvocationExp
{
newMemberAccess = SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression, expression,
((MemberAccessExpressionSyntax)invocationExpressionNodeExpression).OperatorToken,
((MemberAccessExpressionSyntax)invocationExpressionNodeExpression).OperatorToken,
((MemberAccessExpressionSyntax)invocationExpressionNodeExpression).Name);
}
else if (node.Expression.Kind() == SyntaxKind.IdentifierName)
{
newMemberAccess = SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression, expression,
SyntaxKind.SimpleMemberAccessExpression, expression,
(IdentifierNameSyntax)invocationExpressionNodeExpression.WithoutLeadingTrivia());
}
else if (node.Expression.Kind() == SyntaxKind.GenericName)
{
newMemberAccess = SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression, expression,
SyntaxKind.SimpleMemberAccessExpression, expression,
(GenericNameSyntax)invocationExpressionNodeExpression.WithoutLeadingTrivia());
}
else
......@@ -119,4 +125,4 @@ private static InvocationExpressionSyntax TryReduceExtensionMethod(InvocationExp
return rewrittenNode;
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpInferredMemberNameReducer
{
private class Rewriter : AbstractExpressionRewriter
private class Rewriter : AbstractReductionRewriter
{
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken)
: base(optionSet, cancellationToken)
public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(pool)
{
}
......@@ -26,7 +24,7 @@ public override SyntaxNode VisitArgument(ArgumentSyntax node)
node,
parentNode: node.Parent,
newNode: newNode,
simplifier: SimplifyTupleName);
simplifier: s_simplifyTupleName);
}
return newNode;
......@@ -38,8 +36,8 @@ public override SyntaxNode VisitAnonymousObjectMemberDeclarator(AnonymousObjectM
node,
parentNode: node.Parent,
newNode: base.VisitAnonymousObjectMemberDeclarator(node),
simplifier: SimplifyAnonymousTypeMemberName);
simplifier: s_simplifyAnonymousTypeMemberName);
}
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
......@@ -14,11 +16,15 @@ namespace Microsoft.CodeAnalysis.CSharp.Simplification
/// </summary>
internal partial class CSharpInferredMemberNameReducer : AbstractCSharpReducer
{
public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken)
private static readonly ObjectPool<IReductionRewriter> s_pool = new ObjectPool<IReductionRewriter>(
() => new Rewriter(s_pool));
public CSharpInferredMemberNameReducer() : base(s_pool)
{
return new Rewriter(optionSet, cancellationToken);
}
private static readonly Func<ArgumentSyntax, SemanticModel, OptionSet, CancellationToken, ArgumentSyntax> s_simplifyTupleName = SimplifyTupleName;
private static ArgumentSyntax SimplifyTupleName(ArgumentSyntax node, SemanticModel semanticModel, OptionSet optionSet, CancellationToken cancellationToken)
{
// Tuple elements are arguments in a tuple expression
......@@ -37,6 +43,7 @@ private static ArgumentSyntax SimplifyTupleName(ArgumentSyntax node, SemanticMod
return node.WithNameColon(null).WithTriviaFrom(node);
}
private static readonly Func<AnonymousObjectMemberDeclaratorSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyAnonymousTypeMemberName = SimplifyAnonymousTypeMemberName;
private static SyntaxNode SimplifyAnonymousTypeMemberName(AnonymousObjectMemberDeclaratorSyntax node, SemanticModel semanticModel, OptionSet optionSet, CancellationToken canellationToken)
{
......@@ -55,4 +62,4 @@ private static SyntaxNode SimplifyAnonymousTypeMemberName(AnonymousObjectMemberD
return node.WithNameEquals(null).WithTriviaFrom(node);
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpMiscellaneousReducer
{
private class Rewriter : AbstractExpressionRewriter
private class Rewriter : AbstractReductionRewriter
{
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken)
: base(optionSet, cancellationToken)
public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(pool)
{
}
......@@ -21,7 +20,7 @@ public override SyntaxNode VisitParameter(ParameterSyntax node)
node,
newNode: base.VisitParameter(node),
parentNode: node.Parent,
simplifier: SimplifyParameter);
simplifier: s_simplifyParameter);
}
public override SyntaxNode VisitParenthesizedLambdaExpression(ParenthesizedLambdaExpressionSyntax node)
......@@ -30,8 +29,8 @@ public override SyntaxNode VisitParenthesizedLambdaExpression(ParenthesizedLambd
node,
newNode: base.VisitParenthesizedLambdaExpression(node),
parentNode: node.Parent,
simplifier: SimplifyParenthesizedLambdaExpression);
simplifier: s_simplifyParenthesizedLambdaExpression);
}
}
}
}
}
\ 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.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.Extensions;
......@@ -7,14 +8,17 @@
using Microsoft.CodeAnalysis.CSharp.Utilities;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpMiscellaneousReducer : AbstractCSharpReducer
{
public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken)
private static readonly ObjectPool<IReductionRewriter> s_pool = new ObjectPool<IReductionRewriter>(
() => new Rewriter(s_pool));
public CSharpMiscellaneousReducer() : base(s_pool)
{
return new Rewriter(optionSet, cancellationToken);
}
private static bool CanRemoveTypeFromParameter(
......@@ -50,6 +54,8 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet
return false;
}
private static Func<SyntaxNode, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyParameter = SimplifyParameter;
private static SyntaxNode SimplifyParameter(
SyntaxNode node,
SemanticModel semanticModel,
......@@ -66,6 +72,8 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet
return node;
}
private static readonly Func<SyntaxNode, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyParenthesizedLambdaExpression = SimplifyParenthesizedLambdaExpression;
private static SyntaxNode SimplifyParenthesizedLambdaExpression(
SyntaxNode node,
SemanticModel semanticModel,
......@@ -96,4 +104,4 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet
return node;
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpNameReducer
{
private class Rewriter : AbstractExpressionRewriter
private class Rewriter : AbstractReductionRewriter
{
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken)
: base(optionSet, cancellationToken)
public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(pool)
{
}
......@@ -30,7 +28,7 @@ public override SyntaxNode VisitPredefinedType(PredefinedTypeSyntax node)
var result = SimplifyExpression(
node,
newNode: base.VisitPredefinedType(node),
simplifier: SimplifyName);
simplifier: s_simplifyName);
this.alwaysSimplify = oldAlwaysSimplify;
......@@ -48,7 +46,7 @@ public override SyntaxNode VisitAliasQualifiedName(AliasQualifiedNameSyntax node
var result = SimplifyExpression(
node,
newNode: base.VisitAliasQualifiedName(node),
simplifier: SimplifyName);
simplifier: s_simplifyName);
this.alwaysSimplify = oldAlwaysSimplify;
......@@ -66,7 +64,7 @@ public override SyntaxNode VisitQualifiedName(QualifiedNameSyntax node)
var result = SimplifyExpression(
node,
newNode: base.VisitQualifiedName(node),
simplifier: SimplifyName);
simplifier: s_simplifyName);
this.alwaysSimplify = oldAlwaysSimplify;
......@@ -84,7 +82,7 @@ public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyn
var result = SimplifyExpression(
node,
newNode: base.VisitMemberAccessExpression(node),
simplifier: SimplifyName);
simplifier: s_simplifyName);
this.alwaysSimplify = oldAlwaysSimplify;
......@@ -102,7 +100,7 @@ public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node)
var result = SimplifyExpression(
node,
newNode: base.VisitIdentifierName(node),
simplifier: SimplifyName);
simplifier: s_simplifyName);
this.alwaysSimplify = oldAlwaysSimplify;
......@@ -120,7 +118,7 @@ public override SyntaxNode VisitGenericName(GenericNameSyntax node)
var result = SimplifyExpression(
node,
newNode: base.VisitGenericName(node),
simplifier: SimplifyName);
simplifier: s_simplifyName);
this.alwaysSimplify = oldAlwaysSimplify;
......@@ -138,7 +136,7 @@ public override SyntaxNode VisitQualifiedCref(QualifiedCrefSyntax node)
var result = SimplifyExpression(
node,
newNode: base.VisitQualifiedCref(node),
simplifier: SimplifyName);
simplifier: s_simplifyName);
this.alwaysSimplify = oldAlwaysSimplify;
......@@ -201,4 +199,4 @@ public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node)
}
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
......@@ -7,16 +8,21 @@
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpNameReducer : AbstractCSharpReducer
{
public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken)
private static readonly ObjectPool<IReductionRewriter> s_pool = new ObjectPool<IReductionRewriter>(
() => new Rewriter(s_pool));
public CSharpNameReducer() : base(s_pool)
{
return new Rewriter(optionSet, cancellationToken);
}
private static readonly Func<SyntaxNode, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyName = SimplifyName;
private static SyntaxNode SimplifyName(
SyntaxNode node,
SemanticModel semanticModel,
......@@ -51,4 +57,4 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet
return node.WithoutAnnotations(Simplifier.Annotation);
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpParenthesesReducer
{
private class Rewriter : AbstractExpressionRewriter
private class Rewriter : AbstractReductionRewriter
{
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken)
: base(optionSet, cancellationToken)
public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(pool)
{
}
......@@ -20,8 +19,8 @@ public override SyntaxNode VisitParenthesizedExpression(ParenthesizedExpressionS
return SimplifyExpression(
node,
newNode: base.VisitParenthesizedExpression(node),
simplifier: SimplifyParentheses);
simplifier: s_simplifyParentheses);
}
}
}
}
}
\ 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.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.Extensions;
......@@ -7,16 +8,21 @@
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification
{
internal partial class CSharpParenthesesReducer : AbstractCSharpReducer
{
public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken)
private static readonly ObjectPool<IReductionRewriter> s_pool = new ObjectPool<IReductionRewriter>(
() => new Rewriter(s_pool));
public CSharpParenthesesReducer() : base(s_pool)
{
return new Rewriter(optionSet, cancellationToken);
}
private static readonly Func<ParenthesizedExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyParentheses = SimplifyParentheses;
private static SyntaxNode SimplifyParentheses(
ParenthesizedExpressionSyntax node,
SemanticModel semanticModel,
......@@ -54,4 +60,4 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet
return node;
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.CodeAnalysis.Simplification
{
internal abstract partial class AbstractReducer
{
internal interface IExpressionRewriter
internal interface IReductionRewriter : IDisposable
{
void Initialize(OptionSet optionSet, CancellationToken cancellationToken);
SyntaxNodeOrToken VisitNodeOrToken(SyntaxNodeOrToken nodeOrTokenToReduce, SemanticModel semanticModel, bool simplifyAllDescendants);
bool HasMoreWork { get; }
}
}
}
}
\ 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.Threading;
using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.Simplification
{
internal abstract partial class AbstractReducer
{
public abstract IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet, CancellationToken cancellationToken);
private readonly ObjectPool<IReductionRewriter> _pool;
protected AbstractReducer(ObjectPool<IReductionRewriter> pool)
=> _pool = pool;
public IReductionRewriter GetOrCreateRewriter()
=> _pool.Allocate();
}
}
}
\ No newline at end of file
......@@ -163,7 +163,7 @@ protected virtual SyntaxNode TransformReducedNode(SyntaxNode reducedNode, Syntax
Document document,
SyntaxNode root,
ImmutableArray<NodeOrTokenToReduce> nodesAndTokensToReduce,
IEnumerable<AbstractReducer> reducers,
ImmutableArray<AbstractReducer> reducers,
OptionSet optionSet,
SemanticModel semanticModel,
ConcurrentDictionary<SyntaxNode, SyntaxNode> reducedNodesMap,
......@@ -178,89 +178,92 @@ protected virtual SyntaxNode TransformReducedNode(SyntaxNode reducedNode, Syntax
{
var nodeOrTokenToReduce = nodesAndTokensToReduce[i];
simplifyTasks[i] = Task.Run(async () =>
{
var nodeOrToken = nodeOrTokenToReduce.OriginalNodeOrToken;
var simplifyAllDescendants = nodeOrTokenToReduce.SimplifyAllDescendants;
var semanticModelForReduce = semanticModel;
var currentNodeOrToken = nodeOrTokenToReduce.NodeOrToken;
var isNode = nodeOrToken.IsNode;
foreach (var reducer in reducers)
{
cancellationToken.ThrowIfCancellationRequested();
var nodeOrToken = nodeOrTokenToReduce.OriginalNodeOrToken;
var simplifyAllDescendants = nodeOrTokenToReduce.SimplifyAllDescendants;
var semanticModelForReduce = semanticModel;
var currentNodeOrToken = nodeOrTokenToReduce.NodeOrToken;
var isNode = nodeOrToken.IsNode;
var rewriter = reducer.CreateExpressionRewriter(optionSet, cancellationToken);
do
foreach (var reducer in reducers)
{
if (currentNodeOrToken.SyntaxTree != semanticModelForReduce.SyntaxTree)
{
// currentNodeOrToken was simplified either by a previous reducer or
// a previous iteration of the current reducer.
// Create a speculative semantic model for the simplified node for semantic queries.
// Certain node kinds (expressions/statements) require non-null parent nodes during simplification.
// However, the reduced nodes haven't been parented yet, so do the required parenting using the original node's parent.
if (currentNodeOrToken.Parent == null &&
nodeOrToken.Parent != null &&
(currentNodeOrToken.IsToken ||
currentNodeOrToken.AsNode() is TExpressionSyntax ||
currentNodeOrToken.AsNode() is TStatementSyntax ||
currentNodeOrToken.AsNode() is TCrefSyntax))
{
var annotation = new SyntaxAnnotation();
currentNodeOrToken = currentNodeOrToken.WithAdditionalAnnotations(annotation);
cancellationToken.ThrowIfCancellationRequested();
var replacedParent = isNode ?
nodeOrToken.Parent.ReplaceNode(nodeOrToken.AsNode(), currentNodeOrToken.AsNode()) :
nodeOrToken.Parent.ReplaceToken(nodeOrToken.AsToken(), currentNodeOrToken.AsToken());
currentNodeOrToken = replacedParent
.ChildNodesAndTokens()
.Single((c) => c.HasAnnotation(annotation));
}
using (var rewriter = reducer.GetOrCreateRewriter())
{
rewriter.Initialize(optionSet, cancellationToken);
if (isNode)
do
{
var currentNode = currentNodeOrToken.AsNode();
if (this.CanNodeBeSimplifiedWithoutSpeculation(nodeOrToken.AsNode()))
{
// Since this node cannot be speculated, we are replacing the Document with the changes and get a new SemanticModel
SyntaxAnnotation marker = new SyntaxAnnotation();
var newRoot = root.ReplaceNode(nodeOrToken.AsNode(), currentNode.WithAdditionalAnnotations(marker));
var newDocument = document.WithSyntaxRoot(newRoot);
semanticModelForReduce = await newDocument.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
newRoot = await semanticModelForReduce.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false);
currentNodeOrToken = newRoot.DescendantNodes().Single((c) => c.HasAnnotation(marker));
}
else
if (currentNodeOrToken.SyntaxTree != semanticModelForReduce.SyntaxTree)
{
// Create speculative semantic model for simplified node.
semanticModelForReduce = GetSpeculativeSemanticModel(ref currentNode, semanticModel, nodeOrToken.AsNode());
currentNodeOrToken = currentNode;
// currentNodeOrToken was simplified either by a previous reducer or
// a previous iteration of the current reducer.
// Create a speculative semantic model for the simplified node for semantic queries.
// Certain node kinds (expressions/statements) require non-null parent nodes during simplification.
// However, the reduced nodes haven't been parented yet, so do the required parenting using the original node's parent.
if (currentNodeOrToken.Parent == null &&
nodeOrToken.Parent != null &&
(currentNodeOrToken.IsToken ||
currentNodeOrToken.AsNode() is TExpressionSyntax ||
currentNodeOrToken.AsNode() is TStatementSyntax ||
currentNodeOrToken.AsNode() is TCrefSyntax))
{
var annotation = new SyntaxAnnotation();
currentNodeOrToken = currentNodeOrToken.WithAdditionalAnnotations(annotation);
var replacedParent = isNode ?
nodeOrToken.Parent.ReplaceNode(nodeOrToken.AsNode(), currentNodeOrToken.AsNode()) :
nodeOrToken.Parent.ReplaceToken(nodeOrToken.AsToken(), currentNodeOrToken.AsToken());
currentNodeOrToken = replacedParent
.ChildNodesAndTokens()
.Single((c) => c.HasAnnotation(annotation));
}
if (isNode)
{
var currentNode = currentNodeOrToken.AsNode();
if (this.CanNodeBeSimplifiedWithoutSpeculation(nodeOrToken.AsNode()))
{
// Since this node cannot be speculated, we are replacing the Document with the changes and get a new SemanticModel
SyntaxAnnotation marker = new SyntaxAnnotation();
var newRoot = root.ReplaceNode(nodeOrToken.AsNode(), currentNode.WithAdditionalAnnotations(marker));
var newDocument = document.WithSyntaxRoot(newRoot);
semanticModelForReduce = await newDocument.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
newRoot = await semanticModelForReduce.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false);
currentNodeOrToken = newRoot.DescendantNodes().Single((c) => c.HasAnnotation(marker));
}
else
{
// Create speculative semantic model for simplified node.
semanticModelForReduce = GetSpeculativeSemanticModel(ref currentNode, semanticModel, nodeOrToken.AsNode());
currentNodeOrToken = currentNode;
}
}
}
// Reduce the current node or token.
currentNodeOrToken = rewriter.VisitNodeOrToken(currentNodeOrToken, semanticModelForReduce, simplifyAllDescendants);
}
while (rewriter.HasMoreWork);
}
// Reduce the current node or token.
currentNodeOrToken = rewriter.VisitNodeOrToken(currentNodeOrToken, semanticModelForReduce, simplifyAllDescendants);
}
while (rewriter.HasMoreWork);
}
// If nodeOrToken was simplified, add it to the appropriate dictionary of replaced nodes/tokens.
if (currentNodeOrToken != nodeOrToken)
{
if (isNode)
{
reducedNodesMap[nodeOrToken.AsNode()] = currentNodeOrToken.AsNode();
}
else
// If nodeOrToken was simplified, add it to the appropriate dictionary of replaced nodes/tokens.
if (currentNodeOrToken != nodeOrToken)
{
reducedTokensMap[nodeOrToken.AsToken()] = currentNodeOrToken.AsToken();
if (isNode)
{
reducedNodesMap[nodeOrToken.AsNode()] = currentNodeOrToken.AsNode();
}
else
{
reducedTokensMap[nodeOrToken.AsToken()] = currentNodeOrToken.AsToken();
}
}
}
}, cancellationToken);
}, cancellationToken);
}
return Task.WhenAll(simplifyTasks);
......
......@@ -184,29 +184,29 @@
<Compile Include="Rename\LocalConflictVisitor.vb" />
<Compile Include="Rename\VisualBasicRenameRewriterLanguageService.vb" />
<Compile Include="Rename\VisualBasicRenameRewriterLanguageServiceFactory.vb" />
<Compile Include="Simplification\AbstractVisualBasicReducer.vb" />
<Compile Include="Simplification\AbstractVisualBasicSimplifier.AbstractExpressionRewriter.vb" />
<Compile Include="Simplification\VisualBasicCallReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicCallReducer.vb" />
<Compile Include="Simplification\VisualBasicCastReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicCastReducer.vb" />
<Compile Include="Simplification\VisualBasicInferredMemberNameReducer.vb" />
<Compile Include="Simplification\VisualBasicInferredMemberNameReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicEscapingReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicEscapingReducer.vb" />
<Compile Include="Simplification\VisualBasicExtensionMethodReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicExtensionMethodReducer.vb" />
<Compile Include="Simplification\VisualBasicMiscellaneousReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicMiscellaneousReducer.vb" />
<Compile Include="Simplification\VisualBasicNameReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicNameReducer.vb" />
<Compile Include="Simplification\VisualBasicParenthesesReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicParenthesesReducer.vb" />
<Compile Include="Simplification\Reducers\AbstractVisualBasicReducer.AbstractReductionRewriter.vb" />
<Compile Include="Simplification\Reducers\AbstractVisualBasicReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicCallReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicCallReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicCastReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicCastReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicInferredMemberNameReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicInferredMemberNameReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicEscapingReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicEscapingReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicExtensionMethodReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicExtensionMethodReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicMiscellaneousReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicMiscellaneousReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicNameReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicNameReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicParenthesesReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicParenthesesReducer.vb" />
<Compile Include="Simplification\VisualBasicSimplificationService.Expander.vb" />
<Compile Include="Simplification\VisualBasicSimplificationService.NodesAndTokensToReduceComputer.vb" />
<Compile Include="Simplification\VisualBasicSimplificationService.vb" />
<Compile Include="Simplification\VisualBasicVariableDeclaratorReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicVariableDeclaratorReducer.vb" />
<Compile Include="Simplification\Reducers\VisualBasicVariableDeclaratorReducer.Rewriter.vb" />
<Compile Include="Simplification\Reducers\VisualBasicVariableDeclaratorReducer.vb" />
<Compile Include="Utilities\DirectiveSyntaxEqualityComparer.vb" />
<Compile Include="Utilities\DirectiveWalker.vb" />
<Compile Include="Utilities\ImportsClauseComparer.vb" />
......
......@@ -7,25 +7,43 @@ Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend MustInherit Class AbstractVisualBasicReducer
Friend MustInherit Class AbstractExpressionRewriter
Friend MustInherit Class AbstractReductionRewriter
Inherits VisualBasicSyntaxRewriter
Implements IExpressionRewriter
Implements IReductionRewriter
Private ReadOnly _pool As ObjectPool(Of IReductionRewriter)
Protected CancellationToken As CancellationToken
Private _simplificationOptions As OptionSet
Private ReadOnly _processedParentNodes As HashSet(Of SyntaxNode) = New HashSet(Of SyntaxNode)()
Private _semanticModel As SemanticModel
Protected ReadOnly CancellationToken As CancellationToken
Private ReadOnly _processedParentNodes As HashSet(Of SyntaxNode)
Private _hasMoreWork As Boolean
Protected _alwaysSimplify As Boolean
Private ReadOnly _simplificationOptions As OptionSet
Private _semanticModel As SemanticModel
Protected Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New()
Me.CancellationToken = cancellationToken
Me._simplificationOptions = optionSet
_processedParentNodes = New HashSet(Of SyntaxNode)
Protected Sub New(pool As ObjectPool(Of IReductionRewriter))
_pool = pool
End Sub
Public Sub Initialize(optionSet As OptionSet, cancellationToken As CancellationToken) Implements IReductionRewriter.Initialize
_simplificationOptions = optionSet
cancellationToken = cancellationToken
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
_simplificationOptions = Nothing
CancellationToken = CancellationToken.None
_processedParentNodes.Clear()
_semanticModel = Nothing
_hasMoreWork = False
_alwaysSimplify = False
_pool.Free(Me)
End Sub
Public ReadOnly Property HasMoreWork As Boolean Implements IExpressionRewriter.HasMoreWork
Public ReadOnly Property HasMoreWork As Boolean Implements IReductionRewriter.HasMoreWork
Get
Return _hasMoreWork
End Get
......@@ -140,8 +158,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SimplifyNode(statement, newNode, GetParentNode(statement), simplifier)
End Function
Public Function VisitNodeOrToken(nodeOrToken As SyntaxNodeOrToken, semanticModel As SemanticModel, simplifyAllDescendants As Boolean) As SyntaxNodeOrToken Implements IExpressionRewriter.VisitNodeOrToken
_semanticModel = DirectCast(semanticModel, semanticModel)
Public Function VisitNodeOrToken(nodeOrToken As SyntaxNodeOrToken, semanticModel As SemanticModel, simplifyAllDescendants As Boolean) As SyntaxNodeOrToken Implements IReductionRewriter.VisitNodeOrToken
_semanticModel = DirectCast(semanticModel, SemanticModel)
_alwaysSimplify = simplifyAllDescendants
_hasMoreWork = False
_processedParentNodes.Clear()
......@@ -186,4 +204,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -9,6 +9,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend MustInherit Class AbstractVisualBasicReducer
Inherits AbstractReducer
Protected Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Protected Shared ReadOnly s_reduceParentheses As Func(Of ParenthesizedExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf ReduceParentheses
Protected Shared Function ReduceParentheses(
node As ParenthesizedExpressionSyntax,
semanticModel As SemanticModel,
......@@ -45,6 +51,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
' We don't know how to simplify this.
Return node
End Function
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicCallReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitCallStatement(node As CallStatementSyntax) As SyntaxNode
Return SimplifyStatement(
node,
newNode:=MyBase.VisitCallStatement(node),
simplifier:=AddressOf SimplifyCallStatement)
simplifier:=s_simplifyCallStatement)
End Function
Public Overrides Function VisitParenthesizedExpression(node As ParenthesizedExpressionSyntax) As SyntaxNode
Return SimplifyExpression(
node,
newNode:=MyBase.VisitParenthesizedExpression(node),
simplifier:=AddressOf ReduceParentheses)
simplifier:=s_reduceParentheses)
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -9,9 +9,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicCallReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Shared ReadOnly s_simplifyCallStatement As Func(Of CallStatementSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyCallStatement
Private Shared Function SimplifyCallStatement(
callStatement As CallStatementSyntax,
......@@ -34,6 +39,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
' We don't know how to simplify this.
Return callStatement
End Function
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicCastReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitCTypeExpression(node As CTypeExpressionSyntax) As SyntaxNode
Return SimplifyExpression(
node,
newNode:=MyBase.VisitCTypeExpression(node),
simplifier:=AddressOf SimplifyCast)
simplifier:=s_simplifyCast)
End Function
Public Overrides Function VisitDirectCastExpression(node As DirectCastExpressionSyntax) As SyntaxNode
Return SimplifyExpression(
node,
newNode:=MyBase.VisitDirectCastExpression(node),
simplifier:=AddressOf SimplifyCast)
simplifier:=s_simplifyCast)
End Function
Public Overrides Function VisitTryCastExpression(node As TryCastExpressionSyntax) As SyntaxNode
Return SimplifyExpression(
node,
newNode:=MyBase.VisitTryCastExpression(node),
simplifier:=AddressOf SimplifyCast)
simplifier:=s_simplifyCast)
End Function
Public Overrides Function VisitPredefinedCastExpression(node As PredefinedCastExpressionSyntax) As SyntaxNode
Return SimplifyExpression(
node,
newNode:=MyBase.VisitPredefinedCastExpression(node),
simplifier:=AddressOf SimplifyCast)
simplifier:=s_simplifyPredefinedCast)
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -9,9 +9,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicCastReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Overloads Shared Function SimplifyCast(
castNode As ExpressionSyntax,
......@@ -29,6 +32,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return resultNode
End Function
Private Shared ReadOnly s_simplifyCast As Func(Of CastExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyCast
Private Overloads Shared Function SimplifyCast(
node As CastExpressionSyntax,
semanticModel As SemanticModel,
......@@ -43,7 +48,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SimplifyCast(node, node.Expression, optionSet, cancellationToken)
End Function
Private Overloads Shared Function SimplifyCast(
Private Shared ReadOnly s_simplifyPredefinedCast As Func(Of PredefinedCastExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyPredefinedCast
Private Overloads Shared Function SimplifyPredefinedCast(
node As PredefinedCastExpressionSyntax,
semanticModel As SemanticModel,
optionSet As OptionSet,
......@@ -57,4 +64,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SimplifyCast(node, node.Expression, optionSet, cancellationToken)
End Function
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicEscapingReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitToken(token As SyntaxToken) As SyntaxToken
......@@ -20,7 +19,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
newToken:=MyBase.VisitToken(token),
simplifyFunc:=AddressOf TryUnescapeToken)
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -3,17 +3,18 @@
Imports System.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Simplification
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicEscapingReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New VisualBasicEscapingReducer.Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Shared Function TryUnescapeToken(identifier As SyntaxToken, semanticModel As SemanticModel, optionSet As OptionSet, cancellationToken As CancellationToken) As SyntaxToken
If Not identifier.IsBracketed Then
......@@ -216,4 +217,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return False
End Function
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicExtensionMethodReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitInvocationExpression(node As InvocationExpressionSyntax) As SyntaxNode
......@@ -19,8 +18,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SimplifyExpression(
node,
newNode:=MyBase.VisitInvocationExpression(node),
simplifier:=AddressOf SimplifyInvocationExpression)
simplifier:=s_simplifyInvocationExpression)
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -8,9 +8,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicExtensionMethodReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Shared ReadOnly s_simplifyInvocationExpression As Func(Of InvocationExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyInvocationExpression
Private Shared Function SimplifyInvocationExpression(
invocationExpression As InvocationExpressionSyntax,
......@@ -59,6 +64,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return rewrittenNode
End Function
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicInferredMemberNameReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitSimpleArgument(node As SimpleArgumentSyntax) As SyntaxNode
......@@ -24,7 +23,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
node,
parentNode:=node.Parent,
newNode:=newNode,
simplifyFunc:=AddressOf SimplifyTupleName)
simplifyFunc:=s_simplifyTupleName)
End If
Return newNode
......@@ -37,8 +36,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
node,
parentNode:=node.Parent,
newNode:=newNode,
simplifyFunc:=AddressOf SimplifyNamedFieldInitializer)
simplifyFunc:=s_simplifyNamedFieldInitializer)
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -14,9 +14,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicInferredMemberNameReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New VisualBasicInferredMemberNameReducer.Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Shared ReadOnly s_simplifyTupleName As Func(Of SimpleArgumentSyntax, SemanticModel, OptionSet, CancellationToken, SimpleArgumentSyntax) = AddressOf SimplifyTupleName
Private Shared Function SimplifyTupleName(
node As SimpleArgumentSyntax,
......@@ -41,6 +46,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return node.WithNameColonEquals(Nothing).WithTriviaFrom(node)
End Function
Private Shared ReadOnly s_simplifyNamedFieldInitializer As Func(Of NamedFieldInitializerSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyNamedFieldInitializer
Private Shared Function SimplifyNamedFieldInitializer(node As NamedFieldInitializerSyntax, arg2 As SemanticModel, arg3 As OptionSet, arg4 As CancellationToken) As SyntaxNode
Dim inferredName = node.Expression.TryGetInferredMemberName()
......@@ -52,4 +59,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SyntaxFactory.InferredFieldInitializer(node.Expression).WithTriviaFrom(node)
End Function
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicMiscellaneousReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitInvocationExpression(node As InvocationExpressionSyntax) As SyntaxNode
......@@ -19,7 +18,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SimplifyExpression(
node,
newNode:=MyBase.VisitInvocationExpression(node),
simplifier:=AddressOf SimplifyInvocationExpression)
simplifier:=s_simplifyInvocationExpression)
End Function
Public Overrides Function VisitObjectCreationExpression(node As ObjectCreationExpressionSyntax) As SyntaxNode
......@@ -28,7 +27,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SimplifyExpression(
node,
newNode:=MyBase.VisitObjectCreationExpression(node),
simplifier:=AddressOf SimplifyObjectCreationExpression)
simplifier:=s_simplifyObjectCreationExpression)
End Function
Public Overrides Function VisitParameter(node As ParameterSyntax) As SyntaxNode
......@@ -38,9 +37,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
node,
newNode:=MyBase.VisitParameter(node),
parentNode:=node.Parent,
simplifyFunc:=AddressOf SimplifyParameter)
simplifyFunc:=s_simplifyParameter)
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -9,9 +9,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicMiscellaneousReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Shared ReadOnly s_simplifyParameter As Func(Of ParameterSyntax, SemanticModel, OptionSet, CancellationToken, ParameterSyntax) = AddressOf SimplifyParameter
Private Shared Function SimplifyParameter(
parameter As ParameterSyntax,
......@@ -28,6 +33,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return parameter
End Function
Private Shared ReadOnly s_simplifyInvocationExpression As Func(Of InvocationExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyInvocationExpression
Private Shared Function SimplifyInvocationExpression(
invocationExpression As InvocationExpressionSyntax,
semanticModel As SemanticModel,
......@@ -49,6 +56,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return invocationExpression
End Function
Private Shared ReadOnly s_simplifyObjectCreationExpression As Func(Of ObjectCreationExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyObjectCreationExpression
Private Shared Function SimplifyObjectCreationExpression(
objectCreationExpression As ObjectCreationExpressionSyntax,
semanticModel As SemanticModel,
......@@ -69,6 +78,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
' We don't know how to simplify this.
Return objectCreationExpression
End Function
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Simplification
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicNameReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitGenericName(node As GenericNameSyntax) As SyntaxNode
......@@ -23,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Dim result = SimplifyExpression(
node,
newNode:=MyBase.VisitGenericName(node),
simplifier:=AddressOf SimplifyName)
simplifier:=s_simplifyName)
Me._alwaysSimplify = oldAlwaysSimplify
......@@ -39,7 +37,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Dim result = SimplifyExpression(
node,
newNode:=MyBase.VisitIdentifierName(node),
simplifier:=AddressOf SimplifyName)
simplifier:=s_simplifyName)
Me._alwaysSimplify = oldAlwaysSimplify
......@@ -55,7 +53,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Dim result = SimplifyExpression(
node,
newNode:=MyBase.VisitQualifiedName(node),
simplifier:=AddressOf SimplifyName)
simplifier:=s_simplifyName)
Me._alwaysSimplify = oldAlwaysSimplify
......@@ -71,7 +69,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Dim result = SimplifyExpression(
node,
newNode:=MyBase.VisitMemberAccessExpression(node),
simplifier:=AddressOf SimplifyName)
simplifier:=s_simplifyName)
Me._alwaysSimplify = oldAlwaysSimplify
......@@ -87,7 +85,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Dim result = SimplifyExpression(
node,
newNode:=MyBase.VisitNullableType(node),
simplifier:=AddressOf SimplifyName)
simplifier:=s_simplifyName)
Me._alwaysSimplify = oldAlwaysSimplify
......@@ -103,13 +101,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Dim result = SimplifyExpression(
node,
newNode:=MyBase.VisitArrayType(node),
simplifier:=AddressOf SimplifyName)
simplifier:=s_simplifyName)
Me._alwaysSimplify = oldAlwaysSimplify
Return result
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -12,9 +12,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicNameReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Shared ReadOnly s_simplifyName As Func(Of ExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyName
Private Overloads Shared Function SimplifyName(
node As ExpressionSyntax,
......@@ -37,6 +42,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
node = node.CopyAnnotationsTo(replacementNode).WithAdditionalAnnotations(Formatter.Annotation)
Return node.WithoutAnnotations(Simplifier.Annotation)
End Function
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicParenthesesReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitParenthesizedExpression(node As ParenthesizedExpressionSyntax) As SyntaxNode
Return SimplifyExpression(
node,
newNode:=MyBase.VisitParenthesizedExpression(node),
simplifier:=AddressOf ReduceParentheses)
simplifier:=s_reduceParentheses)
End Function
End Class
End Class
End Namespace
End Namespace
\ 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.
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicParenthesesReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
End Class
End Namespace
End Namespace
\ 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.
Imports Microsoft.CodeAnalysis.Simplification
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicVariableDeclaratorReducer
Private Class Rewriter
Inherits AbstractExpressionRewriter
Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken)
MyBase.New(optionSet, cancellationToken)
Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(pool)
End Sub
Public Overrides Function VisitVariableDeclarator(node As VariableDeclaratorSyntax) As SyntaxNode
......@@ -19,8 +16,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
node,
newNode:=MyBase.VisitVariableDeclarator(node),
parentNode:=node,
simplifyFunc:=AddressOf SimplifyVariableDeclarator)
simplifyFunc:=s_simplifyVariableDeclarator)
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -11,9 +11,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicVariableDeclaratorReducer
Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter
Return New Rewriter(optionSet, cancellationToken)
End Function
Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Shared ReadOnly s_simplifyVariableDeclarator As Func(Of VariableDeclaratorSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyVariableDeclarator
Private Overloads Shared Function SimplifyVariableDeclarator(
node As VariableDeclaratorSyntax,
......@@ -37,5 +42,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return replacementNode.WithoutAnnotations(Simplifier.Annotation)
End Function
End Class
End Namespace
End Namespace
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册