提交 fd9aafaf 编写于 作者: A Andy Gocke 提交者: GitHub

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.
上级 9d07d512
......@@ -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)
......
......@@ -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)
......
......@@ -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
......
......@@ -2945,6 +2945,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Get
End Property
'''<summary>
''' Looks up a localized string similar to Error writing to XML documentation file: {0}.
'''</summary>
Friend ReadOnly Property ERR_DocFileGen() As String
Get
Return ResourceManager.GetString("ERR_DocFileGen", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to &apos;{0}&apos; does not implement &apos;{1}&apos;..
'''</summary>
......
......@@ -5400,4 +5400,7 @@
<data name="ERR_InvalidInstrumentationKind" xml:space="preserve">
<value>Invalid instrumentation kind: {0}</value>
</data>
</root>
\ No newline at end of file
<data name="ERR_DocFileGen" xml:space="preserve">
<value>Error writing to XML documentation file: {0}</value>
</data>
</root>
......@@ -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)
<Fact>
Public Sub DocCommentWriteException()
Dim sources =
<compilation name="DocCommentException">
<file name="a.vb">
<![CDATA[
''' <summary>
''' Doc comment for <see href="C" />
''' </summary>
Public Class C
''' <summary>
''' Doc comment for method M
''' </summary>
Public Sub M()
End Sub
End Class
]]>
</file>
</compilation>
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(),
<errors><![CDATA[
BC37258: Error writing to XML documentation file: I/O error occurred.
]]></errors>)
End Sub
<Fact>
Public Sub NoXmlResolver()
Dim sources =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册