Browse Source

Support references to specialized methods/fields.

pull/728/head
Daniel Grunwald 11 years ago
parent
commit
0cde213429
  1. 44
      ICSharpCode.Decompiler/DecompilerTypeSystem.cs

44
ICSharpCode.Decompiler/DecompilerTypeSystem.cs

@ -5,6 +5,7 @@ using System.Linq; @@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
using Mono.Cecil;
@ -129,26 +130,19 @@ namespace ICSharpCode.Decompiler @@ -129,26 +130,19 @@ namespace ICSharpCode.Decompiler
if (fieldReference == null)
throw new ArgumentNullException("fieldReference");
lock (fieldLookupCache) {
IField field;
if (!fieldLookupCache.TryGetValue(fieldReference, out field)) {
field = GetNonGenericField(fieldReference);
// TODO: specialize the field if necessary
fieldLookupCache[fieldReference] = field;
}
return field;
}
}
IField GetNonGenericField(FieldReference fieldReference)
{
Debug.Assert(Monitor.IsEntered(fieldLookupCache));
IField field;
if (!fieldLookupCache.TryGetValue(fieldReference, out field)) {
field = FindNonGenericField(fieldReference);
if (fieldReference.DeclaringType.IsGenericInstance) {
var git = (GenericInstanceType)fieldReference.DeclaringType;
var typeArguments = git.GenericArguments.SelectArray(GetType);
field = (IField)field.Specialize(new TypeParameterSubstitution(typeArguments, null));
}
fieldLookupCache.Add(fieldReference, field);
}
return field;
}
}
IField FindNonGenericField(FieldReference fieldReference)
{
@ -195,25 +189,25 @@ namespace ICSharpCode.Decompiler @@ -195,25 +189,25 @@ namespace ICSharpCode.Decompiler
lock (methodLookupCache) {
IMethod method;
if (!methodLookupCache.TryGetValue(methodReference, out method)) {
method = GetNonGenericMethod(methodReference.GetElementMethod());
// TODO: specialize the method
methodLookupCache[methodReference] = method;
method = FindNonGenericMethod(methodReference.GetElementMethod());
if (methodReference.IsGenericInstance || methodReference.DeclaringType.IsGenericInstance) {
IList<IType> classTypeArguments = null;
IList<IType> methodTypeArguments = null;
if (methodReference.IsGenericInstance) {
var gim = ((GenericInstanceMethod)methodReference);
methodTypeArguments = gim.GenericArguments.SelectArray(GetType);
}
return method;
if (methodReference.DeclaringType.IsGenericInstance) {
var git = (GenericInstanceType)methodReference.DeclaringType;
classTypeArguments = git.GenericArguments.SelectArray(GetType);
}
method = method.Specialize(new TypeParameterSubstitution(classTypeArguments, methodTypeArguments));
}
IMethod GetNonGenericMethod(MethodReference methodReference)
{
Debug.Assert(Monitor.IsEntered(methodLookupCache));
IMethod method;
if (!methodLookupCache.TryGetValue(methodReference, out method)) {
method = FindNonGenericMethod(methodReference);
methodLookupCache.Add(methodReference, method);
}
return method;
}
}
IMethod FindNonGenericMethod(MethodReference methodReference)
{

Loading…
Cancel
Save