File: Writers\CSharp\CSDeclarationHelper.cs
Web Access
Project: src\src\Microsoft.Cci.Extensions\Microsoft.Cci.Extensions.csproj (Microsoft.Cci.Extensions)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.Cci.Filters;
using Microsoft.Cci.Writers.Syntax;
 
namespace Microsoft.Cci.Writers.CSharp
{
    public class CSDeclarationHelper
    {
        private readonly ICciFilter _filter;
        private readonly bool _forCompilation;
        private readonly bool _includeFakeAttributes;
 
        private StringBuilder _string;
        private CSDeclarationWriter _stringWriter;
 
        private TokenSyntaxWriter _tokenizer;
        private CSDeclarationWriter _tokenWriter;
 
        public CSDeclarationHelper(ICciFilter filter, bool forCompilation = false, bool includePseudoCustomAttributes = false)
        {
            _filter = filter;
            _forCompilation = forCompilation;
            _includeFakeAttributes = includePseudoCustomAttributes;
        }
 
        public string GetString(IDefinition definition, int indentLevel = -1)
        {
            EnsureStringWriter();
 
            _string.Clear();
 
            if (indentLevel != -1)
                _stringWriter.SyntaxtWriter.IndentLevel = indentLevel;
 
            _stringWriter.WriteDeclaration(definition);
 
            return _string.ToString();
        }
 
        public string GetString(ICustomAttribute attribute, int indentLevel = -1)
        {
            EnsureStringWriter();
 
            _string.Clear();
 
            if (indentLevel != -1)
                _stringWriter.SyntaxtWriter.IndentLevel = indentLevel;
 
            _stringWriter.WriteAttribute(attribute);
 
            return _string.ToString();
        }
 
        public IEnumerable<SyntaxToken> GetTokenList(IDefinition definition, int indentLevel = -1)
        {
            EnsureTokenWriter();
 
            _tokenizer.ClearTokens();
 
            if (indentLevel != -1)
                _tokenizer.IndentLevel = indentLevel;
 
            _tokenWriter.WriteDeclaration(definition);
 
            return _tokenizer.ToTokenList();
        }
 
        public IEnumerable<SyntaxToken> GetTokenList(ICustomAttribute attribute, int indentLevel = -1)
        {
            EnsureTokenWriter();
 
            _tokenizer.ClearTokens();
 
            if (indentLevel != -1)
                _tokenizer.IndentLevel = indentLevel;
 
            _tokenWriter.WriteAttribute(attribute);
 
            return _tokenizer.ToTokenList();
        }
 
        private void EnsureStringWriter()
        {
            if (_stringWriter == null)
            {
                _string = new StringBuilder();
                StringWriter sw = new StringWriter(_string);
                TextSyntaxWriter tsw = new TextSyntaxWriter(sw);
 
                _stringWriter = new CSDeclarationWriter(tsw, _filter, _forCompilation, _includeFakeAttributes);
            }
        }
 
        private void EnsureTokenWriter()
        {
            if (_tokenWriter == null)
            {
                _tokenizer = new TokenSyntaxWriter();
                _tokenWriter = new CSDeclarationWriter(_tokenizer, _filter, _forCompilation, _includeFakeAttributes);
            }
        }
    }
}