Browse Source

More patches

pull/11062/head
Nikita Tsukanov 4 years ago
parent
commit
f9955f0c79
  1. 49
      nukebuild/RefAssemblyGenerator.cs

49
nukebuild/RefAssemblyGenerator.cs

@ -18,31 +18,39 @@ public class RefAssemblyGenerator
var def = AssemblyDef.Load(new MemoryStream(File.ReadAllBytes(file))); var def = AssemblyDef.Load(new MemoryStream(File.ReadAllBytes(file)));
var obsoleteAttribute = new TypeRefUser(def.ManifestModule, "System", "ObsoleteAttribute", def.ManifestModule.CorLibTypes.AssemblyRef);
var obsoleteCtor = def.ManifestModule.Import(new MemberRefUser(def.ManifestModule, ".ctor",
new MethodSig(CallingConvention.Default, 0, def.ManifestModule.CorLibTypes.Void, new TypeSig[]
{
def.ManifestModule.CorLibTypes.String
}), obsoleteAttribute));
foreach(var t in def.ManifestModule.Types) foreach(var t in def.ManifestModule.Types)
ProcessType(t); ProcessType(t, obsoleteCtor);
def.Write(file, new ModuleWriterOptions(def.ManifestModule) def.Write(file, new ModuleWriterOptions(def.ManifestModule)
{ {
StrongNameKey = new StrongNameKey(snk), StrongNameKey = new StrongNameKey(snk),
}); });
} }
static void ProcessType(TypeDef type) static void ProcessType(TypeDef type, MemberRef obsoleteCtor)
{ {
foreach (var nested in type.NestedTypes) foreach (var nested in type.NestedTypes)
ProcessType(nested); ProcessType(nested, obsoleteCtor);
if (type.IsInterface) if (type.IsInterface)
{ {
var hideMethods = type.Name.EndsWith("Impl"); var hideMethods = type.Name.EndsWith("Impl");
var injectMethod = hideMethods var injectMethod = hideMethods
|| type.CustomAttributes.Any(a => || type.CustomAttributes.Any(a =>
a.AttributeType.FullName.EndsWith("NotClientImplementableAttribute")); a.AttributeType.FullName.EndsWith("NotClientImplementableAttribute"));
if (hideMethods) if (hideMethods)
{ {
foreach (var m in type.Methods) foreach (var m in type.Methods)
{ {
m.Attributes |= MethodAttributes.Public | MethodAttributes.Assembly; var dflags = MethodAttributes.Public | MethodAttributes.Family | MethodAttributes.FamORAssem |
m.Attributes ^= MethodAttributes.Public; MethodAttributes.FamANDAssem | MethodAttributes.Assembly;
m.Attributes = ((m.Attributes | dflags) ^ dflags) | MethodAttributes.Assembly;
} }
} }
@ -55,8 +63,37 @@ public class RefAssemblyGenerator
| MethodAttributes.NewSlot | MethodAttributes.NewSlot
| MethodAttributes.HideBySig)); | MethodAttributes.HideBySig));
} }
var forceUnstable = type.CustomAttributes.Any(a =>
a.AttributeType.FullName.EndsWith("UnstableAttribute"));
foreach (var m in type.Methods)
MarkAsUnstable(m, obsoleteCtor, forceUnstable);
foreach (var m in type.Properties)
MarkAsUnstable(m, obsoleteCtor, forceUnstable);
foreach (var m in type.Events)
MarkAsUnstable(m, obsoleteCtor, forceUnstable);
} }
} }
static void MarkAsUnstable(IMemberDef def, MemberRef obsoleteCtor, bool force)
{
if (!force
|| def.HasCustomAttributes == false
|| !def.CustomAttributes.Any(a =>
a.AttributeType.FullName.EndsWith("UnstableAttribute")))
return;
if (def.CustomAttributes.Any(a => a.TypeFullName.EndsWith("ObsoleteAttribute")))
return;
def.CustomAttributes.Add(new CustomAttribute(obsoleteCtor, new CAArgument[]
{
new(def.Module.CorLibTypes.String,
"This is a part of unstable API and can be changed in minor releases. You have been warned")
}));
}
public static void GenerateRefAsmsInPackage(string packagePath) public static void GenerateRefAsmsInPackage(string packagePath)
{ {

Loading…
Cancel
Save