Skip to content

Commit 0985fc2

Browse files
Remove descendent node tracking from SyntaxEditor
1 parent 1e5af59 commit 0985fc2

File tree

1 file changed

+10
-105
lines changed

1 file changed

+10
-105
lines changed

src/Workspaces/Core/Portable/Editing/SyntaxEditor.cs

Lines changed: 10 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ public class SyntaxEditor
1818
{
1919
private readonly SyntaxGenerator _generator;
2020
private readonly List<Change> _changes = new();
21-
private bool _allowEditsOnLazilyCreatedTrackedNewNodes;
22-
private HashSet<SyntaxNode>? _lazyTrackedNewNodesOpt;
2321

2422
/// <summary>
2523
/// Creates a new <see cref="SyntaxEditor"/> instance.
@@ -53,32 +51,6 @@ internal SyntaxEditor(SyntaxNode root, SyntaxGenerator generator)
5351
_generator = generator;
5452
}
5553

56-
[return: NotNullIfNotNull(nameof(node))]
57-
private SyntaxNode? ApplyTrackingToNewNode(SyntaxNode? node)
58-
{
59-
if (node == null)
60-
{
61-
return null;
62-
}
63-
64-
_lazyTrackedNewNodesOpt ??= new HashSet<SyntaxNode>();
65-
foreach (var descendant in node.DescendantNodesAndSelf())
66-
{
67-
_lazyTrackedNewNodesOpt.Add(descendant);
68-
}
69-
70-
return node.TrackNodes(node.DescendantNodesAndSelf());
71-
}
72-
73-
private IEnumerable<SyntaxNode> ApplyTrackingToNewNodes(IEnumerable<SyntaxNode> nodes)
74-
{
75-
foreach (var node in nodes)
76-
{
77-
var result = ApplyTrackingToNewNode(node);
78-
yield return result;
79-
}
80-
}
81-
8254
/// <summary>
8355
/// The <see cref="SyntaxNode"/> that was specified when the <see cref="SyntaxEditor"/> was constructed.
8456
/// </summary>
@@ -99,9 +71,7 @@ public SyntaxNode GetChangedRoot()
9971
var newRoot = OriginalRoot.TrackNodes(nodes);
10072

10173
foreach (var change in _changes)
102-
{
10374
newRoot = change.Apply(newRoot, _generator);
104-
}
10575

10676
return newRoot;
10777
}
@@ -143,36 +113,27 @@ public void ReplaceNode(SyntaxNode node, Func<SyntaxNode, SyntaxGenerator, Synta
143113
{
144114
CheckNodeInOriginalTreeOrTracked(node);
145115
if (computeReplacement == null)
146-
{
147116
throw new ArgumentNullException(nameof(computeReplacement));
148-
}
149117

150-
_allowEditsOnLazilyCreatedTrackedNewNodes = true;
151-
_changes.Add(new ReplaceChange(node, computeReplacement, this));
118+
_changes.Add(new ReplaceChange(node, computeReplacement));
152119
}
153120

154121
internal void ReplaceNode(SyntaxNode node, Func<SyntaxNode, SyntaxGenerator, IEnumerable<SyntaxNode>> computeReplacement)
155122
{
156123
CheckNodeInOriginalTreeOrTracked(node);
157124
if (computeReplacement == null)
158-
{
159125
throw new ArgumentNullException(nameof(computeReplacement));
160-
}
161126

162-
_allowEditsOnLazilyCreatedTrackedNewNodes = true;
163-
_changes.Add(new ReplaceWithCollectionChange(node, computeReplacement, this));
127+
_changes.Add(new ReplaceWithCollectionChange(node, computeReplacement));
164128
}
165129

166130
internal void ReplaceNode<TArgument>(SyntaxNode node, Func<SyntaxNode, SyntaxGenerator, TArgument, SyntaxNode> computeReplacement, TArgument argument)
167131
{
168132
CheckNodeInOriginalTreeOrTracked(node);
169133
if (computeReplacement == null)
170-
{
171134
throw new ArgumentNullException(nameof(computeReplacement));
172-
}
173135

174-
_allowEditsOnLazilyCreatedTrackedNewNodes = true;
175-
_changes.Add(new ReplaceChange<TArgument>(node, computeReplacement, argument, this));
136+
_changes.Add(new ReplaceChange<TArgument>(node, computeReplacement, argument));
176137
}
177138

178139
/// <summary>
@@ -184,12 +145,9 @@ public void ReplaceNode(SyntaxNode node, SyntaxNode newNode)
184145
{
185146
CheckNodeInOriginalTreeOrTracked(node);
186147
if (node == newNode)
187-
{
188148
return;
189-
}
190149

191-
newNode = ApplyTrackingToNewNode(newNode);
192-
_changes.Add(new ReplaceChange(node, (n, g) => newNode, this));
150+
_changes.Add(new ReplaceChange(node, (n, g) => newNode));
193151
}
194152

195153
/// <summary>
@@ -201,11 +159,8 @@ public void InsertBefore(SyntaxNode node, IEnumerable<SyntaxNode> newNodes)
201159
{
202160
CheckNodeInOriginalTreeOrTracked(node);
203161
if (newNodes == null)
204-
{
205162
throw new ArgumentNullException(nameof(newNodes));
206-
}
207163

208-
newNodes = ApplyTrackingToNewNodes(newNodes);
209164
_changes.Add(new InsertChange(node, newNodes, isBefore: true));
210165
}
211166

@@ -226,11 +181,8 @@ public void InsertAfter(SyntaxNode node, IEnumerable<SyntaxNode> newNodes)
226181
{
227182
CheckNodeInOriginalTreeOrTracked(node);
228183
if (newNodes == null)
229-
{
230184
throw new ArgumentNullException(nameof(newNodes));
231-
}
232185

233-
newNodes = ApplyTrackingToNewNodes(newNodes);
234186
_changes.Add(new InsertChange(node, newNodes, isBefore: false));
235187
}
236188

@@ -245,30 +197,10 @@ public void InsertAfter(SyntaxNode node, SyntaxNode newNode)
245197
private void CheckNodeInOriginalTreeOrTracked(SyntaxNode node)
246198
{
247199
if (node == null)
248-
{
249200
throw new ArgumentNullException(nameof(node));
250-
}
251201

252202
if (OriginalRoot.Contains(node))
253-
{
254-
// Node is contained in the original tree.
255-
return;
256-
}
257-
258-
if (_allowEditsOnLazilyCreatedTrackedNewNodes)
259-
{
260-
// This could be a node that is handed to us lazily from one of the prior edits
261-
// which support lazy replacement nodes, we conservatively avoid throwing here.
262-
// If this was indeed an unsupported node, syntax editor will throw an exception later
263-
// when attempting to compute changed root.
264203
return;
265-
}
266-
267-
if (_lazyTrackedNewNodesOpt?.Contains(node) == true)
268-
{
269-
// Node is one of the new nodes, which is already tracked and supported.
270-
return;
271-
}
272204

273205
throw new ArgumentException(WorkspacesResources.The_node_is_not_part_of_the_tree, nameof(node));
274206
}
@@ -284,9 +216,7 @@ public SyntaxNode Apply(SyntaxNode root, SyntaxGenerator generator)
284216
{
285217
var currentNode = root.GetCurrentNode(OriginalNode);
286218
if (currentNode is null)
287-
{
288219
Contract.Fail($"GetCurrentNode returned null with the following node: {OriginalNode}");
289-
}
290220

291221
return Apply(root, currentNode, generator);
292222
}
@@ -325,78 +255,53 @@ protected override SyntaxNode Apply(SyntaxNode root, SyntaxNode currentNode, Syn
325255
private sealed class ReplaceChange : Change
326256
{
327257
private readonly Func<SyntaxNode, SyntaxGenerator, SyntaxNode?> _modifier;
328-
private readonly SyntaxEditor _editor;
329258

330259
public ReplaceChange(
331260
SyntaxNode node,
332-
Func<SyntaxNode, SyntaxGenerator, SyntaxNode?> modifier,
333-
SyntaxEditor editor)
261+
Func<SyntaxNode, SyntaxGenerator, SyntaxNode?> modifier)
334262
: base(node)
335263
{
336264
Contract.ThrowIfNull(node);
337265
_modifier = modifier;
338-
_editor = editor;
339266
}
340267

341268
protected override SyntaxNode Apply(SyntaxNode root, SyntaxNode currentNode, SyntaxGenerator generator)
342-
{
343-
var newNode = _modifier(currentNode, generator);
344-
newNode = _editor.ApplyTrackingToNewNode(newNode);
345-
return ValidateNewRoot(generator.ReplaceNode(root, currentNode, newNode));
346-
}
269+
=> ValidateNewRoot(generator.ReplaceNode(root, currentNode, _modifier(currentNode, generator)));
347270
}
348271

349272
private sealed class ReplaceWithCollectionChange : Change
350273
{
351274
private readonly Func<SyntaxNode, SyntaxGenerator, IEnumerable<SyntaxNode>> _modifier;
352-
private readonly SyntaxEditor _editor;
353275

354276
public ReplaceWithCollectionChange(
355277
SyntaxNode node,
356-
Func<SyntaxNode, SyntaxGenerator, IEnumerable<SyntaxNode>> modifier,
357-
SyntaxEditor editor)
278+
Func<SyntaxNode, SyntaxGenerator, IEnumerable<SyntaxNode>> modifier)
358279
: base(node)
359280
{
360281
_modifier = modifier;
361-
_editor = editor;
362282
}
363283

364284
protected override SyntaxNode Apply(SyntaxNode root, SyntaxNode currentNode, SyntaxGenerator generator)
365-
{
366-
var newNodes = _modifier(currentNode, generator).ToList();
367-
for (var i = 0; i < newNodes.Count; i++)
368-
{
369-
newNodes[i] = _editor.ApplyTrackingToNewNode(newNodes[i]);
370-
}
371-
372-
return SyntaxGenerator.ReplaceNode(root, currentNode, newNodes);
373-
}
285+
=> SyntaxGenerator.ReplaceNode(root, currentNode, _modifier(currentNode, generator));
374286
}
375287

376288
private sealed class ReplaceChange<TArgument> : Change
377289
{
378290
private readonly Func<SyntaxNode, SyntaxGenerator, TArgument, SyntaxNode> _modifier;
379291
private readonly TArgument _argument;
380-
private readonly SyntaxEditor _editor;
381292

382293
public ReplaceChange(
383294
SyntaxNode node,
384295
Func<SyntaxNode, SyntaxGenerator, TArgument, SyntaxNode> modifier,
385-
TArgument argument,
386-
SyntaxEditor editor)
296+
TArgument argument)
387297
: base(node)
388298
{
389299
_modifier = modifier;
390300
_argument = argument;
391-
_editor = editor;
392301
}
393302

394303
protected override SyntaxNode Apply(SyntaxNode root, SyntaxNode currentNode, SyntaxGenerator generator)
395-
{
396-
var newNode = _modifier(currentNode, generator, _argument);
397-
newNode = _editor.ApplyTrackingToNewNode(newNode);
398-
return ValidateNewRoot(generator.ReplaceNode(root, currentNode, newNode));
399-
}
304+
=> ValidateNewRoot(generator.ReplaceNode(root, currentNode, _modifier(currentNode, generator, _argument)));
400305
}
401306

402307
private sealed class InsertChange : Change

0 commit comments

Comments
 (0)