diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
index b1a6a368cb..c00c62a9c5 100644
--- a/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
+++ b/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
@@ -518,7 +518,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return decl;
}
- Accessor ConvertAccessor(IAccessor accessor)
+ Accessor ConvertAccessor(IMethod accessor)
{
if (accessor == null)
return Accessor.Null;
diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
index 5b8d9f7495..4676191db3 100644
--- a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
+++ b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
@@ -916,11 +916,16 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
Expression resolveExpr;
var name = GetAnonymousTypePropertyName(expr, out resolveExpr);
if (!string.IsNullOrEmpty(name)) {
+ var returnType = new VarTypeReference(this, resolver, resolveExpr);
var property = new DefaultUnresolvedProperty {
Name = name,
Accessibility = Accessibility.Public,
- ReturnType = new VarTypeReference(this, resolver, resolveExpr),
- Getter = DefaultUnresolvedAccessor.GetFromAccessibility(Accessibility.Public)
+ ReturnType = returnType,
+ Getter = new DefaultUnresolvedMethod {
+ Name = "get_" + name,
+ Accessibility = Accessibility.Public,
+ ReturnType = returnType
+ }
};
properties.Add(property);
}
diff --git a/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs b/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs
index 984c5ea408..62111cc451 100644
--- a/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs
+++ b/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs
@@ -600,8 +600,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
p.InterfaceImplementations.Add(new DefaultMemberReference(
p.EntityType, ConvertType(propertyDeclaration.PrivateImplementationType), p.Name));
}
- p.Getter = ConvertAccessor(propertyDeclaration.Getter, p.Accessibility);
- p.Setter = ConvertAccessor(propertyDeclaration.Setter, p.Accessibility);
+ p.Getter = ConvertAccessor(propertyDeclaration.Getter, p, "get_");
+ p.Setter = ConvertAccessor(propertyDeclaration.Setter, p, "set_");
currentTypeDefinition.Members.Add(p);
if (interningProvider != null) {
p.ApplyInterningProvider(interningProvider);
@@ -619,8 +619,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
p.ReturnType = ConvertType(indexerDeclaration.ReturnType);
ConvertAttributes(p.Attributes, indexerDeclaration.Attributes);
- p.Getter = ConvertAccessor(indexerDeclaration.Getter, p.Accessibility);
- p.Setter = ConvertAccessor(indexerDeclaration.Setter, p.Accessibility);
+ p.Getter = ConvertAccessor(indexerDeclaration.Getter, p, "get_");
+ p.Setter = ConvertAccessor(indexerDeclaration.Setter, p, "set_");
ConvertParameters(p.Parameters, indexerDeclaration.Parameters);
if (!indexerDeclaration.PrivateImplementationType.IsNull) {
@@ -636,17 +636,27 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
return p;
}
- IUnresolvedAccessor ConvertAccessor(Accessor accessor, Accessibility defaultAccessibility)
+ DefaultUnresolvedMethod ConvertAccessor(Accessor accessor, IUnresolvedMember p, string prefix)
{
if (accessor.IsNull)
return null;
- DefaultUnresolvedAccessor a = new DefaultUnresolvedAccessor();
- a.Accessibility = GetAccessibility(accessor.Modifiers) ?? defaultAccessibility;
+ var a = new DefaultUnresolvedMethod(currentTypeDefinition, prefix + p.Name);
+ a.Accessibility = GetAccessibility(accessor.Modifiers) ?? p.Accessibility;
a.Region = MakeRegion(accessor);
+ DefaultUnresolvedParameter param = null;
+ if (accessor.Role == PropertyDeclaration.GetterRole) {
+ a.ReturnType = p.ReturnType;
+ } else {
+ param = new DefaultUnresolvedParameter(p.ReturnType, "value");
+ a.Parameters.Add(param);
+ a.ReturnType = KnownTypeReference.Void;
+ }
foreach (AttributeSection section in accessor.Attributes) {
if (section.AttributeTarget == "return") {
ConvertAttributes(a.ReturnTypeAttributes, section);
- } else if (section.AttributeTarget != "param") {
+ } else if (param != null && section.AttributeTarget == "param") {
+ ConvertAttributes(param.Attributes, section);
+ } else {
ConvertAttributes(a.Attributes, section);
}
}
@@ -670,16 +680,17 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
ev.ReturnType = ConvertType(eventDeclaration.ReturnType);
- if (eventDeclaration.Attributes.Any(a => a.AttributeTarget == "method")) {
- ev.AddAccessor = ev.RemoveAccessor = new DefaultUnresolvedAccessor { Accessibility = ev.Accessibility };
- } else {
- // if there's no attributes on the accessors, we can re-use the shared accessor instance
- ev.AddAccessor = ev.RemoveAccessor = DefaultUnresolvedAccessor.GetFromAccessibility(ev.Accessibility);
- }
+ var valueParameter = new DefaultUnresolvedParameter(ev.ReturnType, "value");
+ ev.AddAccessor = CreateDefaultEventAccessor(ev, "get_" + ev.Name, valueParameter);
+ ev.RemoveAccessor = CreateDefaultEventAccessor(ev, "set_" + ev.Name, valueParameter);
+
foreach (AttributeSection section in eventDeclaration.Attributes) {
if (section.AttributeTarget == "method") {
- // as we use the same instance for AddAccessor and RemoveAccessor, we only need to add the attribute once
- ConvertAttributes(ev.AddAccessor.Attributes, section);
+ foreach (var attrNode in section.Attributes) {
+ IUnresolvedAttribute attr = ConvertAttribute(attrNode);
+ ev.AddAccessor.Attributes.Add(attr);
+ ev.RemoveAccessor.Attributes.Add(attr);
+ }
} else if (section.AttributeTarget != "field") {
ConvertAttributes(ev.Attributes, section);
}
@@ -693,6 +704,17 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
return isSingleEvent ? ev : null;
}
+ DefaultUnresolvedMethod CreateDefaultEventAccessor(IUnresolvedEvent ev, string name, IUnresolvedParameter valueParameter)
+ {
+ var a = new DefaultUnresolvedMethod(currentTypeDefinition, name);
+ a.Region = ev.BodyRegion;
+ a.BodyRegion = ev.BodyRegion;
+ a.Accessibility = ev.Accessibility;
+ a.ReturnType = KnownTypeReference.Void;
+ a.Parameters.Add(valueParameter);
+ return a;
+ }
+
public override IUnresolvedEntity VisitCustomEventDeclaration(CustomEventDeclaration eventDeclaration, object data)
{
DefaultUnresolvedEvent e = new DefaultUnresolvedEvent(currentTypeDefinition, eventDeclaration.Name);
@@ -708,8 +730,8 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
e.EntityType, ConvertType(eventDeclaration.PrivateImplementationType), e.Name));
}
- e.AddAccessor = ConvertAccessor(eventDeclaration.AddAccessor, e.Accessibility);
- e.RemoveAccessor = ConvertAccessor(eventDeclaration.RemoveAccessor, e.Accessibility);
+ e.AddAccessor = ConvertAccessor(eventDeclaration.AddAccessor, e, "add_");
+ e.RemoveAccessor = ConvertAccessor(eventDeclaration.RemoveAccessor, e, "remove_");
currentTypeDefinition.Members.Add(e);
if (interningProvider != null) {
diff --git a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
index 804552d0a1..ee7b652794 100644
--- a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
+++ b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
@@ -109,7 +109,6 @@
-
@@ -134,7 +133,6 @@
-
@@ -142,7 +140,6 @@
-
diff --git a/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs b/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs
index ae405598b4..f312ba43dd 100644
--- a/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs
@@ -1584,15 +1584,13 @@ namespace ICSharpCode.NRefactory.TypeSystem
td.AddDefaultConstructorIfRequired = (td.Kind == TypeKind.Struct || td.Kind == TypeKind.Enum);
if (typeDefinition.HasMethods) {
foreach (MethodDefinition method in typeDefinition.Methods) {
- if (IsVisible(method.Attributes)) {
+ if (IsVisible(method.Attributes) && !IsAccessor(method.SemanticsAttributes)) {
EntityType type = EntityType.Method;
if (method.IsSpecialName) {
if (method.IsConstructor)
type = EntityType.Constructor;
else if (method.Name.StartsWith("op_", StringComparison.Ordinal))
type = EntityType.Operator;
- else
- continue;
}
td.Members.Add(ReadMethod(method, td, type));
}
@@ -1629,12 +1627,19 @@ namespace ICSharpCode.NRefactory.TypeSystem
}
}
}
+
+ static bool IsAccessor(MethodSemanticsAttributes semantics)
+ {
+ return !(semantics == MethodSemanticsAttributes.None || semantics == MethodSemanticsAttributes.Other);
+ }
#endregion
#region Read Method
[CLSCompliant(false)]
public IUnresolvedMethod ReadMethod(MethodDefinition method, IUnresolvedTypeDefinition parentType, EntityType methodType = EntityType.Method)
{
+ if (method == null)
+ return null;
DefaultUnresolvedMethod m = new DefaultUnresolvedMethod(parentType, method.Name);
m.EntityType = methodType;
if (method.HasGenericParameters) {
@@ -1862,8 +1867,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
TranslateModifiers(property.GetMethod ?? property.SetMethod, p);
p.ReturnType = ReadTypeReference(property.PropertyType, typeAttributes: property);
- p.Getter = ReadAccessor(property.GetMethod);
- p.Setter = ReadAccessor(property.SetMethod);
+ p.Getter = ReadMethod(property.GetMethod, parentType);
+ p.Setter = ReadMethod(property.SetMethod, parentType);
if (property.HasParameters) {
foreach (ParameterDefinition par in property.Parameters) {
@@ -1875,23 +1880,6 @@ namespace ICSharpCode.NRefactory.TypeSystem
FinishReadMember(p, property);
return p;
}
-
- IUnresolvedAccessor ReadAccessor(MethodDefinition accessorMethod)
- {
- if (accessorMethod != null && IsVisible(accessorMethod.Attributes)) {
- Accessibility accessibility = GetAccessibility(accessorMethod.Attributes);
- if (HasAnyAttributes(accessorMethod)) {
- DefaultUnresolvedAccessor a = new DefaultUnresolvedAccessor();
- a.Accessibility = accessibility;
- AddAttributes(accessorMethod, a.Attributes, a.ReturnTypeAttributes);
- return a;
- } else {
- return DefaultUnresolvedAccessor.GetFromAccessibility(accessibility);
- }
- } else {
- return null;
- }
- }
#endregion
#region Read Event
@@ -1907,9 +1895,9 @@ namespace ICSharpCode.NRefactory.TypeSystem
TranslateModifiers(ev.AddMethod, e);
e.ReturnType = ReadTypeReference(ev.EventType, typeAttributes: ev);
- e.AddAccessor = ReadAccessor(ev.AddMethod);
- e.RemoveAccessor = ReadAccessor(ev.RemoveMethod);
- e.InvokeAccessor = ReadAccessor(ev.InvokeMethod);
+ e.AddAccessor = ReadMethod(ev.AddMethod, parentType);
+ e.RemoveAccessor = ReadMethod(ev.RemoveMethod, parentType);
+ e.InvokeAccessor = ReadMethod(ev.InvokeMethod, parentType);
AddAttributes(ev, e);
diff --git a/ICSharpCode.NRefactory/TypeSystem/IAccessor.cs b/ICSharpCode.NRefactory/TypeSystem/IAccessor.cs
deleted file mode 100644
index ed064f7777..0000000000
--- a/ICSharpCode.NRefactory/TypeSystem/IAccessor.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-
-namespace ICSharpCode.NRefactory.TypeSystem
-{
- ///
- /// Represents an accessor (property getter/setter; or event add/remove/invoke).
- ///
- public interface IUnresolvedAccessor : IHasAccessibility
- {
- ///
- /// Gets the accessor region.
- ///
- DomRegion Region { get; }
-
- ///
- /// Gets the attributes defined on this accessor.
- ///
- IList Attributes { get; }
-
- ///
- /// Gets the attributes defined on the return type of the accessor. (e.g. [return: MarshalAs(...)])
- ///
- IList ReturnTypeAttributes { get; }
-
- IAccessor CreateResolvedAccessor(ITypeResolveContext context);
- }
-
- ///
- /// Represents an accessor (property getter/setter; or event add/remove/invoke).
- ///
- public interface IAccessor : IHasAccessibility
- {
- ///
- /// Gets the accessor region.
- ///
- DomRegion Region { get; }
-
- ///
- /// Gets the attributes defined on this accessor.
- ///
- IList Attributes { get; }
-
- ///
- /// Gets the attributes defined on the return type of the accessor. (e.g. [return: MarshalAs(...)])
- ///
- IList ReturnTypeAttributes { get; }
- }
-}
diff --git a/ICSharpCode.NRefactory/TypeSystem/IEvent.cs b/ICSharpCode.NRefactory/TypeSystem/IEvent.cs
index 7d70edf52c..cc1726fac2 100644
--- a/ICSharpCode.NRefactory/TypeSystem/IEvent.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/IEvent.cs
@@ -28,9 +28,9 @@ namespace ICSharpCode.NRefactory.TypeSystem
bool CanRemove { get; }
bool CanInvoke { get; }
- IUnresolvedAccessor AddAccessor { get; }
- IUnresolvedAccessor RemoveAccessor { get; }
- IUnresolvedAccessor InvokeAccessor { get; }
+ IUnresolvedMethod AddAccessor { get; }
+ IUnresolvedMethod RemoveAccessor { get; }
+ IUnresolvedMethod InvokeAccessor { get; }
}
public interface IEvent : IMember
@@ -39,8 +39,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
bool CanRemove { get; }
bool CanInvoke { get; }
- IAccessor AddAccessor { get; }
- IAccessor RemoveAccessor { get; }
- IAccessor InvokeAccessor { get; }
+ IMethod AddAccessor { get; }
+ IMethod RemoveAccessor { get; }
+ IMethod InvokeAccessor { get; }
}
}
diff --git a/ICSharpCode.NRefactory/TypeSystem/IProperty.cs b/ICSharpCode.NRefactory/TypeSystem/IProperty.cs
index e8b9cc903e..e815638a3e 100644
--- a/ICSharpCode.NRefactory/TypeSystem/IProperty.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/IProperty.cs
@@ -28,8 +28,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
bool CanGet { get; }
bool CanSet { get; }
- IUnresolvedAccessor Getter { get; }
- IUnresolvedAccessor Setter { get; }
+ IUnresolvedMethod Getter { get; }
+ IUnresolvedMethod Setter { get; }
bool IsIndexer { get; }
}
@@ -42,8 +42,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
bool CanGet { get; }
bool CanSet { get; }
- IAccessor Getter { get; }
- IAccessor Setter { get; }
+ IMethod Getter { get; }
+ IMethod Setter { get; }
bool IsIndexer { get; }
}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs
index 349967d425..e14760febb 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs
@@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
+using ICSharpCode.NRefactory.Utils;
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
@@ -51,7 +52,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return unresolved; }
}
- public IList InterfaceImplementations {
+ IList IMember.InterfaceImplementations {
get {
throw new NotImplementedException();
}
@@ -77,5 +78,18 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
return new DefaultMemberReference(this.EntityType, this.DeclaringType.ToTypeReference(), this.Name);
}
+
+ internal IMethod GetAccessor(ref IMethod accessorField, IUnresolvedMethod unresolvedAccessor)
+ {
+ if (unresolvedAccessor == null)
+ return null;
+ IMethod result = accessorField;
+ if (result != null) {
+ LazyInit.ReadBarrier();
+ return result;
+ } else {
+ return LazyInit.GetOrSet(ref accessorField, (IMethod)unresolvedAccessor.CreateResolved(context));
+ }
+ }
}
}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedAccessor.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedAccessor.cs
deleted file mode 100644
index 88a1a27ead..0000000000
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedAccessor.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using ICSharpCode.NRefactory.Utils;
-
-namespace ICSharpCode.NRefactory.TypeSystem.Implementation
-{
- public sealed class DefaultResolvedAccessor : IAccessor
- {
- readonly Accessibility accessibility;
- readonly DomRegion region;
- readonly IList attributes;
- readonly IList returnTypeAttributes;
-
- public DefaultResolvedAccessor(Accessibility accessibility, DomRegion region = default(DomRegion), IList attributes = null, IList returnTypeAttributes = null)
- {
- this.accessibility = accessibility;
- this.region = region;
- this.attributes = attributes ?? EmptyList.Instance;
- this.returnTypeAttributes = returnTypeAttributes ?? EmptyList.Instance;
- }
-
- public DomRegion Region {
- get { return region; }
- }
-
- public IList Attributes {
- get { return attributes; }
- }
-
- public IList ReturnTypeAttributes {
- get { return returnTypeAttributes; }
- }
-
- public Accessibility Accessibility {
- get { return accessibility; }
- }
-
- public bool IsPrivate {
- get { return accessibility == Accessibility.Private; }
- }
-
- public bool IsPublic {
- get { return accessibility == Accessibility.Public; }
- }
-
- public bool IsProtected {
- get { return accessibility == Accessibility.Protected; }
- }
-
- public bool IsInternal {
- get { return accessibility == Accessibility.Internal; }
- }
-
- public bool IsProtectedOrInternal {
- get { return accessibility == Accessibility.ProtectedOrInternal; }
- }
-
- public bool IsProtectedAndInternal {
- get { return accessibility == Accessibility.ProtectedAndInternal; }
- }
- }
-}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedEvent.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedEvent.cs
index 7066d2515a..7ff51c8a0c 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedEvent.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedEvent.cs
@@ -25,9 +25,9 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public class DefaultResolvedEvent : AbstractResolvedMember, IEvent
{
protected new readonly IUnresolvedEvent unresolved;
- IAccessor addAccessor;
- IAccessor removeAccessor;
- IAccessor invokeAccessor;
+ IMethod addAccessor;
+ IMethod removeAccessor;
+ IMethod invokeAccessor;
public DefaultResolvedEvent(IUnresolvedEvent unresolved, ITypeResolveContext parentContext)
: base(unresolved, parentContext)
@@ -47,46 +47,16 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return unresolved.CanInvoke; }
}
- public IAccessor AddAccessor {
- get {
- if (!unresolved.CanAdd)
- return null;
- IAccessor result = this.addAccessor;
- if (result != null) {
- LazyInit.ReadBarrier();
- return result;
- } else {
- return LazyInit.GetOrSet(ref this.addAccessor, unresolved.AddAccessor.CreateResolvedAccessor(context));
- }
- }
+ public IMethod AddAccessor {
+ get { return GetAccessor(ref addAccessor, unresolved.AddAccessor); }
}
- public IAccessor RemoveAccessor {
- get {
- if (!unresolved.CanRemove)
- return null;
- IAccessor result = this.removeAccessor;
- if (result != null) {
- LazyInit.ReadBarrier();
- return result;
- } else {
- return LazyInit.GetOrSet(ref this.removeAccessor, unresolved.RemoveAccessor.CreateResolvedAccessor(context));
- }
- }
+ public IMethod RemoveAccessor {
+ get { return GetAccessor(ref removeAccessor, unresolved.RemoveAccessor); }
}
- public IAccessor InvokeAccessor {
- get {
- if (!unresolved.CanInvoke)
- return null;
- IAccessor result = this.invokeAccessor;
- if (result != null) {
- LazyInit.ReadBarrier();
- return result;
- } else {
- return LazyInit.GetOrSet(ref this.invokeAccessor, unresolved.InvokeAccessor.CreateResolvedAccessor(context));
- }
- }
+ public IMethod InvokeAccessor {
+ get { return GetAccessor(ref invokeAccessor, unresolved.InvokeAccessor); }
}
}
}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedProperty.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedProperty.cs
index fa9704f331..f0a68b65ac 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedProperty.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedProperty.cs
@@ -27,8 +27,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
protected new readonly IUnresolvedProperty unresolved;
readonly IList parameters;
- IAccessor getter;
- IAccessor setter;
+ IMethod getter;
+ IMethod setter;
public DefaultResolvedProperty(IUnresolvedProperty unresolved, ITypeResolveContext parentContext)
: base(unresolved, parentContext)
@@ -49,32 +49,12 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return unresolved.CanSet; }
}
- public IAccessor Getter {
- get {
- if (!unresolved.CanGet)
- return null;
- IAccessor result = this.getter;
- if (result != null) {
- LazyInit.ReadBarrier();
- return result;
- } else {
- return LazyInit.GetOrSet(ref this.getter, unresolved.Getter.CreateResolvedAccessor(context));
- }
- }
+ public IMethod Getter {
+ get { return GetAccessor(ref getter, unresolved.Getter); }
}
- public IAccessor Setter {
- get {
- if (!unresolved.CanSet)
- return null;
- IAccessor result = this.setter;
- if (result != null) {
- LazyInit.ReadBarrier();
- return result;
- } else {
- return LazyInit.GetOrSet(ref this.setter, unresolved.Setter.CreateResolvedAccessor(context));
- }
- }
+ public IMethod Setter {
+ get { return GetAccessor(ref setter, unresolved.Setter); }
}
public bool IsIndexer {
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAccessor.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAccessor.cs
deleted file mode 100644
index 6bd0256c1e..0000000000
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAccessor.cs
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using ICSharpCode.NRefactory.Utils;
-
-namespace ICSharpCode.NRefactory.TypeSystem.Implementation
-{
- ///
- /// Default implementation of .
- ///
- [Serializable]
- public sealed class DefaultUnresolvedAccessor : AbstractFreezable, IUnresolvedAccessor, ISupportsInterning, IFreezable
- {
- static readonly DefaultUnresolvedAccessor[] defaultAccessors = CreateDefaultAccessors();
-
- static DefaultUnresolvedAccessor[] CreateDefaultAccessors()
- {
- DefaultUnresolvedAccessor[] accessors = new DefaultUnresolvedAccessor[(int)Accessibility.ProtectedAndInternal + 1];
- for (int i = 0; i < accessors.Length; i++) {
- accessors[i] = new DefaultUnresolvedAccessor();
- accessors[i].accessibility = (Accessibility)i;
- accessors[i].Freeze();
- }
- return accessors;
- }
-
- ///
- /// Gets the default accessor with the specified accessibility (and without attributes or region).
- ///
- public static IUnresolvedAccessor GetFromAccessibility(Accessibility accessibility)
- {
- int index = (int)accessibility;
- if (index >= 0 && index < defaultAccessors.Length) {
- return defaultAccessors[index];
- } else {
- DefaultUnresolvedAccessor a = new DefaultUnresolvedAccessor();
- a.accessibility = accessibility;
- a.Freeze();
- return a;
- }
- }
-
- Accessibility accessibility;
- DomRegion region;
- IList attributes;
- IList returnTypeAttributes;
-
- protected override void FreezeInternal()
- {
- base.FreezeInternal();
- this.attributes = FreezableHelper.FreezeListAndElements(this.attributes);
- this.returnTypeAttributes = FreezableHelper.FreezeListAndElements(this.returnTypeAttributes);
- }
-
- public Accessibility Accessibility {
- get { return accessibility; }
- set {
- FreezableHelper.ThrowIfFrozen(this);
- accessibility = value;
- }
- }
-
- public DomRegion Region {
- get { return region; }
- set {
- FreezableHelper.ThrowIfFrozen(this);
- region = value;
- }
- }
-
- public IList Attributes {
- get {
- if (attributes == null)
- attributes = new List();
- return attributes;
- }
- }
-
- public IList ReturnTypeAttributes {
- get {
- if (returnTypeAttributes == null)
- returnTypeAttributes = new List();
- return returnTypeAttributes;
- }
- }
-
- bool IHasAccessibility.IsPrivate {
- get { return accessibility == Accessibility.Private; }
- }
-
- bool IHasAccessibility.IsPublic {
- get { return accessibility == Accessibility.Public; }
- }
-
- bool IHasAccessibility.IsProtected {
- get { return accessibility == Accessibility.Protected; }
- }
-
- bool IHasAccessibility.IsInternal {
- get { return accessibility == Accessibility.Internal; }
- }
-
- bool IHasAccessibility.IsProtectedOrInternal {
- get { return accessibility == Accessibility.ProtectedOrInternal; }
- }
-
- bool IHasAccessibility.IsProtectedAndInternal {
- get { return accessibility == Accessibility.ProtectedAndInternal; }
- }
-
- void ISupportsInterning.PrepareForInterning(IInterningProvider provider)
- {
- if (!this.IsFrozen) {
- attributes = provider.InternList(attributes);
- returnTypeAttributes = provider.InternList(returnTypeAttributes);
- }
- }
-
- int ISupportsInterning.GetHashCodeForInterning()
- {
- return (attributes != null ? attributes.GetHashCode() : 0)
- ^ (returnTypeAttributes != null ? returnTypeAttributes.GetHashCode() : 0)
- ^ region.GetHashCode() ^ (int)accessibility;
- }
-
- bool ISupportsInterning.EqualsForInterning(ISupportsInterning other)
- {
- DefaultUnresolvedAccessor o = other as DefaultUnresolvedAccessor;
- return o != null && (attributes == o.attributes && returnTypeAttributes == o.returnTypeAttributes
- && accessibility == o.accessibility && region == o.region);
- }
-
- public IAccessor CreateResolvedAccessor(ITypeResolveContext context)
- {
- Freeze();
- return new DefaultResolvedAccessor(accessibility, region, attributes.CreateResolvedAttributes(context), returnTypeAttributes.CreateResolvedAttributes(context));
- }
- }
-}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedEvent.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedEvent.cs
index 12037de9a6..2e502aa39c 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedEvent.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedEvent.cs
@@ -26,7 +26,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
[Serializable]
public class DefaultUnresolvedEvent : AbstractUnresolvedMember, IUnresolvedEvent
{
- IUnresolvedAccessor addAccessor, removeAccessor, invokeAccessor;
+ IUnresolvedMethod addAccessor, removeAccessor, invokeAccessor;
protected override void FreezeInternal()
{
@@ -70,7 +70,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return invokeAccessor != null; }
}
- public IUnresolvedAccessor AddAccessor {
+ public IUnresolvedMethod AddAccessor {
get { return addAccessor; }
set {
ThrowIfFrozen();
@@ -78,7 +78,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
- public IUnresolvedAccessor RemoveAccessor {
+ public IUnresolvedMethod RemoveAccessor {
get { return removeAccessor; }
set {
ThrowIfFrozen();
@@ -86,7 +86,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
- public IUnresolvedAccessor InvokeAccessor {
+ public IUnresolvedMethod InvokeAccessor {
get { return invokeAccessor; }
set {
ThrowIfFrozen();
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedProperty.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedProperty.cs
index ab3d24ae8f..3f7765b923 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedProperty.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedProperty.cs
@@ -27,7 +27,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
[Serializable]
public class DefaultUnresolvedProperty : AbstractUnresolvedMember, IUnresolvedProperty
{
- IUnresolvedAccessor getter, setter;
+ IUnresolvedMethod getter, setter;
IList parameters;
protected override void FreezeInternal()
@@ -80,7 +80,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return setter != null; }
}
- public IUnresolvedAccessor Getter {
+ public IUnresolvedMethod Getter {
get { return getter; }
set {
ThrowIfFrozen();
@@ -88,7 +88,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
- public IUnresolvedAccessor Setter {
+ public IUnresolvedMethod Setter {
get { return setter; }
set {
ThrowIfFrozen();
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedEvent.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedEvent.cs
index 3e8892f383..db0f39776e 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedEvent.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedEvent.cs
@@ -53,16 +53,16 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return eventDefinition.CanInvoke; }
}
- public IAccessor AddAccessor {
- get { return eventDefinition.AddAccessor; }
+ public IMethod AddAccessor {
+ get { return WrapAccessor(eventDefinition.AddAccessor); }
}
- public IAccessor RemoveAccessor {
- get { return eventDefinition.RemoveAccessor; }
+ public IMethod RemoveAccessor {
+ get { return WrapAccessor(eventDefinition.RemoveAccessor); }
}
- public IAccessor InvokeAccessor {
- get { return eventDefinition.InvokeAccessor; }
+ public IMethod InvokeAccessor {
+ get { return WrapAccessor(eventDefinition.InvokeAccessor); }
}
}
}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMember.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMember.cs
index 92e86ad685..fb81ef7524 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMember.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMember.cs
@@ -70,6 +70,14 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
return type.AcceptVisitor(substitution);
}
+ internal IMethod WrapAccessor(IMethod accessorDefinition)
+ {
+ if (accessorDefinition == null)
+ return null;
+ else
+ return new SpecializedMethod(declaringType, accessorDefinition);
+ }
+
public IType DeclaringType {
get { return declaringType; }
}
@@ -118,7 +126,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return memberDefinition.Attributes; }
}
- public IList InterfaceImplementations {
+ IList IMember.InterfaceImplementations {
get { throw new NotImplementedException(); }
}
diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedProperty.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedProperty.cs
index 84232c45ae..f3a63ada23 100644
--- a/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedProperty.cs
+++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedProperty.cs
@@ -49,12 +49,12 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return propertyDefinition.CanSet; }
}
- public IAccessor Getter {
- get { return propertyDefinition.Getter; }
+ public IMethod Getter {
+ get { return WrapAccessor(propertyDefinition.Getter); }
}
- public IAccessor Setter {
- get { return propertyDefinition.Setter; }
+ public IMethod Setter {
+ get { return WrapAccessor(propertyDefinition.Setter); }
}
public bool IsIndexer {