int IVBFileCodeModelEvents.EndEdit() { try { if (_editCount == 1) { List <ValueTuple <AbstractKeyedCodeElement, SyntaxPath> > elementAndPathes = null; if (_batchElements.Count > 0) { foreach (var element in _batchElements) { var node = element.LookupNode(); if (node != null) { elementAndPathes = elementAndPathes ?? new List <ValueTuple <AbstractKeyedCodeElement, SyntaxPath> >(); elementAndPathes.Add(ValueTuple.Create(element, new SyntaxPath(node))); } } } if (_batchDocument != null) { // perform expensive operations at once var newDocument = Simplifier.ReduceAsync(_batchDocument, Simplifier.Annotation, cancellationToken: CancellationToken.None).WaitAndGetResult(CancellationToken.None); _batchDocument.Project.Solution.Workspace.TryApplyChanges(newDocument.Project.Solution); // done using batch document _batchDocument = null; } // Ensure the file is prettylisted, even if we didn't make any edits CodeModelService.EnsureBufferFormatted(_invisibleEditor.TextBuffer); if (elementAndPathes != null) { foreach (var elementAndPath in elementAndPathes) { // make sure the element is there. var existingElement = _elementTable.TryGetValue(elementAndPath.Item1.NodeKey); if (existingElement != null) { elementAndPath.Item1.ReaquireNodeKey(elementAndPath.Item2, CancellationToken.None); } // make sure existing element doesn't go away (weak reference) in the middle of // updating the node key GC.KeepAlive(existingElement); } } _batchMode = false; _batchElements = null; } return(VSConstants.S_OK); } catch (Exception ex) { return(Marshal.GetHRForException(ex)); } finally { ReleaseEditor(); } }
int IVBFileCodeModelEvents.EndEdit() { try { if (_editCount == 1) { RoslynDebug.AssertNotNull(_batchElements); RoslynDebug.AssertNotNull(_invisibleEditor); List <ValueTuple <AbstractKeyedCodeElement, SyntaxPath> >?elementAndPaths = null; if (_batchElements.Count > 0) { foreach (var element in _batchElements) { var node = element.LookupNode(); if (node != null) { elementAndPaths ??= new List <ValueTuple <AbstractKeyedCodeElement, SyntaxPath> >(); elementAndPaths.Add(ValueTuple.Create(element, new SyntaxPath(node))); } } } if (_batchDocument != null) { // perform expensive operations at once var newDocument = State.ThreadingContext.JoinableTaskFactory.Run(async() => { var simplifierOptions = await _batchDocument.GetSimplifierOptionsAsync(GlobalOptions, CancellationToken.None).ConfigureAwait(false); return(await Simplifier.ReduceAsync(_batchDocument, Simplifier.Annotation, simplifierOptions, CancellationToken.None).ConfigureAwait(false)); }); _batchDocument.Project.Solution.Workspace.TryApplyChanges(newDocument.Project.Solution); // done using batch document _batchDocument = null; } // Ensure the file is prettylisted, even if we didn't make any edits CodeModelService.EnsureBufferFormatted(_invisibleEditor.TextBuffer); if (elementAndPaths != null) { foreach (var elementAndPath in elementAndPaths) { // make sure the element is there. if (_codeElementTable.TryGetValue(elementAndPath.Item1.NodeKey, out var existingElement)) { elementAndPath.Item1.ReacquireNodeKey(elementAndPath.Item2, CancellationToken.None); } // make sure existing element doesn't go away (weak reference) in the middle of // updating the node key GC.KeepAlive(existingElement); } } _batchMode = false; _batchElements = null; } return(VSConstants.S_OK); } catch (Exception ex) { return(Marshal.GetHRForException(ex)); } finally { ReleaseEditor(); } }