1
// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
3
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4
// software and associated documentation files (the "Software"), to deal in the Software
5
// without restriction, including without limitation the rights to use, copy, modify, merge,
6
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7
// to whom the Software is furnished to do so, subject to the following conditions:
9
// The above copyright notice and this permission notice shall be included in all copies or
10
// substantial portions of the Software.
12
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17
// DEALINGS IN THE SOFTWARE.
20
using System.Collections.Generic;
23
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
26
/// References a member that is an explicit interface implementation.
29
/// Resolving an ExplicitInterfaceImplementationMemberReference requires a context
30
/// that provides enough information for resolving the declaring type reference
31
/// and the interface member reference.
32
/// Note that the interface member reference is resolved in '<c>context.WithCurrentTypeDefinition(declaringType.GetDefinition())</c>'
33
/// - this is done to ensure that open generics in the interface member reference resolve to the type parameters of the
37
public sealed class ExplicitInterfaceImplementationMemberReference : IMemberReference
39
ITypeReference typeReference;
40
IMemberReference interfaceMemberReference;
42
public ExplicitInterfaceImplementationMemberReference(ITypeReference typeReference, IMemberReference interfaceMemberReference)
44
if (typeReference == null)
45
throw new ArgumentNullException("typeReference");
46
if (interfaceMemberReference == null)
47
throw new ArgumentNullException("interfaceMemberReference");
48
this.typeReference = typeReference;
49
this.interfaceMemberReference = interfaceMemberReference;
52
public ITypeReference DeclaringTypeReference {
53
get { return typeReference; }
56
public IMember Resolve(ITypeResolveContext context)
58
IType declaringType = typeReference.Resolve(context);
59
IMember interfaceMember = interfaceMemberReference.Resolve(context.WithCurrentTypeDefinition(declaringType.GetDefinition()));
60
if (interfaceMember == null)
62
IEnumerable<IMember> members;
63
if (interfaceMember.EntityType == EntityType.Accessor) {
64
members = declaringType.GetAccessors(
65
m => m.IsExplicitInterfaceImplementation,
66
GetMemberOptions.IgnoreInheritedMembers);
68
members = declaringType.GetMembers(
69
m => m.EntityType == interfaceMember.EntityType && m.IsExplicitInterfaceImplementation,
70
GetMemberOptions.IgnoreInheritedMembers);
72
return members.FirstOrDefault(m => m.ImplementedInterfaceMembers.Count == 1 && interfaceMember.Equals(m.ImplementedInterfaceMembers[0]));