public static SyntaxNode ReplaceProgramNode()

in src/CTA.Rules.PortCore/ProjectSpecificPort/WCF/WCFServicePort.cs [149:212]


        public static SyntaxNode ReplaceProgramNode(Dictionary<string, int> transportPort, SyntaxTree programTree, bool containsTransportRelatedMode)
        {
            string httpListen = Constants.ListenLocalHostFormat;
            string httpsListen = Constants.ListenHttpsFormat;
            string netTcpMethodExpression = Constants.NetTcpFormat;

            var root = programTree.GetRoot();

            var lambdaExpressionList = root.DescendantNodes().OfType<SimpleLambdaExpressionSyntax>();
            if (lambdaExpressionList.IsNullOrEmpty())
            {
                return root;
            }
            var lambdaExpression = lambdaExpressionList.First();

            var block = lambdaExpression.Block;
            var newBlock = block;

            var parameter = lambdaExpression.Parameter;

            if (transportPort.ContainsKey(Constants.HttpProtocol))
            {
                httpListen = String.Format(httpListen, parameter.Identifier.ValueText, transportPort.GetValueOrDefault(Constants.HttpProtocol, 8080));
                newBlock = block.AddStatements(SyntaxFactory.ParseStatement(httpListen));
            }

            if (transportPort.ContainsKey(Constants.HttpsProtocol) || containsTransportRelatedMode)
            {
                httpsListen = String.Format(httpsListen, parameter.Identifier.ValueText, transportPort.GetValueOrDefault(Constants.HttpsProtocol, 8888));
                newBlock = newBlock.AddStatements(SyntaxFactory.ParseStatement(httpsListen));
            }

            var newLambdaExpression = lambdaExpression.ReplaceNode(block, newBlock);

            root = root.ReplaceNode(lambdaExpression, newLambdaExpression);

            var memberAccessExpressions = root.DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToList();
            MemberAccessExpressionSyntax kestrelInvocationNode = null;
            foreach (MemberAccessExpressionSyntax memberAccessExpression in memberAccessExpressions)
            {
                if (memberAccessExpression.Name.Identifier.Text.Equals(Constants.UseStartupMethodIdentifier))
                {
                    kestrelInvocationNode = memberAccessExpression;
                    break;
                }
            }

            if (transportPort.ContainsKey(Constants.NettcpProtocol))
            {
                var netTCPExpression = SyntaxFactory
                            .MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            kestrelInvocationNode.Expression,
                            SyntaxFactory.IdentifierName(netTcpMethodExpression)
                            );
                var netTcpInvocation = SyntaxFactory.InvocationExpression(netTCPExpression, SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(new[] {
                SyntaxFactory.Argument(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(transportPort.GetValueOrDefault(Constants.NettcpProtocol, 8000))))
               })));
                var kestrelInvocationWithNetTcp = kestrelInvocationNode.WithExpression(netTcpInvocation);
                root = root.ReplaceNode(kestrelInvocationNode, kestrelInvocationWithNetTcp);
            }

            return root;
        }