Example #1
0
        public static IMethodSymbol RenameTypeParameters(this IMethodSymbol method, ImmutableArray <string> newNames)
        {
            if (method.TypeParameters.Select(t => t.Name).SequenceEqual(newNames))
            {
                return(method);
            }

            var typeGenerator         = new TypeGenerator();
            var updatedTypeParameters = RenameTypeParameters(
                method.TypeParameters, newNames, typeGenerator);

            var mapping = new Dictionary <ITypeSymbol, ITypeSymbol>(SymbolEqualityComparer.Default);

            for (var i = 0; i < method.TypeParameters.Length; i++)
            {
                mapping[method.TypeParameters[i]] = updatedTypeParameters[i];
            }

            return(CodeGenerationSymbolFactory.CreateMethodSymbol(
                       method.ContainingType,
                       method.GetAttributes(),
                       method.DeclaredAccessibility,
                       method.GetSymbolModifiers(),
                       method.ReturnType.SubstituteTypes(mapping, typeGenerator),
                       method.RefKind,
                       method.ExplicitInterfaceImplementations,
                       method.Name,
                       updatedTypeParameters,
                       method.Parameters.SelectAsArray(p =>
                                                       CodeGenerationSymbolFactory.CreateParameterSymbol(p.GetAttributes(), p.RefKind, p.IsParams, p.Type.SubstituteTypes(mapping, typeGenerator), p.Name, p.IsOptional,
                                                                                                         p.HasExplicitDefaultValue, p.HasExplicitDefaultValue ? p.ExplicitDefaultValue : null))));
        }
        public static IMethodSymbol RenameTypeParameters(this IMethodSymbol method, IList <string> newNames)
        {
            if (method.TypeParameters.Select(t => t.Name).SequenceEqual(newNames))
            {
                return(method);
            }

            var typeGenerator         = new TypeGenerator();
            var updatedTypeParameters = RenameTypeParameters(
                method.TypeParameters, newNames, typeGenerator);

            // The use of AllNullabilityIgnoringSymbolComparer is tracked by https://github.com/dotnet/roslyn/issues/36093
            var mapping = new Dictionary <ITypeSymbol, ITypeSymbol>(AllNullabilityIgnoringSymbolComparer.Instance);

            for (var i = 0; i < method.TypeParameters.Length; i++)
            {
                mapping[method.TypeParameters[i]] = updatedTypeParameters[i];
            }

            return(CodeGenerationSymbolFactory.CreateMethodSymbol(
                       method.ContainingType,
                       method.GetAttributes(),
                       method.DeclaredAccessibility,
                       method.GetSymbolModifiers(),
                       method.GetReturnTypeWithAnnotatedNullability().SubstituteTypes(mapping, typeGenerator),
                       method.RefKind,
                       method.ExplicitInterfaceImplementations,
                       method.Name,
                       updatedTypeParameters,
                       method.Parameters.SelectAsArray(p =>
                                                       CodeGenerationSymbolFactory.CreateParameterSymbol(p.GetAttributes(), p.RefKind, p.IsParams, p.GetTypeWithAnnotatedNullability().SubstituteTypes(mapping, typeGenerator), p.Name, p.IsOptional,
                                                                                                         p.HasExplicitDefaultValue, p.HasExplicitDefaultValue ? p.ExplicitDefaultValue : null))));
        }
        private static IMethodSymbol RemoveAttributesCore(
            this IMethodSymbol method, Func <AttributeData, bool> shouldRemoveAttribute,
            IList <SyntaxNode> statements, IList <SyntaxNode> handlesExpressions)
        {
            var methodHasAttribute = method.GetAttributes().Any(shouldRemoveAttribute);

            var someParameterHasAttribute = method.Parameters
                                            .Any(m => m.GetAttributes().Any(shouldRemoveAttribute));

            var returnTypeHasAttribute = method.GetReturnTypeAttributes().Any(shouldRemoveAttribute);

            if (!methodHasAttribute && !someParameterHasAttribute && !returnTypeHasAttribute)
            {
                return(method);
            }

            return(CodeGenerationSymbolFactory.CreateMethodSymbol(
                       method.ContainingType,
                       method.GetAttributes().Where(a => !shouldRemoveAttribute(a)).ToList(),
                       method.DeclaredAccessibility,
                       method.GetSymbolModifiers(),
                       method.ReturnType,
                       method.ExplicitInterfaceImplementations.FirstOrDefault(),
                       method.Name,
                       method.TypeParameters,
                       method.Parameters.Select(p =>
                                                CodeGenerationSymbolFactory.CreateParameterSymbol(
                                                    p.GetAttributes().Where(a => !shouldRemoveAttribute(a)).ToList(),
                                                    p.RefKind, p.IsParams, p.Type, p.Name, p.IsOptional,
                                                    p.HasExplicitDefaultValue, p.HasExplicitDefaultValue ? p.ExplicitDefaultValue : null)).ToList(),
                       statements,
                       handlesExpressions,
                       method.GetReturnTypeAttributes().Where(a => !shouldRemoveAttribute(a)).ToList()));
        }
Example #4
0
        public static IMethodSymbol RenameParameters(
            this IMethodSymbol method,
            ImmutableArray <string> parameterNames
            )
        {
            var parameterList = method.Parameters;

            if (parameterList.Select(p => p.Name).SequenceEqual(parameterNames))
            {
                return(method);
            }

            var parameters = parameterList.RenameParameters(parameterNames);

            return(CodeGenerationSymbolFactory.CreateMethodSymbol(
                       method.ContainingType,
                       method.GetAttributes(),
                       method.DeclaredAccessibility,
                       method.GetSymbolModifiers(),
                       method.ReturnType,
                       method.RefKind,
                       method.ExplicitInterfaceImplementations,
                       method.Name,
                       method.TypeParameters,
                       parameters
                       ));
        }
 internal static IMethodSymbol CreateAccessorSymbol(
     IMethodSymbol accessor,
     IList <AttributeData> attributes      = null,
     Accessibility?accessibility           = null,
     IMethodSymbol explicitInterfaceSymbol = null,
     IList <SyntaxNode> statements         = null)
 {
     return(CodeGenerationSymbolFactory.CreateMethodSymbol(
                attributes,
                accessibility ?? accessor.DeclaredAccessibility,
                accessor.GetSymbolModifiers().WithIsAbstract(statements == null),
                accessor.ReturnType,
                explicitInterfaceSymbol ?? accessor.ExplicitInterfaceImplementations.FirstOrDefault(),
                accessor.Name,
                accessor.TypeParameters,
                accessor.Parameters,
                statements,
                returnTypeAttributes: accessor.GetReturnTypeAttributes()));
 }
 internal static IMethodSymbol CreateAccessorSymbol(
     IMethodSymbol accessor,
     ImmutableArray <AttributeData> attributes = default(ImmutableArray <AttributeData>),
     Accessibility?accessibility = null,
     ImmutableArray <IMethodSymbol> explicitInterfaceImplementations = default,
     ImmutableArray <SyntaxNode> statements = default(ImmutableArray <SyntaxNode>))
 {
     return(CodeGenerationSymbolFactory.CreateMethodSymbol(
                attributes,
                accessibility ?? accessor.DeclaredAccessibility,
                accessor.GetSymbolModifiers().WithIsAbstract(statements == null),
                accessor.ReturnType,
                accessor.ReturnsByRef,
                explicitInterfaceImplementations.IsDefault ? accessor.ExplicitInterfaceImplementations : explicitInterfaceImplementations,
                accessor.Name,
                accessor.TypeParameters,
                accessor.Parameters,
                statements,
                returnTypeAttributes: accessor.GetReturnTypeAttributes()));
 }
 internal static IMethodSymbol CreateMethodSymbol(
     IMethodSymbol method,
     IList <AttributeData> attributes      = null,
     Accessibility?accessibility           = null,
     SymbolModifiers?modifiers             = null,
     IMethodSymbol explicitInterfaceSymbol = null,
     string name = null,
     IList <SyntaxNode> statements = null)
 {
     return(CodeGenerationSymbolFactory.CreateMethodSymbol(
                attributes,
                accessibility ?? method.DeclaredAccessibility,
                modifiers ?? method.GetSymbolModifiers(),
                method.ReturnType,
                explicitInterfaceSymbol,
                name ?? method.Name,
                method.TypeParameters,
                method.Parameters,
                statements,
                returnTypeAttributes: method.GetReturnTypeAttributes()));
 }
        public static IMethodSymbol RemoveAttributeFromParametersAndReturnType(
            this IMethodSymbol method, INamedTypeSymbol attributeType,
            IList <SyntaxNode> statements = null, IList <SyntaxNode> handlesExpressions = null)
        {
            if (attributeType == null)
            {
                return(method);
            }

            var someParameterHasAttribute = method.Parameters
                                            .Any(m => m.GetAttributes().Any(a => a.AttributeClass.Equals(attributeType)));

            var returnTypeHasAttribute = method.GetReturnTypeAttributes()
                                         .Any(a => a.AttributeClass.Equals(attributeType));

            if (!someParameterHasAttribute && !returnTypeHasAttribute)
            {
                return(method);
            }

            return(CodeGenerationSymbolFactory.CreateMethodSymbol(
                       method.ContainingType,
                       method.GetAttributes(),
                       method.DeclaredAccessibility,
                       method.GetSymbolModifiers(),
                       method.ReturnType,
                       method.ExplicitInterfaceImplementations.FirstOrDefault(),
                       method.Name,
                       method.TypeParameters,
                       method.Parameters.Select(p =>
                                                CodeGenerationSymbolFactory.CreateParameterSymbol(
                                                    p.GetAttributes().Where(a => !a.AttributeClass.Equals(attributeType)).ToList(),
                                                    p.RefKind, p.IsParams, p.Type, p.Name, p.IsOptional,
                                                    p.HasExplicitDefaultValue, p.HasExplicitDefaultValue ? p.ExplicitDefaultValue : null)).ToList(),
                       statements,
                       handlesExpressions,
                       method.GetReturnTypeAttributes().Where(a => !a.AttributeClass.Equals(attributeType)).ToList()));
        }
 internal static IMethodSymbol CreateMethodSymbol(
     IMethodSymbol method,
     IList<AttributeData> attributes = null,
     Accessibility? accessibility = null,
     DeclarationModifiers? modifiers = null,
     IMethodSymbol explicitInterfaceSymbol = null,
     string name = null,
     IList<SyntaxNode> statements = null)
 {
     return CodeGenerationSymbolFactory.CreateMethodSymbol(
         attributes,
         accessibility ?? method.DeclaredAccessibility,
         modifiers ?? method.GetSymbolModifiers(),
         method.ReturnType,
         explicitInterfaceSymbol,
         name ?? method.Name,
         method.TypeParameters,
         method.Parameters,
         statements,
         returnTypeAttributes: method.GetReturnTypeAttributes());
 }
 internal static IMethodSymbol CreateAccessorSymbol(
     IMethodSymbol accessor,
     IList<AttributeData> attributes = null,
     Accessibility? accessibility = null,
     IMethodSymbol explicitInterfaceSymbol = null,
     IList<SyntaxNode> statements = null)
 {
     return CodeGenerationSymbolFactory.CreateMethodSymbol(
         attributes,
         accessibility ?? accessor.DeclaredAccessibility,
         accessor.GetSymbolModifiers().WithIsAbstract(statements == null),
         accessor.ReturnType,
         explicitInterfaceSymbol ?? accessor.ExplicitInterfaceImplementations.FirstOrDefault(),
         accessor.Name,
         accessor.TypeParameters,
         accessor.Parameters,
         statements,
         returnTypeAttributes: accessor.GetReturnTypeAttributes());
 }