예제 #1
0
        public ClassDeclarationSyntax StubProperty(ClassDeclarationSyntax classDclr, IPropertySymbol propertySymbol, INamedTypeSymbol stubbedInterface, SemanticModel semanticModel)
        {
            string indexerType = propertySymbol.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
            BasePropertyDeclarationSyntax propDclr = null;

            if (propertySymbol.GetMethod != null)
            {
                IMethodSymbol getMethodSymbol = propertySymbol.GetMethod;
                string        parameters      = StubbingUtils.FormatParameters(getMethodSymbol);

                string delegateTypeName = NamingUtils.GetDelegateTypeName(getMethodSymbol, stubbedInterface);
                var    accessorDclr     = SF.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, SF.Block(
                                                                     SF.List(new[]
                {
                    StubbingUtils.GetInvocationBlockSyntax(delegateTypeName, getMethodSymbol.Name, parameters,
                                                           Enumerable.Empty <IParameterSymbol>(), getMethodSymbol.ReturnType, semanticModel)
                })));

                propDclr = CreatePropertyDclr(getMethodSymbol, indexerType);
                propDclr = propDclr.AddAccessorListAccessors(accessorDclr);
            }

            if (propertySymbol.SetMethod != null)
            {
                var           voidType         = semanticModel.Compilation.GetTypeByMetadataName("System.Void");
                IMethodSymbol setMethodSymbol  = propertySymbol.SetMethod;
                string        parameters       = $"{StubbingUtils.FormatParameters(setMethodSymbol)}";
                string        delegateTypeName = NamingUtils.GetDelegateTypeName(setMethodSymbol, stubbedInterface);
                var           accessorDclr     = SF.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration, SF.Block(
                                                                            SF.List(new[]
                {
                    StubbingUtils.GetInvocationBlockSyntax(delegateTypeName, setMethodSymbol.Name, parameters,
                                                           Enumerable.Empty <IParameterSymbol>(), voidType, semanticModel)
                })));
                if (propDclr == null)
                {
                    propDclr = CreatePropertyDclr(setMethodSymbol, indexerType);
                }
                propDclr = propDclr.AddAccessorListAccessors(accessorDclr);
            }

            classDclr = classDclr.AddMembers(propDclr);
            return(classDclr);
        }
예제 #2
0
        public ClassDeclarationSyntax StubProperty(ClassDeclarationSyntax classDclr, IPropertySymbol propertySymbol,
                                                   INamedTypeSymbol stubbedInterface)
        {
            string indexerType = propertySymbol.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
            BasePropertyDeclarationSyntax propDclr = null;

            if (propertySymbol.GetMethod != null)
            {
                IMethodSymbol getMethodSymbol = propertySymbol.GetMethod;
                string        parameters      = StubbingUtils.FormatParameters(getMethodSymbol);

                string delegateTypeName = NamingUtils.GetDelegateTypeName(getMethodSymbol, stubbedInterface);
                var    accessorDclr     = SF.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, SF.Block(
                                                                     SF.List(new[]
                {
                    SF.ParseStatement("return " + StubbingUtils.GenerateInvokeDelegateStmt(delegateTypeName, getMethodSymbol.Name, parameters))
                })));

                propDclr = CreatePropertyDclr(getMethodSymbol, indexerType);
                propDclr = propDclr.AddAccessorListAccessors(accessorDclr);
            }
            if (propertySymbol.SetMethod != null)
            {
                IMethodSymbol setMethodSymbol  = propertySymbol.SetMethod;
                string        parameters       = $"{StubbingUtils.FormatParameters(setMethodSymbol)}";
                string        delegateTypeName = NamingUtils.GetDelegateTypeName(setMethodSymbol, stubbedInterface);
                var           accessorDclr     = SF.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration, SF.Block(
                                                                            SF.List(new[]
                {
                    SF.ParseStatement(StubbingUtils.GenerateInvokeDelegateStmt(delegateTypeName, setMethodSymbol.Name, parameters))
                })));
                if (propDclr == null)
                {
                    propDclr = CreatePropertyDclr(setMethodSymbol, indexerType);
                }
                propDclr = propDclr.AddAccessorListAccessors(accessorDclr);
            }

            classDclr = classDclr.AddMembers(propDclr);
            return(classDclr);
        }
        private IEnumerable <MemberDeclarationSyntax> GetPropertiesAndMethods()
        {
            for (var interfaceIndex = 0; interfaceIndex < _interfacesToImplement.Length; interfaceIndex++)
            {
                var interfaceType = _interfacesToImplement[interfaceIndex];

                var typedFieldName             = interfaceIndex == 0 ? (ExpressionSyntax)FieldName : ParenthesizedExpression(CastExpression(interfaceType.ToTypeSyntax(), FieldName));
                var explicitInterfaceSpecifier = ExplicitInterfaceSpecifier((NameSyntax)interfaceType.ToTypeSyntax());

                foreach (var propertyInfo in interfaceType.GetProperties().OrderBy(p => p.Name, StringComparer.Ordinal))
                {
                    ParameterInfo[] indexParameters = propertyInfo.GetIndexParameters();
                    MethodInfo      getter          = propertyInfo.GetGetMethod();
                    MethodInfo      setter          = propertyInfo.GetSetMethod();

                    BasePropertyDeclarationSyntax propertyDeclarationSyntax = (indexParameters.Length == 0
                            ? (BasePropertyDeclarationSyntax)PropertyDeclaration(propertyInfo.PropertyType.ToTypeSyntax(), propertyInfo.Name)
                            : IndexerDeclaration(propertyInfo.PropertyType.ToTypeSyntax())
                                                                               .AddParameterListParameters(indexParameters.Select(p => Parameter(Identifier(p.Name)).WithType(p.ParameterType.ToTypeSyntax())).ToArray()))
                                                                              .WithExplicitInterfaceSpecifier(explicitInterfaceSpecifier)
                                                                              .AddAttributeLists(ExcludeFromCodeCoverageAttributeSyntax)
                                                                              .WithAdditionalAnnotations(new SyntaxAnnotation(DeclaringTypeKind, (getter?.GetBaseDefinition() ?? setter?.GetBaseDefinition())?.DeclaringType.FullName));

                    if (getter != null)
                    {
                        propertyDeclarationSyntax = propertyDeclarationSyntax.AddAccessorListAccessors(
                            AccessorDeclaration(
                                SyntaxKind.GetAccessorDeclaration,
                                Block(ReturnStatement(
                                          indexParameters.Length == 0
                                        ? (ExpressionSyntax)MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, FieldName, IdentifierName(propertyInfo.Name))
                                        : ElementAccessExpression(FieldName).AddArgumentListArguments(indexParameters.Select(p => Argument(IdentifierName(p.Name))).ToArray())))));
                    }

                    if (setter != null)
                    {
                        ExpressionSyntax assignmentTarget = indexParameters.Length == 0
                            ? (ExpressionSyntax)MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, typedFieldName, IdentifierName(propertyInfo.Name))
                            : ElementAccessExpression(FieldName).AddArgumentListArguments(indexParameters.Select(p => Argument(IdentifierName(p.Name))).ToArray());

                        propertyDeclarationSyntax = propertyDeclarationSyntax.AddAccessorListAccessors(
                            AccessorDeclaration(
                                SyntaxKind.SetAccessorDeclaration,
                                Block(ExpressionStatement(AssignmentExpression(
                                                              SyntaxKind.SimpleAssignmentExpression,
                                                              assignmentTarget,
                                                              IdentifierName("value"))))));
                    }

                    yield return(propertyDeclarationSyntax);
                }

                IOrderedEnumerable <MethodInfo> orderedMethods = interfaceType
                                                                 .GetMethods()
                                                                 .Except(interfaceType.GetProperties().SelectMany(p => p.GetAccessors()))
                                                                 .OrderBy(m => m.Name, StringComparer.Ordinal)
                                                                 .ThenBy(m => string.Join(", ", m.GetParameters().Select(p => p.ParameterType.FullName)), StringComparer.Ordinal);

                foreach (var methodInfo in orderedMethods)
                {
                    var method = MethodDeclaration(methodInfo.ReturnType.ToTypeSyntax(), methodInfo.Name)
                                 .WithExplicitInterfaceSpecifier(explicitInterfaceSpecifier)
                                 .AddParameterListParameters(
                        methodInfo.GetParameters().Select(p =>
                                                          Parameter(Identifier(p.Name))
                                                          .WithType(p.ParameterType.ToTypeSyntax())
                                                          .WithModifiers(p.IsDefined(typeof(ParamArrayAttribute), false) ? TokenList(Token(SyntaxKind.ParamsKeyword)) : TokenList()))
                        .ToArray())
                                 .AddAttributeLists(ExcludeFromCodeCoverageAttributeSyntax)
                                 .WithBody(Block())
                                 .WithAdditionalAnnotations(new SyntaxAnnotation(DeclaringTypeKind, methodInfo.GetBaseDefinition().DeclaringType.FullName));

                    if (methodInfo.IsGenericMethod)
                    {
                        method = method.WithTypeParameterList(TypeParameterList(SeparatedList(methodInfo.GetGenericArguments().Select(t => TypeParameter(t.Name)))));
                    }

                    var methodName = methodInfo.IsGenericMethod
                        ? GenericName(methodInfo.Name).AddTypeArgumentListArguments(methodInfo.GetGenericArguments().Select(t => t.ToTypeSyntax()).ToArray())
                        : (SimpleNameSyntax)IdentifierName(methodInfo.Name);

                    var invocation = InvocationExpression(
                        MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            typedFieldName,
                            methodName),
                        ArgumentList(SeparatedList(methodInfo.GetParameters().Select(p => Argument(IdentifierName(p.Name))))));

                    var block = Block(methodInfo.ReturnType == typeof(void) ? ExpressionStatement(invocation) : (StatementSyntax)ReturnStatement(invocation));

                    method = method.WithBody(block);

                    yield return(method);
                }
            }
        }