|
|
|
@ -806,7 +806,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
@@ -806,7 +806,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
|
|
|
|
|
sealed class CecilResolvedAttribute : IAttribute |
|
|
|
|
{ |
|
|
|
|
readonly ITypeResolveContext context; |
|
|
|
|
readonly CecilUnresolvedAttribute unresolved; |
|
|
|
|
readonly byte[] blob; |
|
|
|
|
readonly IList<ITypeReference> ctorParameterTypes; |
|
|
|
|
readonly IType attributeType; |
|
|
|
|
|
|
|
|
|
IMethod constructor; |
|
|
|
@ -818,10 +819,18 @@ namespace ICSharpCode.NRefactory.TypeSystem
@@ -818,10 +819,18 @@ namespace ICSharpCode.NRefactory.TypeSystem
|
|
|
|
|
public CecilResolvedAttribute(ITypeResolveContext context, CecilUnresolvedAttribute unresolved) |
|
|
|
|
{ |
|
|
|
|
this.context = context; |
|
|
|
|
this.unresolved = unresolved; |
|
|
|
|
this.blob = unresolved.blob; |
|
|
|
|
this.ctorParameterTypes = unresolved.ctorParameterTypes; |
|
|
|
|
this.attributeType = unresolved.attributeType.Resolve(context); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public CecilResolvedAttribute(ITypeResolveContext context, IType attributeType) |
|
|
|
|
{ |
|
|
|
|
this.context = context; |
|
|
|
|
this.attributeType = attributeType; |
|
|
|
|
this.ctorParameterTypes = EmptyList<ITypeReference>.Instance; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public DomRegion Region { |
|
|
|
|
get { return DomRegion.Empty; } |
|
|
|
|
} |
|
|
|
@ -842,7 +851,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
@@ -842,7 +851,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
|
|
|
|
|
|
|
|
|
|
IMethod ResolveConstructor() |
|
|
|
|
{ |
|
|
|
|
var parameterTypes = unresolved.ctorParameterTypes.Resolve(context); |
|
|
|
|
var parameterTypes = ctorParameterTypes.Resolve(context); |
|
|
|
|
foreach (var ctor in attributeType.GetConstructors(m => m.Parameters.Count == parameterTypes.Count)) { |
|
|
|
|
bool ok = true; |
|
|
|
|
for (int i = 0; i < parameterTypes.Count; i++) { |
|
|
|
@ -901,12 +910,14 @@ namespace ICSharpCode.NRefactory.TypeSystem
@@ -901,12 +910,14 @@ namespace ICSharpCode.NRefactory.TypeSystem
|
|
|
|
|
|
|
|
|
|
void DecodeBlob(List<ResolveResult> positionalArguments, List<KeyValuePair<IMember, ResolveResult>> namedArguments) |
|
|
|
|
{ |
|
|
|
|
BlobReader reader = new BlobReader(unresolved.blob, context.CurrentAssembly); |
|
|
|
|
if (blob == null) |
|
|
|
|
return; |
|
|
|
|
BlobReader reader = new BlobReader(blob, context.CurrentAssembly); |
|
|
|
|
if (reader.ReadUInt16() != 0x0001) { |
|
|
|
|
Debug.WriteLine("Unknown blob prolog"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
foreach (var ctorParameter in unresolved.ctorParameterTypes.Resolve(context)) { |
|
|
|
|
foreach (var ctorParameter in ctorParameterTypes.Resolve(context)) { |
|
|
|
|
positionalArguments.Add(reader.ReadFixedArg(ctorParameter)); |
|
|
|
|
} |
|
|
|
|
ushort numNamed = reader.ReadUInt16(); |
|
|
|
@ -1151,7 +1162,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
@@ -1151,7 +1162,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
|
|
|
|
|
case KnownTypeCode.String: |
|
|
|
|
return ReadSerString(); |
|
|
|
|
default: |
|
|
|
|
return ErrorResolveResult.UnknownError; |
|
|
|
|
throw new NotSupportedException(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1318,14 +1329,30 @@ namespace ICSharpCode.NRefactory.TypeSystem
@@ -1318,14 +1329,30 @@ namespace ICSharpCode.NRefactory.TypeSystem
|
|
|
|
|
|
|
|
|
|
ITypeResolveContext context = new SimpleTypeResolveContext(currentAssembly); |
|
|
|
|
BlobReader reader = new BlobReader(blob, currentAssembly); |
|
|
|
|
IList<IAttribute> result = new List<IAttribute>(); |
|
|
|
|
if (reader.ReadByte() != '.') { |
|
|
|
|
// should not use UnresolvedSecurityDeclaration for XML secdecls
|
|
|
|
|
throw new InvalidOperationException(); |
|
|
|
|
} |
|
|
|
|
ResolveResult securityActionRR = securityAction.Resolve(context); |
|
|
|
|
uint attributeCount = reader.ReadCompressedUInt32(); |
|
|
|
|
for (uint i = 0; i < attributeCount; i++) { |
|
|
|
|
IAttribute[] attributes = new IAttribute[attributeCount]; |
|
|
|
|
try { |
|
|
|
|
ReadSecurityBlob(reader, attributes, context, securityActionRR); |
|
|
|
|
} catch (NotSupportedException ex) { |
|
|
|
|
// ignore invalid blobs
|
|
|
|
|
Debug.WriteLine(ex.ToString()); |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < attributes.Length; i++) { |
|
|
|
|
if (attributes[i] == null) |
|
|
|
|
attributes[i] = new CecilResolvedAttribute(context, SpecialType.UnknownType); |
|
|
|
|
} |
|
|
|
|
return attributes; |
|
|
|
|
// return (IList<IAttribute>)cache.GetOrAddShared(this, attributes);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ReadSecurityBlob(BlobReader reader, IAttribute[] attributes, ITypeResolveContext context, ResolveResult securityActionRR) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < attributes.Length; i++) { |
|
|
|
|
string attributeTypeName = reader.ReadSerString(); |
|
|
|
|
ITypeReference attributeTypeRef = ReflectionHelper.ParseReflectionName(attributeTypeName); |
|
|
|
|
IType attributeType = attributeTypeRef.Resolve(context); |
|
|
|
@ -1341,15 +1368,12 @@ namespace ICSharpCode.NRefactory.TypeSystem
@@ -1341,15 +1368,12 @@ namespace ICSharpCode.NRefactory.TypeSystem
|
|
|
|
|
namedArgs.Add(namedArg); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
result.Add(new ResolvedSecurityAttribute { |
|
|
|
|
AttributeType = attributeType, |
|
|
|
|
NamedArguments = namedArgs, |
|
|
|
|
PositionalArguments = new ResolveResult[] { securityActionRR } |
|
|
|
|
}); |
|
|
|
|
attributes[i] = new ResolvedSecurityAttribute { |
|
|
|
|
AttributeType = attributeType, |
|
|
|
|
NamedArguments = namedArgs, |
|
|
|
|
PositionalArguments = new ResolveResult[] { securityActionRR } |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
// return (IList<IAttribute>)cache.GetOrAddShared(this, result);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ISupportsInterning.PrepareForInterning(IInterningProvider provider) |
|
|
|
|