From 6dfd47f701064ea847b4a021e62f1bc661fbc86e Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Tue, 9 Jan 2018 16:23:24 -0800 Subject: [PATCH] Remove CSharp/VBOperation cloners. --- .../Portable/Compilation/CSharpSemanticModel.cs | 5 ----- .../Portable/Operations/CSharpOperationCloner.cs | 11 ----------- .../Portable/Operations/CSharpOperationFactory.cs | 2 +- .../Core/Portable/Compilation/SemanticModel.cs | 7 ------- .../Core/Portable/Operations/OperationCloner.cs | 15 +++++++++++++-- .../Portable/Compilation/SemanticModel.vb | 4 ---- .../Operations/VisualBasicOperationCloner.vb | 10 ---------- .../Operations/VisualBasicOperationFactory.vb | 2 +- src/Test/Utilities/Portable/CommonTestBase.cs | 2 +- 9 files changed, 16 insertions(+), 42 deletions(-) delete mode 100644 src/Compilers/CSharp/Portable/Operations/CSharpOperationCloner.cs delete mode 100644 src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationCloner.vb diff --git a/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs b/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs index 24f3baba16a..1492dfcf82f 100644 --- a/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs +++ b/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs @@ -474,11 +474,6 @@ internal virtual IOperation GetOperationWorker(CSharpSyntaxNode node, Cancellati return null; } - internal override IOperation CloneOperationCore(IOperation operation) - { - return CSharpOperationCloner.Instance.Visit(operation); - } - #region GetSymbolInfo /// diff --git a/src/Compilers/CSharp/Portable/Operations/CSharpOperationCloner.cs b/src/Compilers/CSharp/Portable/Operations/CSharpOperationCloner.cs deleted file mode 100644 index 5ac0dd30a9e..00000000000 --- a/src/Compilers/CSharp/Portable/Operations/CSharpOperationCloner.cs +++ /dev/null @@ -1,11 +0,0 @@ -// 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.Operations; - -namespace Microsoft.CodeAnalysis.CSharp -{ - internal class CSharpOperationCloner : OperationCloner - { - public static OperationCloner Instance { get; } = new CSharpOperationCloner(); - } -} diff --git a/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs b/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs index 481c2f86093..0611572d822 100644 --- a/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs +++ b/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs @@ -36,7 +36,7 @@ public IOperation Create(BoundNode boundNode) // always return cloned one if (boundNode.Kind == BoundKind.ImplicitReceiver) { - return _semanticModel.CloneOperation(CreateInternal(boundNode)); + return OperationCloner.CloneOperation(CreateInternal(boundNode)); } return _cache.GetOrAdd(boundNode, n => CreateInternal(n)); diff --git a/src/Compilers/Core/Portable/Compilation/SemanticModel.cs b/src/Compilers/Core/Portable/Compilation/SemanticModel.cs index 6fbc98d0b33..b1ebb58fdcb 100644 --- a/src/Compilers/Core/Portable/Compilation/SemanticModel.cs +++ b/src/Compilers/Core/Portable/Compilation/SemanticModel.cs @@ -86,13 +86,6 @@ public IOperation GetOperation(SyntaxNode node, CancellationToken cancellationTo protected abstract IOperation GetOperationCore(SyntaxNode node, CancellationToken cancellationToken); - /// - /// Deep Clone given IOperation - /// - internal T CloneOperation(T operation) where T : IOperation => (T)CloneOperationCore(operation); - - internal abstract IOperation CloneOperationCore(IOperation operation); - /// /// Returns true if this is a SemanticModel that ignores accessibility rules when answering semantic questions. /// diff --git a/src/Compilers/Core/Portable/Operations/OperationCloner.cs b/src/Compilers/Core/Portable/Operations/OperationCloner.cs index 228345de8f2..d6118f0641b 100644 --- a/src/Compilers/Core/Portable/Operations/OperationCloner.cs +++ b/src/Compilers/Core/Portable/Operations/OperationCloner.cs @@ -1,13 +1,24 @@ // 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.Collections.Immutable; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.Operations { - internal abstract class OperationCloner : OperationVisitor + internal sealed class OperationCloner : OperationVisitor { - protected T Visit(T node) where T : IOperation + private static readonly Lazy _lazyInstance = new Lazy(() => new OperationCloner()); + + /// + /// Deep clone given IOperation + /// + public static T CloneOperation(T operation) where T : IOperation + { + return _lazyInstance.Value.Visit(operation); + } + + private T Visit(T node) where T : IOperation { return (T)Visit(node, argument: null); } diff --git a/src/Compilers/VisualBasic/Portable/Compilation/SemanticModel.vb b/src/Compilers/VisualBasic/Portable/Compilation/SemanticModel.vb index e1705d90fcc..13ffbe720c1 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/SemanticModel.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/SemanticModel.vb @@ -143,10 +143,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Return Nothing End Function - Friend Overrides Function CloneOperationCore(operation As IOperation) As IOperation - Return VisualBasicOperationCloner.Instance.Visit(operation) - End Function - ''' ''' Returns what symbol(s), if any, the given expression syntax bound to in the program. ''' diff --git a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationCloner.vb b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationCloner.vb deleted file mode 100644 index b1b2a6bdbe7..00000000000 --- a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationCloner.vb +++ /dev/null @@ -1,10 +0,0 @@ -' 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.Operations - -Namespace Microsoft.CodeAnalysis.VisualBasic - Friend Class VisualBasicOperationCloner - Inherits OperationCloner - - Public Shared ReadOnly Property Instance As OperationCloner = New VisualBasicOperationCloner() - End Class -End Namespace diff --git a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb index 3edd0a5bebe..b2a116d019e 100644 --- a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb +++ b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb @@ -32,7 +32,7 @@ Namespace Microsoft.CodeAnalysis.Operations ' since same bound node appears in multiple places in the tree ' we can't use bound node to operation map. ' for now, we will just create new operation and return cloned - Return _semanticModel.CloneOperation(CreateInternal(boundNode)) + Return OperationCloner.CloneOperation(CreateInternal(boundNode)) End If ' A BoundUserDefined conversion is always the operand of a BoundConversion, and is handled diff --git a/src/Test/Utilities/Portable/CommonTestBase.cs b/src/Test/Utilities/Portable/CommonTestBase.cs index fef4e561410..b794f06ee64 100644 --- a/src/Test/Utilities/Portable/CommonTestBase.cs +++ b/src/Test/Utilities/Portable/CommonTestBase.cs @@ -618,7 +618,7 @@ internal static void VerifyClone(SemanticModel model) continue; } - var clonedOperation = model.CloneOperation(operation); + var clonedOperation = OperationCloner.CloneOperation(operation); // check whether cloned IOperation is same as original one var original = OperationTreeVerifier.GetOperationTree(model.Compilation, operation); -- GitLab