Free cookie consent management tool by TermsFeed Policy Generator

source: branches/CodeEditor/HeuristicLab.ExtLibs/HeuristicLab.NRefactory/5.5.0/NRefactory-5.5.0/TypeSystem/Implementation/AbstractResolvedMember.cs @ 11700

Last change on this file since 11700 was 11700, checked in by jkarder, 9 years ago

#2077: created branch and added first version

File size: 5.8 KB
Line 
1// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
2//
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:
8//
9// The above copyright notice and this permission notice shall be included in all copies or
10// substantial portions of the Software.
11//
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.
18
19using System;
20using System.Collections.Generic;
21using System.Linq;
22using ICSharpCode.NRefactory.Documentation;
23using ICSharpCode.NRefactory.Utils;
24
25namespace ICSharpCode.NRefactory.TypeSystem.Implementation
26{
27  /// <summary>
28  /// Implementation of <see cref="IMember"/> that resolves an unresolved member.
29  /// </summary>
30  public abstract class AbstractResolvedMember : AbstractResolvedEntity, IMember
31  {
32    protected new readonly IUnresolvedMember unresolved;
33    protected readonly ITypeResolveContext context;
34    volatile IType returnType;
35    IList<IMember> implementedInterfaceMembers;
36   
37    protected AbstractResolvedMember(IUnresolvedMember unresolved, ITypeResolveContext parentContext)
38      : base(unresolved, parentContext)
39    {
40      this.unresolved = unresolved;
41      this.context = parentContext.WithCurrentMember(this);
42    }
43   
44    IMember IMember.MemberDefinition {
45      get { return this; }
46    }
47   
48    public IType ReturnType {
49      get {
50        return this.returnType ?? (this.returnType = unresolved.ReturnType.Resolve(context));
51      }
52    }
53   
54    public IUnresolvedMember UnresolvedMember {
55      get { return unresolved; }
56    }
57   
58    public IList<IMember> ImplementedInterfaceMembers {
59      get {
60        IList<IMember> result = LazyInit.VolatileRead(ref this.implementedInterfaceMembers);
61        if (result != null) {
62          return result;
63        } else {
64          return LazyInit.GetOrSet(ref implementedInterfaceMembers, FindImplementedInterfaceMembers());
65        }
66      }
67    }
68   
69    IList<IMember> FindImplementedInterfaceMembers()
70    {
71      if (unresolved.IsExplicitInterfaceImplementation) {
72        List<IMember> result = new List<IMember>();
73        foreach (var memberReference in unresolved.ExplicitInterfaceImplementations) {
74          IMember member = memberReference.Resolve(context);
75          if (member != null)
76            result.Add(member);
77        }
78        return result.ToArray();
79      } else if (unresolved.IsStatic || !unresolved.IsPublic || DeclaringTypeDefinition == null || DeclaringTypeDefinition.Kind == TypeKind.Interface) {
80        return EmptyList<IMember>.Instance;
81      } else {
82        // TODO: implement interface member mappings correctly
83        var result = InheritanceHelper.GetBaseMembers(this, true)
84          .Where(m => m.DeclaringTypeDefinition != null && m.DeclaringTypeDefinition.Kind == TypeKind.Interface)
85          .ToArray();
86
87        IEnumerable<IMember> otherMembers = DeclaringTypeDefinition.Members;
88        if (SymbolKind == SymbolKind.Accessor)
89          otherMembers = DeclaringTypeDefinition.GetAccessors(options: GetMemberOptions.IgnoreInheritedMembers);
90        result = result.Where(item => !otherMembers.Any(m => m.IsExplicitInterfaceImplementation && m.ImplementedInterfaceMembers.Contains(item))).ToArray();
91
92        return result;
93      }
94    }
95   
96    public override DocumentationComment Documentation {
97      get {
98        IUnresolvedDocumentationProvider docProvider = unresolved.UnresolvedFile as IUnresolvedDocumentationProvider;
99        if (docProvider != null) {
100          var doc = docProvider.GetDocumentation(unresolved, this);
101          if (doc != null)
102            return doc;
103        }
104        return base.Documentation;
105      }
106    }
107   
108    public bool IsExplicitInterfaceImplementation {
109      get { return unresolved.IsExplicitInterfaceImplementation; }
110    }
111   
112    public bool IsVirtual {
113      get { return unresolved.IsVirtual; }
114    }
115   
116    public bool IsOverride {
117      get { return unresolved.IsOverride; }
118    }
119   
120    public bool IsOverridable {
121      get { return unresolved.IsOverridable; }
122    }
123
124    public TypeParameterSubstitution Substitution {
125      get { return TypeParameterSubstitution.Identity; }
126    }
127
128    public abstract IMember Specialize(TypeParameterSubstitution substitution);
129   
130    IMemberReference IMember.ToReference()
131    {
132      return (IMemberReference)ToReference();
133    }
134   
135    public override ISymbolReference ToReference()
136    {
137      var declTypeRef = this.DeclaringType.ToTypeReference();
138      if (IsExplicitInterfaceImplementation && ImplementedInterfaceMembers.Count == 1) {
139        return new ExplicitInterfaceImplementationMemberReference(declTypeRef, ImplementedInterfaceMembers[0].ToReference());
140      } else {
141        return new DefaultMemberReference(this.SymbolKind, declTypeRef, this.Name);
142      }
143    }
144   
145    public virtual IMemberReference ToMemberReference()
146    {
147      return (IMemberReference)ToReference();
148    }
149   
150    internal IMethod GetAccessor(ref IMethod accessorField, IUnresolvedMethod unresolvedAccessor)
151    {
152      if (unresolvedAccessor == null)
153        return null;
154      IMethod result = LazyInit.VolatileRead(ref accessorField);
155      if (result != null) {
156        return result;
157      } else {
158        return LazyInit.GetOrSet(ref accessorField, CreateResolvedAccessor(unresolvedAccessor));
159      }
160    }
161   
162    protected virtual IMethod CreateResolvedAccessor(IUnresolvedMethod unresolvedAccessor)
163    {
164      return (IMethod)unresolvedAccessor.CreateResolved(context);
165    }
166  }
167}
Note: See TracBrowser for help on using the repository browser.