1
// Copyright (c) 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;
22
using ICSharpCode.NRefactory.Documentation;
23
using ICSharpCode.NRefactory.Utils;
25
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
28
/// Implementation of <see cref="IMember"/> that resolves an unresolved member.
30
public abstract class AbstractResolvedMember : AbstractResolvedEntity, IMember
32
protected new readonly IUnresolvedMember unresolved;
33
protected readonly ITypeResolveContext context;
34
volatile IType returnType;
35
IList<IMember> implementedInterfaceMembers;
37
protected AbstractResolvedMember(IUnresolvedMember unresolved, ITypeResolveContext parentContext)
38
: base(unresolved, parentContext)
40
this.unresolved = unresolved;
41
this.context = parentContext.WithCurrentMember(this);
44
IMember IMember.MemberDefinition {
48
public IType ReturnType {
50
return this.returnType ?? (this.returnType = unresolved.ReturnType.Resolve(context));
54
public IUnresolvedMember UnresolvedMember {
55
get { return unresolved; }
58
public IList<IMember> ImplementedInterfaceMembers {
60
IList<IMember> result = LazyInit.VolatileRead(ref this.implementedInterfaceMembers);
64
return LazyInit.GetOrSet(ref implementedInterfaceMembers, FindImplementedInterfaceMembers());
69
IList<IMember> FindImplementedInterfaceMembers()
71
if (unresolved.IsExplicitInterfaceImplementation) {
72
List<IMember> result = new List<IMember>();
73
foreach (var memberReference in unresolved.ExplicitInterfaceImplementations) {
74
IMember member = memberReference.Resolve(context);
78
return result.ToArray();
79
} else if (unresolved.IsStatic) {
80
return EmptyList<IMember>.Instance;
82
// TODO: implement interface member mappings correctly
83
return InheritanceHelper.GetBaseMembers(this, true)
84
.Where(m => m.DeclaringTypeDefinition != null && m.DeclaringTypeDefinition.Kind == TypeKind.Interface)
89
public override DocumentationComment Documentation {
91
IUnresolvedDocumentationProvider docProvider = unresolved.ParsedFile as IUnresolvedDocumentationProvider;
92
if (docProvider != null) {
93
var doc = docProvider.GetDocumentation(unresolved, this);
97
return base.Documentation;
101
public bool IsExplicitInterfaceImplementation {
102
get { return unresolved.IsExplicitInterfaceImplementation; }
105
public bool IsVirtual {
106
get { return unresolved.IsVirtual; }
109
public bool IsOverride {
110
get { return unresolved.IsOverride; }
113
public bool IsOverridable {
114
get { return unresolved.IsOverridable; }
117
public virtual IMemberReference ToMemberReference()
119
var declTypeRef = this.DeclaringType.ToTypeReference();
120
if (IsExplicitInterfaceImplementation && ImplementedInterfaceMembers.Count == 1) {
121
return new ExplicitInterfaceImplementationMemberReference(declTypeRef, ImplementedInterfaceMembers[0].ToMemberReference());
123
return new DefaultMemberReference(this.EntityType, declTypeRef, this.Name);
127
internal IMethod GetAccessor(ref IMethod accessorField, IUnresolvedMethod unresolvedAccessor)
129
if (unresolvedAccessor == null)
131
IMethod result = LazyInit.VolatileRead(ref accessorField);
132
if (result != null) {
135
return LazyInit.GetOrSet(ref accessorField, (IMethod)unresolvedAccessor.CreateResolved(context));