提交 8e4e29b0 编写于 作者: C CyrusNajmabadi

Pool the simplifiers we create while simplifying code.

上级 71c8e3e2
...@@ -209,22 +209,22 @@ ...@@ -209,22 +209,22 @@
<Compile Include="Rename\CSharpRenameRewriterLanguageService.cs" /> <Compile Include="Rename\CSharpRenameRewriterLanguageService.cs" />
<Compile Include="Rename\LabelConflictVisitor.cs" /> <Compile Include="Rename\LabelConflictVisitor.cs" />
<Compile Include="Rename\LocalConflictVisitor.cs" /> <Compile Include="Rename\LocalConflictVisitor.cs" />
<Compile Include="Simplification\AbstractCSharpReducer.AbstractExpressionRewriter.cs" /> <Compile Include="Simplification\Reducers\AbstractCSharpReducer.AbstractReductionRewriter.cs" />
<Compile Include="Simplification\AbstractCSharpReducer.cs" /> <Compile Include="Simplification\Reducers\AbstractCSharpReducer.cs" />
<Compile Include="Simplification\CSharpCastReducer.cs" /> <Compile Include="Simplification\Reducers\CSharpCastReducer.cs" />
<Compile Include="Simplification\CSharpInferredMemberNameReducer.cs" /> <Compile Include="Simplification\Reducers\CSharpInferredMemberNameReducer.cs" />
<Compile Include="Simplification\CSharpInferredMemberNameReducer.Rewriter.cs" /> <Compile Include="Simplification\Reducers\CSharpInferredMemberNameReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpCastReducer.Rewriter.cs" /> <Compile Include="Simplification\Reducers\CSharpCastReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpEscapingReducer.cs" /> <Compile Include="Simplification\Reducers\CSharpEscapingReducer.cs" />
<Compile Include="Simplification\CSharpEscapingReducer.Rewriter.cs" /> <Compile Include="Simplification\Reducers\CSharpEscapingReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpExtensionMethodReducer.cs" /> <Compile Include="Simplification\Reducers\CSharpExtensionMethodReducer.cs" />
<Compile Include="Simplification\CSharpExtensionMethodReducer.Rewriter.cs" /> <Compile Include="Simplification\Reducers\CSharpExtensionMethodReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpMiscellaneousReducer.cs" /> <Compile Include="Simplification\Reducers\CSharpMiscellaneousReducer.cs" />
<Compile Include="Simplification\CSharpMiscellaneousReducer.Rewriter.cs" /> <Compile Include="Simplification\Reducers\CSharpMiscellaneousReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpNameReducer.cs" /> <Compile Include="Simplification\Reducers\CSharpNameReducer.cs" />
<Compile Include="Simplification\CSharpNameReducer.Rewriter.cs" /> <Compile Include="Simplification\Reducers\CSharpNameReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpParenthesesReducer.cs" /> <Compile Include="Simplification\Reducers\CSharpParenthesesReducer.cs" />
<Compile Include="Simplification\CSharpParenthesesReducer.Rewriter.cs" /> <Compile Include="Simplification\Reducers\CSharpParenthesesReducer.Rewriter.cs" />
<Compile Include="Simplification\CSharpSimplificationService.cs" /> <Compile Include="Simplification\CSharpSimplificationService.cs" />
<Compile Include="Simplification\CSharpSimplificationService.Expander.cs" /> <Compile Include="Simplification\CSharpSimplificationService.Expander.cs" />
<Compile Include="Simplification\CSharpSimplificationService.NodesAndTokensToReduceComputer.cs" /> <Compile Include="Simplification\CSharpSimplificationService.NodesAndTokensToReduceComputer.cs" />
......
...@@ -3524,9 +3524,7 @@ public override SyntaxNode IfStatement(SyntaxNode condition, IEnumerable<SyntaxN ...@@ -3524,9 +3524,7 @@ public override SyntaxNode IfStatement(SyntaxNode condition, IEnumerable<SyntaxN
} }
private BlockSyntax CreateBlock(IEnumerable<SyntaxNode> statements) private BlockSyntax CreateBlock(IEnumerable<SyntaxNode> statements)
{ => SyntaxFactory.Block(AsStatementList(statements)).WithAdditionalAnnotations(Simplifier.Annotation);
return SyntaxFactory.Block(AsStatementList(statements));
}
private SyntaxList<StatementSyntax> AsStatementList(IEnumerable<SyntaxNode> nodes) private SyntaxList<StatementSyntax> AsStatementList(IEnumerable<SyntaxNode> nodes)
{ {
......
...@@ -5,34 +5,51 @@ ...@@ -5,34 +5,51 @@
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal abstract partial class AbstractCSharpReducer internal abstract partial class AbstractCSharpReducer
{ {
protected abstract class AbstractExpressionRewriter : CSharpSyntaxRewriter, IExpressionRewriter protected abstract class AbstractReductionRewriter : CSharpSyntaxRewriter, IReductionRewriter
{ {
private readonly OptionSet _optionSet; private readonly ObjectPool<IReductionRewriter> _pool;
private readonly CancellationToken _cancellationToken;
private readonly HashSet<SyntaxNode> _processedParentNodes; private OptionSet _optionSet;
private CancellationToken _cancellationToken;
private SemanticModel _semanticModel; 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; _optionSet = optionSet;
_cancellationToken = cancellationToken; _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. _pool.Free(this);
// This is e.g. useful in the name simplification, where a whole qualified name is annotated }
protected bool alwaysSimplify;
private static SyntaxNode GetParentNode(SyntaxNode node) private static SyntaxNode GetParentNode(SyntaxNode node)
{ {
...@@ -173,4 +190,4 @@ public SyntaxNodeOrToken VisitNodeOrToken(SyntaxNodeOrToken nodeOrToken, Semanti ...@@ -173,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. // 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 Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal abstract partial class AbstractCSharpReducer : AbstractReducer 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. // 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.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpCastReducer internal partial class CSharpCastReducer
{ {
private class Rewriter : AbstractExpressionRewriter private class Rewriter : AbstractReductionRewriter
{ {
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken) public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(optionSet, cancellationToken) : base(pool)
{ {
} }
...@@ -69,4 +68,4 @@ public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node) ...@@ -69,4 +68,4 @@ public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node)
} }
} }
} }
} }
\ No newline at end of file
...@@ -8,14 +8,17 @@ ...@@ -8,14 +8,17 @@
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpCastReducer : AbstractCSharpReducer 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 readonly Func<CastExpressionSyntax, SemanticModel, OptionSet, CancellationToken, ExpressionSyntax> s_simplifyCast = SimplifyCast;
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // 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 Roslyn.Utilities;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpEscapingReducer internal partial class CSharpEscapingReducer
{ {
private class Rewriter : AbstractExpressionRewriter private class Rewriter : AbstractReductionRewriter
{ {
public Rewriter(CSharpEscapingReducer escapingSimplifierService, OptionSet optionSet, CancellationToken cancellationToken) public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(optionSet, cancellationToken) : base(pool)
{ {
_escapingSimplifierService = escapingSimplifierService;
} }
private readonly CSharpEscapingReducer _escapingSimplifierService;
public override SyntaxToken VisitToken(SyntaxToken token) public override SyntaxToken VisitToken(SyntaxToken token)
{ {
var newToken = base.VisitToken(token); var newToken = base.VisitToken(token);
......
...@@ -8,14 +8,17 @@ ...@@ -8,14 +8,17 @@
using Microsoft.CodeAnalysis.CSharp.Utilities; using Microsoft.CodeAnalysis.CSharp.Utilities;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpEscapingReducer : AbstractCSharpReducer 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 static Func<SyntaxToken, SemanticModel, OptionSet, CancellationToken, SyntaxToken> s_simplifyIdentifierToken = SimplifyIdentifierToken; private static Func<SyntaxToken, SemanticModel, OptionSet, CancellationToken, SyntaxToken> s_simplifyIdentifierToken = SimplifyIdentifierToken;
...@@ -132,4 +135,4 @@ private static SyntaxToken CreateNewIdentifierTokenFromToken(SyntaxToken origina ...@@ -132,4 +135,4 @@ private static SyntaxToken CreateNewIdentifierTokenFromToken(SyntaxToken origina
: originalToken.CopyAnnotationsTo(SyntaxFactory.Identifier(originalToken.LeadingTrivia, SyntaxKind.IdentifierToken, unescapedText, originalToken.ValueText, originalToken.TrailingTrivia)); : 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. // 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.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options; using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpExtensionMethodReducer internal partial class CSharpExtensionMethodReducer
{ {
private class Rewriter : AbstractExpressionRewriter private class Rewriter : AbstractReductionRewriter
{ {
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken) public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(optionSet, cancellationToken) : base(pool)
{ {
} }
......
...@@ -8,14 +8,17 @@ ...@@ -8,14 +8,17 @@
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpExtensionMethodReducer : AbstractCSharpReducer 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 readonly Func<InvocationExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyExtensionMethod = SimplifyExtensionMethod;
...@@ -67,19 +70,19 @@ private static InvocationExpressionSyntax TryReduceExtensionMethod(InvocationExp ...@@ -67,19 +70,19 @@ private static InvocationExpressionSyntax TryReduceExtensionMethod(InvocationExp
{ {
newMemberAccess = SyntaxFactory.MemberAccessExpression( newMemberAccess = SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression, expression, SyntaxKind.SimpleMemberAccessExpression, expression,
((MemberAccessExpressionSyntax)invocationExpressionNodeExpression).OperatorToken, ((MemberAccessExpressionSyntax)invocationExpressionNodeExpression).OperatorToken,
((MemberAccessExpressionSyntax)invocationExpressionNodeExpression).Name); ((MemberAccessExpressionSyntax)invocationExpressionNodeExpression).Name);
} }
else if (node.Expression.Kind() == SyntaxKind.IdentifierName) else if (node.Expression.Kind() == SyntaxKind.IdentifierName)
{ {
newMemberAccess = SyntaxFactory.MemberAccessExpression( newMemberAccess = SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression, expression, SyntaxKind.SimpleMemberAccessExpression, expression,
(IdentifierNameSyntax)invocationExpressionNodeExpression.WithoutLeadingTrivia()); (IdentifierNameSyntax)invocationExpressionNodeExpression.WithoutLeadingTrivia());
} }
else if (node.Expression.Kind() == SyntaxKind.GenericName) else if (node.Expression.Kind() == SyntaxKind.GenericName)
{ {
newMemberAccess = SyntaxFactory.MemberAccessExpression( newMemberAccess = SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression, expression, SyntaxKind.SimpleMemberAccessExpression, expression,
(GenericNameSyntax)invocationExpressionNodeExpression.WithoutLeadingTrivia()); (GenericNameSyntax)invocationExpressionNodeExpression.WithoutLeadingTrivia());
} }
else else
...@@ -122,4 +125,4 @@ private static InvocationExpressionSyntax TryReduceExtensionMethod(InvocationExp ...@@ -122,4 +125,4 @@ private static InvocationExpressionSyntax TryReduceExtensionMethod(InvocationExp
return rewrittenNode; 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. // 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.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options; using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpInferredMemberNameReducer internal partial class CSharpInferredMemberNameReducer
{ {
private class Rewriter : AbstractExpressionRewriter private class Rewriter : AbstractReductionRewriter
{ {
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken) public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(optionSet, cancellationToken) : base(pool)
{ {
} }
...@@ -42,4 +40,4 @@ public override SyntaxNode VisitAnonymousObjectMemberDeclarator(AnonymousObjectM ...@@ -42,4 +40,4 @@ public override SyntaxNode VisitAnonymousObjectMemberDeclarator(AnonymousObjectM
} }
} }
} }
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
using Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
...@@ -15,9 +16,11 @@ namespace Microsoft.CodeAnalysis.CSharp.Simplification ...@@ -15,9 +16,11 @@ namespace Microsoft.CodeAnalysis.CSharp.Simplification
/// </summary> /// </summary>
internal partial class CSharpInferredMemberNameReducer : AbstractCSharpReducer 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 readonly Func<ArgumentSyntax, SemanticModel, OptionSet, CancellationToken, ArgumentSyntax> s_simplifyTupleName = SimplifyTupleName;
...@@ -59,4 +62,4 @@ private static SyntaxNode SimplifyAnonymousTypeMemberName(AnonymousObjectMemberD ...@@ -59,4 +62,4 @@ private static SyntaxNode SimplifyAnonymousTypeMemberName(AnonymousObjectMemberD
return node.WithNameEquals(null).WithTriviaFrom(node); 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. // 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.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options; using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpMiscellaneousReducer internal partial class CSharpMiscellaneousReducer
{ {
private class Rewriter : AbstractExpressionRewriter private class Rewriter : AbstractReductionRewriter
{ {
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken) public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(optionSet, cancellationToken) : base(pool)
{ {
} }
......
...@@ -8,14 +8,17 @@ ...@@ -8,14 +8,17 @@
using Microsoft.CodeAnalysis.CSharp.Utilities; using Microsoft.CodeAnalysis.CSharp.Utilities;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpMiscellaneousReducer : AbstractCSharpReducer 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( private static bool CanRemoveTypeFromParameter(
...@@ -101,4 +104,4 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet ...@@ -101,4 +104,4 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet
return node; 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. // 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.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting; using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpNameReducer internal partial class CSharpNameReducer
{ {
private class Rewriter : AbstractExpressionRewriter private class Rewriter : AbstractReductionRewriter
{ {
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken) public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(optionSet, cancellationToken) : base(pool)
{ {
} }
...@@ -201,4 +199,4 @@ public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node) ...@@ -201,4 +199,4 @@ public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node)
} }
} }
} }
} }
\ No newline at end of file
...@@ -8,14 +8,17 @@ ...@@ -8,14 +8,17 @@
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Simplification;
using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpNameReducer : AbstractCSharpReducer 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 readonly Func<SyntaxNode, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyName = SimplifyName;
...@@ -54,4 +57,4 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet ...@@ -54,4 +57,4 @@ public override IExpressionRewriter CreateExpressionRewriter(OptionSet optionSet
return node.WithoutAnnotations(Simplifier.Annotation); 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. // 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.CSharp.Syntax;
using Microsoft.CodeAnalysis.Options; using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpParenthesesReducer internal partial class CSharpParenthesesReducer
{ {
private class Rewriter : AbstractExpressionRewriter private class Rewriter : AbstractReductionRewriter
{ {
public Rewriter(OptionSet optionSet, CancellationToken cancellationToken) public Rewriter(ObjectPool<IReductionRewriter> pool)
: base(optionSet, cancellationToken) : base(pool)
{ {
} }
......
...@@ -8,14 +8,17 @@ ...@@ -8,14 +8,17 @@
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Simplification; using Microsoft.CodeAnalysis.Simplification;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Simplification namespace Microsoft.CodeAnalysis.CSharp.Simplification
{ {
internal partial class CSharpParenthesesReducer : AbstractCSharpReducer 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 readonly Func<ParenthesizedExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode> s_simplifyParentheses = SimplifyParentheses;
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // 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 namespace Microsoft.CodeAnalysis.Simplification
{ {
internal abstract partial class AbstractReducer 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); SyntaxNodeOrToken VisitNodeOrToken(SyntaxNodeOrToken nodeOrTokenToReduce, SemanticModel semanticModel, bool simplifyAllDescendants);
bool HasMoreWork { get; } 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. // 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 Roslyn.Utilities;
using Microsoft.CodeAnalysis.Options;
namespace Microsoft.CodeAnalysis.Simplification namespace Microsoft.CodeAnalysis.Simplification
{ {
internal abstract partial class AbstractReducer 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 ...@@ -163,7 +163,7 @@ protected virtual SyntaxNode TransformReducedNode(SyntaxNode reducedNode, Syntax
Document document, Document document,
SyntaxNode root, SyntaxNode root,
ImmutableArray<NodeOrTokenToReduce> nodesAndTokensToReduce, ImmutableArray<NodeOrTokenToReduce> nodesAndTokensToReduce,
IEnumerable<AbstractReducer> reducers, ImmutableArray<AbstractReducer> reducers,
OptionSet optionSet, OptionSet optionSet,
SemanticModel semanticModel, SemanticModel semanticModel,
ConcurrentDictionary<SyntaxNode, SyntaxNode> reducedNodesMap, ConcurrentDictionary<SyntaxNode, SyntaxNode> reducedNodesMap,
...@@ -178,89 +178,92 @@ protected virtual SyntaxNode TransformReducedNode(SyntaxNode reducedNode, Syntax ...@@ -178,89 +178,92 @@ protected virtual SyntaxNode TransformReducedNode(SyntaxNode reducedNode, Syntax
{ {
var nodeOrTokenToReduce = nodesAndTokensToReduce[i]; var nodeOrTokenToReduce = nodesAndTokensToReduce[i];
simplifyTasks[i] = Task.Run(async () => 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); foreach (var reducer in reducers)
do
{ {
if (currentNodeOrToken.SyntaxTree != semanticModelForReduce.SyntaxTree) cancellationToken.ThrowIfCancellationRequested();
{
// 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 ? using (var rewriter = reducer.GetOrCreateRewriter())
nodeOrToken.Parent.ReplaceNode(nodeOrToken.AsNode(), currentNodeOrToken.AsNode()) : {
nodeOrToken.Parent.ReplaceToken(nodeOrToken.AsToken(), currentNodeOrToken.AsToken()); rewriter.Initialize(optionSet, cancellationToken);
currentNodeOrToken = replacedParent
.ChildNodesAndTokens()
.Single((c) => c.HasAnnotation(annotation));
}
if (isNode) do
{ {
var currentNode = currentNodeOrToken.AsNode(); if (currentNodeOrToken.SyntaxTree != semanticModelForReduce.SyntaxTree)
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. // currentNodeOrToken was simplified either by a previous reducer or
semanticModelForReduce = GetSpeculativeSemanticModel(ref currentNode, semanticModel, nodeOrToken.AsNode()); // a previous iteration of the current reducer.
currentNodeOrToken = currentNode; // 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 nodeOrToken was simplified, add it to the appropriate dictionary of replaced nodes/tokens.
if (currentNodeOrToken != nodeOrToken) if (currentNodeOrToken != nodeOrToken)
{
if (isNode)
{
reducedNodesMap[nodeOrToken.AsNode()] = currentNodeOrToken.AsNode();
}
else
{ {
reducedTokensMap[nodeOrToken.AsToken()] = currentNodeOrToken.AsToken(); if (isNode)
{
reducedNodesMap[nodeOrToken.AsNode()] = currentNodeOrToken.AsNode();
}
else
{
reducedTokensMap[nodeOrToken.AsToken()] = currentNodeOrToken.AsToken();
}
} }
} }, cancellationToken);
}, cancellationToken);
} }
return Task.WhenAll(simplifyTasks); return Task.WhenAll(simplifyTasks);
......
...@@ -184,29 +184,29 @@ ...@@ -184,29 +184,29 @@
<Compile Include="Rename\LocalConflictVisitor.vb" /> <Compile Include="Rename\LocalConflictVisitor.vb" />
<Compile Include="Rename\VisualBasicRenameRewriterLanguageService.vb" /> <Compile Include="Rename\VisualBasicRenameRewriterLanguageService.vb" />
<Compile Include="Rename\VisualBasicRenameRewriterLanguageServiceFactory.vb" /> <Compile Include="Rename\VisualBasicRenameRewriterLanguageServiceFactory.vb" />
<Compile Include="Simplification\AbstractVisualBasicReducer.vb" /> <Compile Include="Simplification\Reducers\AbstractVisualBasicReducer.AbstractReductionRewriter.vb" />
<Compile Include="Simplification\AbstractVisualBasicSimplifier.AbstractExpressionRewriter.vb" /> <Compile Include="Simplification\Reducers\AbstractVisualBasicReducer.vb" />
<Compile Include="Simplification\VisualBasicCallReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicCallReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicCallReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicCallReducer.vb" />
<Compile Include="Simplification\VisualBasicCastReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicCastReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicCastReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicCastReducer.vb" />
<Compile Include="Simplification\VisualBasicInferredMemberNameReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicInferredMemberNameReducer.vb" />
<Compile Include="Simplification\VisualBasicInferredMemberNameReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicInferredMemberNameReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicEscapingReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicEscapingReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicEscapingReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicEscapingReducer.vb" />
<Compile Include="Simplification\VisualBasicExtensionMethodReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicExtensionMethodReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicExtensionMethodReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicExtensionMethodReducer.vb" />
<Compile Include="Simplification\VisualBasicMiscellaneousReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicMiscellaneousReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicMiscellaneousReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicMiscellaneousReducer.vb" />
<Compile Include="Simplification\VisualBasicNameReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicNameReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicNameReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicNameReducer.vb" />
<Compile Include="Simplification\VisualBasicParenthesesReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicParenthesesReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicParenthesesReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicParenthesesReducer.vb" />
<Compile Include="Simplification\VisualBasicSimplificationService.Expander.vb" /> <Compile Include="Simplification\VisualBasicSimplificationService.Expander.vb" />
<Compile Include="Simplification\VisualBasicSimplificationService.NodesAndTokensToReduceComputer.vb" /> <Compile Include="Simplification\VisualBasicSimplificationService.NodesAndTokensToReduceComputer.vb" />
<Compile Include="Simplification\VisualBasicSimplificationService.vb" /> <Compile Include="Simplification\VisualBasicSimplificationService.vb" />
<Compile Include="Simplification\VisualBasicVariableDeclaratorReducer.Rewriter.vb" /> <Compile Include="Simplification\Reducers\VisualBasicVariableDeclaratorReducer.Rewriter.vb" />
<Compile Include="Simplification\VisualBasicVariableDeclaratorReducer.vb" /> <Compile Include="Simplification\Reducers\VisualBasicVariableDeclaratorReducer.vb" />
<Compile Include="Utilities\DirectiveSyntaxEqualityComparer.vb" /> <Compile Include="Utilities\DirectiveSyntaxEqualityComparer.vb" />
<Compile Include="Utilities\DirectiveWalker.vb" /> <Compile Include="Utilities\DirectiveWalker.vb" />
<Compile Include="Utilities\ImportsClauseComparer.vb" /> <Compile Include="Utilities\ImportsClauseComparer.vb" />
......
...@@ -7,25 +7,43 @@ Imports Microsoft.CodeAnalysis.VisualBasic.Syntax ...@@ -7,25 +7,43 @@ Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend MustInherit Class AbstractVisualBasicReducer Partial Friend MustInherit Class AbstractVisualBasicReducer
Friend MustInherit Class AbstractExpressionRewriter Friend MustInherit Class AbstractReductionRewriter
Inherits VisualBasicSyntaxRewriter 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 Private _hasMoreWork As Boolean
Protected _alwaysSimplify As Boolean Protected _alwaysSimplify As Boolean
Private ReadOnly _simplificationOptions As OptionSet
Private _semanticModel As SemanticModel
Protected Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Protected Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New() _pool = pool
Me.CancellationToken = cancellationToken End Sub
Me._simplificationOptions = optionSet
_processedParentNodes = New HashSet(Of SyntaxNode) 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 End Sub
Public ReadOnly Property HasMoreWork As Boolean Implements IExpressionRewriter.HasMoreWork Public ReadOnly Property HasMoreWork As Boolean Implements IReductionRewriter.HasMoreWork
Get Get
Return _hasMoreWork Return _hasMoreWork
End Get End Get
...@@ -140,8 +158,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -140,8 +158,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SimplifyNode(statement, newNode, GetParentNode(statement), simplifier) Return SimplifyNode(statement, newNode, GetParentNode(statement), simplifier)
End Function End Function
Public Function VisitNodeOrToken(nodeOrToken As SyntaxNodeOrToken, semanticModel As SemanticModel, simplifyAllDescendants As Boolean) As SyntaxNodeOrToken Implements IExpressionRewriter.VisitNodeOrToken Public Function VisitNodeOrToken(nodeOrToken As SyntaxNodeOrToken, semanticModel As SemanticModel, simplifyAllDescendants As Boolean) As SyntaxNodeOrToken Implements IReductionRewriter.VisitNodeOrToken
_semanticModel = DirectCast(semanticModel, semanticModel) _semanticModel = DirectCast(semanticModel, SemanticModel)
_alwaysSimplify = simplifyAllDescendants _alwaysSimplify = simplifyAllDescendants
_hasMoreWork = False _hasMoreWork = False
_processedParentNodes.Clear() _processedParentNodes.Clear()
...@@ -186,4 +204,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -186,4 +204,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
End Function End Function
End Class End Class
End Class End Class
End Namespace End Namespace
\ No newline at end of file
...@@ -9,6 +9,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -9,6 +9,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend MustInherit Class AbstractVisualBasicReducer Partial Friend MustInherit Class AbstractVisualBasicReducer
Inherits AbstractReducer 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 ReadOnly s_reduceParentheses As Func(Of ParenthesizedExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf ReduceParentheses
Protected Shared Function ReduceParentheses( Protected Shared Function ReduceParentheses(
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. ' 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 Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicCallReducer Partial Friend Class VisualBasicCallReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitCallStatement(node As CallStatementSyntax) As SyntaxNode Public Overrides Function VisitCallStatement(node As CallStatementSyntax) As SyntaxNode
......
...@@ -9,9 +9,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -9,9 +9,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicCallReducer Partial Friend Class VisualBasicCallReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
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 ReadOnly s_simplifyCallStatement As Func(Of CallStatementSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyCallStatement
...@@ -36,6 +39,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -36,6 +39,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
' We don't know how to simplify this. ' We don't know how to simplify this.
Return callStatement Return callStatement
End Function 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. ' 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 Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicCastReducer Partial Friend Class VisualBasicCastReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitCTypeExpression(node As CTypeExpressionSyntax) As SyntaxNode Public Overrides Function VisitCTypeExpression(node As CTypeExpressionSyntax) As SyntaxNode
......
...@@ -9,9 +9,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -9,9 +9,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicCastReducer Partial Friend Class VisualBasicCastReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
Public Sub New()
MyBase.New(s_pool)
End Sub
Private Overloads Shared Function SimplifyCast( Private Overloads Shared Function SimplifyCast(
castNode As ExpressionSyntax, castNode As ExpressionSyntax,
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. ' 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 System.Threading
Imports Microsoft.CodeAnalysis.Options
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicEscapingReducer Partial Friend Class VisualBasicEscapingReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitToken(token As SyntaxToken) As SyntaxToken Public Overrides Function VisitToken(token As SyntaxToken) As SyntaxToken
...@@ -20,7 +19,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -20,7 +19,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
newToken:=MyBase.VisitToken(token), newToken:=MyBase.VisitToken(token),
simplifyFunc:=AddressOf TryUnescapeToken) simplifyFunc:=AddressOf TryUnescapeToken)
End Function End Function
End Class End Class
End Class End Class
End Namespace End Namespace
\ No newline at end of file
...@@ -3,17 +3,18 @@ ...@@ -3,17 +3,18 @@
Imports System.Threading Imports System.Threading
Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Options Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Simplification
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicEscapingReducer Partial Friend Class VisualBasicEscapingReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New VisualBasicEscapingReducer.Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
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 Private Shared Function TryUnescapeToken(identifier As SyntaxToken, semanticModel As SemanticModel, optionSet As OptionSet, cancellationToken As CancellationToken) As SyntaxToken
If Not identifier.IsBracketed Then If Not identifier.IsBracketed Then
...@@ -216,4 +217,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -216,4 +217,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return False Return False
End Function 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. ' 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 System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicExtensionMethodReducer Partial Friend Class VisualBasicExtensionMethodReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitInvocationExpression(node As InvocationExpressionSyntax) As SyntaxNode Public Overrides Function VisitInvocationExpression(node As InvocationExpressionSyntax) As SyntaxNode
......
...@@ -8,9 +8,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -8,9 +8,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicExtensionMethodReducer Partial Friend Class VisualBasicExtensionMethodReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
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 ReadOnly s_simplifyInvocationExpression As Func(Of InvocationExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyInvocationExpression
...@@ -61,6 +64,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -61,6 +64,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return rewrittenNode Return rewrittenNode
End Function 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. ' 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 System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicInferredMemberNameReducer Partial Friend Class VisualBasicInferredMemberNameReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitSimpleArgument(node As SimpleArgumentSyntax) As SyntaxNode Public Overrides Function VisitSimpleArgument(node As SimpleArgumentSyntax) As SyntaxNode
...@@ -41,4 +40,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -41,4 +40,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
End Function End Function
End Class End Class
End Class End Class
End Namespace End Namespace
\ No newline at end of file
...@@ -14,9 +14,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -14,9 +14,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicInferredMemberNameReducer Partial Friend Class VisualBasicInferredMemberNameReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New VisualBasicInferredMemberNameReducer.Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
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 ReadOnly s_simplifyTupleName As Func(Of SimpleArgumentSyntax, SemanticModel, OptionSet, CancellationToken, SimpleArgumentSyntax) = AddressOf SimplifyTupleName
...@@ -56,4 +59,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -56,4 +59,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return SyntaxFactory.InferredFieldInitializer(node.Expression).WithTriviaFrom(node) Return SyntaxFactory.InferredFieldInitializer(node.Expression).WithTriviaFrom(node)
End Function 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. ' 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 System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicMiscellaneousReducer Partial Friend Class VisualBasicMiscellaneousReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitInvocationExpression(node As InvocationExpressionSyntax) As SyntaxNode Public Overrides Function VisitInvocationExpression(node As InvocationExpressionSyntax) As SyntaxNode
......
...@@ -9,9 +9,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -9,9 +9,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicMiscellaneousReducer Partial Friend Class VisualBasicMiscellaneousReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
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 ReadOnly s_simplifyParameter As Func(Of ParameterSyntax, SemanticModel, OptionSet, CancellationToken, ParameterSyntax) = AddressOf SimplifyParameter
...@@ -75,6 +78,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -75,6 +78,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
' We don't know how to simplify this. ' We don't know how to simplify this.
Return objectCreationExpression Return objectCreationExpression
End Function 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. ' 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.Simplification
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicNameReducer Partial Friend Class VisualBasicNameReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitGenericName(node As GenericNameSyntax) As SyntaxNode Public Overrides Function VisitGenericName(node As GenericNameSyntax) As SyntaxNode
...@@ -109,7 +107,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -109,7 +107,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return result Return result
End Function End Function
End Class End Class
End Class End Class
End Namespace End Namespace
\ No newline at end of file
...@@ -12,9 +12,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -12,9 +12,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicNameReducer Partial Friend Class VisualBasicNameReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
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 Shared ReadOnly s_simplifyName As Func(Of ExpressionSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyName
...@@ -39,6 +42,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -39,6 +42,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
node = node.CopyAnnotationsTo(replacementNode).WithAdditionalAnnotations(Formatter.Annotation) node = node.CopyAnnotationsTo(replacementNode).WithAdditionalAnnotations(Formatter.Annotation)
Return node.WithoutAnnotations(Simplifier.Annotation) Return node.WithoutAnnotations(Simplifier.Annotation)
End Function 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. ' 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 Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicParenthesesReducer Partial Friend Class VisualBasicParenthesesReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitParenthesizedExpression(node As ParenthesizedExpressionSyntax) As SyntaxNode Public Overrides Function VisitParenthesizedExpression(node As ParenthesizedExpressionSyntax) As SyntaxNode
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. ' 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 Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicParenthesesReducer Partial Friend Class VisualBasicParenthesesReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
Public Sub New()
MyBase.New(s_pool)
End Sub
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. ' 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 Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicVariableDeclaratorReducer Partial Friend Class VisualBasicVariableDeclaratorReducer
Private Class Rewriter Private Class Rewriter
Inherits AbstractExpressionRewriter Inherits AbstractReductionRewriter
Public Sub New(optionSet As OptionSet, cancellationToken As CancellationToken) Public Sub New(pool As ObjectPool(Of IReductionRewriter))
MyBase.New(optionSet, cancellationToken) MyBase.New(pool)
End Sub End Sub
Public Overrides Function VisitVariableDeclarator(node As VariableDeclaratorSyntax) As SyntaxNode Public Overrides Function VisitVariableDeclarator(node As VariableDeclaratorSyntax) As SyntaxNode
...@@ -23,4 +20,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -23,4 +20,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
End Function End Function
End Class End Class
End Class End Class
End Namespace End Namespace
\ No newline at end of file
...@@ -11,9 +11,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -11,9 +11,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Partial Friend Class VisualBasicVariableDeclaratorReducer Partial Friend Class VisualBasicVariableDeclaratorReducer
Inherits AbstractVisualBasicReducer Inherits AbstractVisualBasicReducer
Public Overrides Function CreateExpressionRewriter(optionSet As OptionSet, cancellationToken As CancellationToken) As IExpressionRewriter Private Shared ReadOnly s_pool As ObjectPool(Of IReductionRewriter) =
Return New Rewriter(optionSet, cancellationToken) New ObjectPool(Of IReductionRewriter)(Function() New Rewriter(s_pool))
End Function
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 Shared ReadOnly s_simplifyVariableDeclarator As Func(Of VariableDeclaratorSyntax, SemanticModel, OptionSet, CancellationToken, SyntaxNode) = AddressOf SimplifyVariableDeclarator
...@@ -39,5 +42,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification ...@@ -39,5 +42,4 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Return replacementNode.WithoutAnnotations(Simplifier.Annotation) Return replacementNode.WithoutAnnotations(Simplifier.Annotation)
End Function End Function
End Class 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.
先完成此消息的编辑!
想要评论请 注册