Yeah, I used ildasm to see 0 or 1 is used really.
Seems possible to get methods that use enum and scan through IL of methods
to search for enum member usage through Cecil API? Worth to try?
.method public hidebysig static void Consume(valuetype
[Test.ServiceProvider]Test.ServiceProvider.Enum1 e) cil managed
{
// Code size 15 (0xf)
.maxstack 2
.locals init ([0] bool CS$4$0000)
IL_0000: nop
IL_0001: ldarg.0
* IL_0002: ldc.i4.0*
IL_0003: ceq
IL_0005: ldc.i4.0
IL_0006: ceq
IL_0008: stloc.0
IL_0009: ldloc.0
IL_000a: brtrue.s IL_000e
IL_000c: nop
IL_000d: nop
IL_000e: ret
} // end of method ClassEnum1Consumer::Consume
On Monday, September 17, 2012 7:06:46 PM UTC+3, Jb Evain wrote:
>
> Hey Dzmitry,
>
> Most compilers inline the constant value of the enum, which is why you
> don't find references of them in the IL.
>
> Jb
>
> On Mon, Sep 17, 2012 at 6:03 PM, Dzmitry Lahoda
> <[email protected]<javascript:>>
> wrote:
> > I am trying to build something like NDepend for my needs.
> > I have enum and trying to find usages of its members by some of dlls.
> Only
> > usage of whole enum can be finded.
> > This is real case (host and 6 custom addins).
> >
> > Sample code:
> >
> > public enum Enum1
> > {
> > Val1,
> > Val2
> > }
> >
> > public class ClassEnum1Consumer
> > {
> > public static void Consume(Enum1 e)
> > {
> > if (e == Enum1.Val2)
> > {
> >
> > }
> > }
> > }
> >
> > [<Test>] member fixture.``One usage of enum by consumer`` ()=
> > let result =
> >
> SharpDepend.findUsages("Test.ServiceProvider.Enum1","Val2",["Test.ServiceConsumer1"])
>
>
> > result.Length |> should equal 1
> >
> >
> > let findUsages
> (usedType:string,usedMemeber:string,consumers:list<string>) =
> > let allAssemblies = consumers |> List.map (fun x-> List.ofArray
> > (get_assemblies(x))) |> List.collect (fun x-> x)
> > let filter (assembly:AssemblyDefinition) =
> > assembly.MainModule.GetMemberReferences()
> > |> Seq.filter (fun x-> x.DeclaringType.FullName.Contains(usedType)
> &&
> > x.Name.Contains(usedMemeber))
> > // for enums - enum members fail by mono cecil
> > let filter_type (assembly:AssemblyDefinition) =
> > assembly.MainModule.GetTypeReferences()
> > |> Seq.filter (fun x-> x.FullName.Contains(usedType) &&
> > usedMemeber.Equals(String.Empty))
> > let usedTypes = allAssemblies |> List.filter ( fun x-> Seq.length
> > (filter(x)) >0 || Seq.length (filter_type(x)) >0)
> > usedTypes
> >
> > Result:
> >
> > Expected: 1
> > But was: 0
> >
> > Previous code works for enum type or usual classes' members.
> >
> > Link:
> > https://github.com/asd-and-Rizzo/SharpDepend
> >
> >
> > --
> > --
> > mono-cecil
>
--
--
mono-cecil