// public static bool CompatibleSignatureToDelegate(this IMethodSymbol method, INamedTypeSymbol delegateType) // { // //Contract.ThrowIfFalse(delegateType.TypeKind == TypeKind.Delegate); // // var invoke = delegateType.DelegateInvokeMethod; // if (invoke == null) // { // // It's possible to get events with no invoke method from metadata. We will assume // // that no method can be an event handler for one. // return false; // } // // if (method.Parameters.Length != invoke.Parameters.Length) // { // return false; // } // // if (method.ReturnsVoid != invoke.ReturnsVoid) // { // return false; // } // // if (!method.ReturnType.InheritsFromOrEquals(invoke.ReturnType)) // { // return false; // } // // for (int i = 0; i < method.Parameters.Length; i++) // { // if (!invoke.Parameters[i].Type.InheritsFromOrEquals(method.Parameters[i].Type)) // { // return false; // } // } // // return true; // } // 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); var mapping = new Dictionary <ITypeSymbol, ITypeSymbol>(); for (int i = 0; i < method.TypeParameters.Length; i++) { mapping.Add(method.TypeParameters[i], updatedTypeParameters[i]); } return(CodeGenerationSymbolFactory.CreateMethodSymbol( method.ContainingType, method.GetAttributes(), method.DeclaredAccessibility, method.GetSymbolModifiers(), method.ReturnType.SubstituteTypes(mapping, typeGenerator), method.ExplicitInterfaceImplementations.FirstOrDefault(), method.Name, updatedTypeParameters, method.Parameters.Select(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)).ToList())); }
public 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())); }
public 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())); }
public static IMethodSymbol RenameParameters(this IMethodSymbol method, IList <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.ExplicitInterfaceImplementations.FirstOrDefault(), method.Name, method.TypeParameters, parameters)); }
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())); }