File: CodeDomFixup\CodeDomVisitors\EnsureAdditionalAssemblyReference.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// 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.
 
using System;
using Microsoft.CodeDom;
using System.Collections.Generic;
 
namespace Microsoft.Tools.ServiceModel.Svcutil
{
    internal class EnsureAdditionalAssemblyReference : CodeDomVisitor
    {
        private CodeCompileUnit _compileUnit;
        private Dictionary<string, string> _namespacesToMatch = new Dictionary<string, string>() { { "System.ServiceModel.XmlSerializerFormatAttribute", "System.Xml.Serialization" }, { "System.Xml.Linq", "System.Xml.Linq" }, { "System.ServiceModel.Duplex", "System.ServiceModel.Extensions" } };
 
        private List<string> _alreadyAdded = new List<string>();
 
        protected override void Visit(CodeCompileUnit cu)
        {
            base.Visit(cu);
            _compileUnit = cu;
        }
        protected override void Visit(CodeTypeReference typeref)
        {
            base.Visit(typeref);
            foreach (string ns in _namespacesToMatch.Keys)
            {
                if (!_alreadyAdded.Contains(_namespacesToMatch[ns]) && typeref.BaseType.StartsWith(ns, StringComparison.Ordinal))
                {
                    EnsureAssemblyReference(_namespacesToMatch[ns]);
                }
            }
        }
 
        private void EnsureAssemblyReference(string ns)
        {
            if (!_alreadyAdded.Contains(ns) && _compileUnit != null)
            {
                if (!_compileUnit.ReferencedAssemblies.Contains(ns + ".dll"))
                {
                    _compileUnit.ReferencedAssemblies.Add(ns + ".dll");
                }
 
                _alreadyAdded.Add(ns);
            }
        }
        protected override void FinishVisit(CodeCompileUnit cu)
        {
            base.FinishVisit(cu);
            Visit((object)cu);
        }
    }
}