public override IUnresolvedEntity VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data) { DefaultUnresolvedMethod m = new DefaultUnresolvedMethod(currentTypeDefinition, methodDeclaration.Name); currentMethod = m; // required for resolving type parameters m.Region = MakeRegion(methodDeclaration); m.BodyRegion = MakeRegion(methodDeclaration.Body); if (InheritsConstraints(methodDeclaration) && methodDeclaration.Constraints.Count == 0) { int index = 0; foreach (TypeParameterDeclaration tpDecl in methodDeclaration.TypeParameters) { var tp = new MethodTypeParameterWithInheritedConstraints(index++, tpDecl.Name); tp.Region = MakeRegion(tpDecl); ConvertAttributes(tp.Attributes, tpDecl.Attributes); tp.Variance = tpDecl.Variance; m.TypeParameters.Add(tp); } } else { ConvertTypeParameters(m.TypeParameters, methodDeclaration.TypeParameters, methodDeclaration.Constraints, EntityType.Method); } m.ReturnType = methodDeclaration.ReturnType.ToTypeReference(); ConvertAttributes(m.Attributes, methodDeclaration.Attributes.Where(s => s.AttributeTarget != "return")); ConvertAttributes(m.ReturnTypeAttributes, methodDeclaration.Attributes.Where(s => s.AttributeTarget == "return")); ApplyModifiers(m, methodDeclaration.Modifiers); if (methodDeclaration.IsExtensionMethod) { m.IsExtensionMethod = true; currentTypeDefinition.HasExtensionMethods = true; } ConvertParameters(m.Parameters, methodDeclaration.Parameters); if (!methodDeclaration.PrivateImplementationType.IsNull) { m.Accessibility = Accessibility.None; m.IsExplicitInterfaceImplementation = true; m.ExplicitInterfaceImplementations.Add(new DefaultMemberReference( m.EntityType, methodDeclaration.PrivateImplementationType.ToTypeReference(), m.Name, m.TypeParameters.Count, GetParameterTypes(m.Parameters))); } currentTypeDefinition.Members.Add(m); currentMethod = null; if (interningProvider != null) { m.ApplyInterningProvider(interningProvider); } return m; }
public ResolvedMethodTypeParameterWithInheritedConstraints(MethodTypeParameterWithInheritedConstraints unresolved, ITypeResolveContext context) : base(context.CurrentMember, unresolved.Index, unresolved.Name, unresolved.Variance, unresolved.Attributes.CreateResolvedAttributes(context), unresolved.Region) { }