提交 160f7711 编写于 作者: N Neal Gafter

Fix a race in the production of compilation events.

Fixes #9759
上级 571a6151
......@@ -1698,34 +1698,23 @@ private AliasSymbol CreateGlobalNamespaceAlias()
private void CompleteTree(SyntaxTree tree)
{
bool completedCompilationUnit = false;
bool completedCompilation = false;
if (_lazyCompilationUnitCompletedTrees == null) Interlocked.CompareExchange(ref _lazyCompilationUnitCompletedTrees, new HashSet<SyntaxTree>(), null);
lock (_lazyCompilationUnitCompletedTrees)
{
if (_lazyCompilationUnitCompletedTrees.Add(tree))
{
completedCompilationUnit = true;
// signal the end of the compilation unit
EventQueue.TryEnqueue(new CompilationUnitCompletedEvent(this, tree));
if (_lazyCompilationUnitCompletedTrees.Count == this.SyntaxTrees.Length)
{
completedCompilation = true;
// if that was the last tree, signal the end of compilation
EventQueue.TryEnqueue(new CompilationCompletedEvent(this));
EventQueue.PromiseNotToEnqueue();
EventQueue.TryComplete();
}
}
}
if (completedCompilationUnit)
{
EventQueue.TryEnqueue(new CompilationUnitCompletedEvent(this, tree));
}
if (completedCompilation)
{
// signal the end of compilation events
EventQueue.TryEnqueue(new CompilationCompletedEvent(this));
EventQueue.PromiseNotToEnqueue();
EventQueue.TryComplete();
}
}
internal void ReportUnusedImports(DiagnosticBag diagnostics, CancellationToken cancellationToken, SyntaxTree filterTree = null)
......
......@@ -1632,8 +1632,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End If
Debug.Assert(AllSyntaxTrees.Contains(tree))
Dim completedCompilationUnit As Boolean = False
Dim completedCompilation As Boolean = False
If _lazyCompilationUnitCompletedTrees Is Nothing Then
Interlocked.CompareExchange(_lazyCompilationUnitCompletedTrees, New HashSet(Of SyntaxTree)(), Nothing)
......@@ -1641,22 +1639,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
SyncLock _lazyCompilationUnitCompletedTrees
If _lazyCompilationUnitCompletedTrees.Add(tree) Then
completedCompilationUnit = True
' signal the end of the compilation unit
EventQueue.TryEnqueue(New CompilationUnitCompletedEvent(Me, tree))
If _lazyCompilationUnitCompletedTrees.Count = SyntaxTrees.Length Then
completedCompilation = True
' if that was the last tree, signal the end of compilation
EventQueue.TryEnqueue(New CompilationCompletedEvent(Me))
EventQueue.PromiseNotToEnqueue()
EventQueue.TryComplete()
End If
End If
End SyncLock
If completedCompilationUnit Then
EventQueue.TryEnqueue(New CompilationUnitCompletedEvent(Me, tree))
End If
If completedCompilation Then
EventQueue.TryEnqueue(New CompilationCompletedEvent(Me))
EventQueue.PromiseNotToEnqueue()
EventQueue.TryComplete() ' signal the End Of compilation events
End If
End Sub
Friend Function ShouldAddEvent(symbol As Symbol) As Boolean
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册