File: CodeDomFixup\CodeDomVisitors\RemoveSyncMethodsFromInterface.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 Microsoft.CodeDom;
using System.ServiceModel;
 
namespace Microsoft.Tools.ServiceModel.Svcutil
{
    internal class RemoveSyncMethodsFromInterface : ServiceContractVisitor
    {
        protected override void VisitAttributedType(CodeTypeDeclaration type)
        {
            base.VisitAttributedType(type);
 
            CollectionHelpers.MapList<CodeMemberMethod>(
                type.Members,
                delegate (CodeMemberMethod method)
                {
                    return CodeDomHelpers.IsBeginMethod(method) ||
                           CodeDomHelpers.IsTaskAsyncMethod(method) ||
                           CodeDomHelpers.IsEndMethod(method);
                },
                this.CopyAttrsToTaskAsyncMethod
            );
        }
 
        private void CopyAttrsToTaskAsyncMethod(CodeMemberMethod syncMethod, int index)
        {
            CodeMemberMethod taskAyncMethod = CodeDomHelpers.GetTaskAsyncMethodForMethod(CurrentType.Members, syncMethod);
            if (taskAyncMethod != null && !ReferenceEquals(taskAyncMethod, syncMethod))
            {
                foreach (CodeAttributeDeclaration attr in syncMethod.CustomAttributes)
                {
                    // skip [OperationContract] as that appears in both places and is guaranteed to be the same
                    if (!CodeDomHelpers.MatchType<OperationContractAttribute>(attr.AttributeType))
                    {
                        taskAyncMethod.CustomAttributes.Add(attr);
                    }
                }
            }
        }
    }
}