From fd9aafafefb0cd52d97f04e4304500b729e00df8 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Tue, 20 Sep 2016 16:03:11 -0700 Subject: [PATCH] Catch exceptions when writing XML doc files in VB (#13918) This is the same fix as was implemented for C# in #13806, but for VB. --- .../Compiler/DocumentationCommentCompiler.cs | 12 +++--- .../DocumentationCommentCompiler.vb | 17 +++++--- .../VisualBasic/Portable/Errors/Errors.vb | 2 +- .../Portable/VBResources.Designer.vb | 9 +++++ .../VisualBasic/Portable/VBResources.resx | 5 ++- .../DocumentationComments/DocCommentTests.vb | 39 +++++++++++++++++++ 6 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Compiler/DocumentationCommentCompiler.cs b/src/Compilers/CSharp/Portable/Compiler/DocumentationCommentCompiler.cs index 5f7e3432773..a2665ed8699 100644 --- a/src/Compilers/CSharp/Portable/Compiler/DocumentationCommentCompiler.cs +++ b/src/Compilers/CSharp/Portable/Compiler/DocumentationCommentCompiler.cs @@ -88,9 +88,9 @@ public static void WriteDocumentationCommentXml(CSharpCompilation compilation, s leaveOpen: true); // Don't close caller's stream. } - using (writer) + try { - try + using (writer) { var compiler = new DocumentationCommentCompiler(assemblyName ?? compilation.SourceAssembly.Name, compilation, writer, filterTree, filterSpanWithinTree, processIncludes: true, isForSingleSymbol: false, diagnostics: diagnostics, cancellationToken: cancellationToken); @@ -98,10 +98,10 @@ public static void WriteDocumentationCommentXml(CSharpCompilation compilation, s Debug.Assert(compiler._indentDepth == 0); writer?.Flush(); } - catch (Exception e) - { - diagnostics.Add(ErrorCode.ERR_DocFileGen, Location.None, e.Message); - } + } + catch (Exception e) + { + diagnostics.Add(ErrorCode.ERR_DocFileGen, Location.None, e.Message); } if (filterTree != null) diff --git a/src/Compilers/VisualBasic/Portable/Compilation/DocumentationComments/DocumentationCommentCompiler.vb b/src/Compilers/VisualBasic/Portable/Compilation/DocumentationComments/DocumentationCommentCompiler.vb index 6e5e30462a9..24edf5d89c9 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/DocumentationComments/DocumentationCommentCompiler.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/DocumentationComments/DocumentationCommentCompiler.vb @@ -68,14 +68,19 @@ Namespace Microsoft.CodeAnalysis.VisualBasic writer = New StreamWriter(xmlDocStream, New UTF8Encoding(True, False), bufferSize:=&H400, leaveOpen:=True) End If - Using writer - ' TODO: get preferred culture from compilation(?) - Dim compiler As New DocumentationCommentCompiler(If(assemblyName, compilation.SourceAssembly.Name), compilation, writer, True, False, + Try + Using writer + ' TODO: get preferred culture from compilation(?) + Dim compiler As New DocumentationCommentCompiler(If(assemblyName, compilation.SourceAssembly.Name), compilation, writer, True, False, diagnostics, filterTree, filterSpanWithinTree, preferredCulture:=Nothing, cancellationToken:=cancellationToken) - compiler.Visit(compilation.SourceAssembly.GlobalNamespace) - Debug.Assert(compiler._writer.IndentDepth = 0) - End Using + compiler.Visit(compilation.SourceAssembly.GlobalNamespace) + Debug.Assert(compiler._writer.IndentDepth = 0) + writer?.Flush() + End Using + Catch ex As Exception + diagnostics.Add(ERRID.ERR_DocFileGen, Location.None, ex.Message) + End Try For Each tree In compilation.SyntaxTrees MislocatedDocumentationCommentFinder.ReportUnprocessed(tree, filterSpanWithinTree, diagnostics, cancellationToken) diff --git a/src/Compilers/VisualBasic/Portable/Errors/Errors.vb b/src/Compilers/VisualBasic/Portable/Errors/Errors.vb index 7070fa55e54..375432e8c99 100644 --- a/src/Compilers/VisualBasic/Portable/Errors/Errors.vb +++ b/src/Compilers/VisualBasic/Portable/Errors/Errors.vb @@ -1686,8 +1686,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ERR_PeWritingFailure = 37256 ERR_OptionMustBeAbsolutePath = 37257 + ERR_DocFileGen = 37258 - ' available 37258 ERR_TupleTooFewElements = 37259 ERR_TupleReservedMemberNameAnyPosition = 37260 ERR_TupleReservedMemberName = 37261 diff --git a/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb b/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb index d3898d4d398..88970ab5998 100644 --- a/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb +++ b/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb @@ -2945,6 +2945,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Get End Property + ''' + ''' Looks up a localized string similar to Error writing to XML documentation file: {0}. + ''' + Friend ReadOnly Property ERR_DocFileGen() As String + Get + Return ResourceManager.GetString("ERR_DocFileGen", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to '{0}' does not implement '{1}'.. ''' diff --git a/src/Compilers/VisualBasic/Portable/VBResources.resx b/src/Compilers/VisualBasic/Portable/VBResources.resx index 739a57c52ba..3b8cec52dc1 100644 --- a/src/Compilers/VisualBasic/Portable/VBResources.resx +++ b/src/Compilers/VisualBasic/Portable/VBResources.resx @@ -5400,4 +5400,7 @@ Invalid instrumentation kind: {0} - \ No newline at end of file + + Error writing to XML documentation file: {0} + + diff --git a/src/Compilers/VisualBasic/Test/Symbol/DocumentationComments/DocCommentTests.vb b/src/Compilers/VisualBasic/Test/Symbol/DocumentationComments/DocCommentTests.vb index e6a7eaae44a..8ae24f85ea5 100644 --- a/src/Compilers/VisualBasic/Test/Symbol/DocumentationComments/DocCommentTests.vb +++ b/src/Compilers/VisualBasic/Test/Symbol/DocumentationComments/DocCommentTests.vb @@ -9,6 +9,7 @@ Imports System.Xml.Linq Imports System.Text Imports System.IO Imports Roslyn.Test.Utilities +Imports Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests Public Class DocCommentTests @@ -16,6 +17,44 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests Private Shared ReadOnly s_optionsDiagnoseDocComments As VisualBasicParseOptions = VisualBasicParseOptions.Default.WithDocumentationMode(DocumentationMode.Diagnose) + + Public Sub DocCommentWriteException() + Dim sources = + + + +''' Doc comment for +''' +Public Class C + ''' + ''' Doc comment for method M + ''' + Public Sub M() + End Sub +End Class +]]> + + + + Dim comp = CreateCompilationWithMscorlib(sources) + Dim diags = New DiagnosticBag() + Dim badStream = New BrokenStream() + badStream.BreakHow = BrokenStream.BreakHowType.ThrowOnWrite + + DocumentationCommentCompiler.WriteDocumentationCommentXml( + comp, + assemblyName:=Nothing, + xmlDocStream:=badStream, + diagnostics:=diags, + cancellationToken:=Nothing) + + AssertTheseDiagnostics(diags.ToReadOnlyAndFree(), + ) + End Sub + Public Sub NoXmlResolver() Dim sources = -- GitLab