| File: DocumentationComments\XmlDocumentationCommentTextReader.cs | Web Access |
| Project: src\roslyn\src\Compilers\Core\Portable\Microsoft.CodeAnalysis.csproj (Microsoft.CodeAnalysis) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Xml; using Microsoft.CodeAnalysis.PooledObjects; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis { /// <summary> /// Used by the DocumentationCommentCompiler(s) to check doc comments for XML parse errors. /// As a performance optimization, this class tries to re-use the same underlying <see cref="XmlReader"/> instance /// when possible. /// </summary> internal partial class XmlDocumentationCommentTextReader { private XmlReader _reader; private readonly Reader _textReader = new Reader(); private static readonly ObjectPool<XmlDocumentationCommentTextReader> s_pool = new ObjectPool<XmlDocumentationCommentTextReader>(() => new XmlDocumentationCommentTextReader(), size: 2); public static XmlException ParseAndGetException(string text) { var reader = s_pool.Allocate(); var retVal = reader.ParseInternal(text); s_pool.Free(reader); return retVal; } private static readonly XmlReaderSettings s_xmlSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Prohibit }; // internal for testing internal XmlException ParseInternal(string text) { _textReader.SetText(text); if (_reader == null) { _reader = XmlReader.Create(_textReader, s_xmlSettings); } try { do { _reader.Read(); } while (!Reader.ReachedEnd(_reader)); if (_textReader.Eof) { _reader.Dispose(); _reader = null; _textReader.Reset(); } return null; } catch (XmlException ex) { // The reader is in a bad state, so dispose of it and recreate a new one next time we get called. _reader.Dispose(); _reader = null; _textReader.Reset(); return ex; } } } }