public static Option <ExpandedMethod> GetMethod(
            ExpandedType type, VirtualMethod virtualMethod
            )
        {
            var virtMethRef = virtualMethod.method.definition;

            foreach (var method in type.methods)
            {
                var methodDefinition = method.definition;
                if (
                    (
                        methodDefinition.Name == virtMethRef.Name
                        // Find explicit implementations as well.
                        || degenerifyMethodName(methodDefinition.Name) == $"{virtMethRef.DeclaringType.FullName}.{virtMethRef.Name}"
                    ) &&
                    methodDefinition.HasGenericParameters == virtMethRef.HasGenericParameters &&
                    (
                        !methodDefinition.HasGenericParameters ||
                        methodDefinition.GenericParameters.Count == virtMethRef.GenericParameters.Count
                    ) && (
//            AreSame(methodDefinition.ReturnType, virtMethRef.ReturnType)
                        method.returnType == virtualMethod.method.returnType &&
                        methodDefinition.HasParameters == virtMethRef.HasParameters
                        ) && (
                        !methodDefinition.HasParameters && !virtMethRef.HasParameters ||
                        method.parameters.SequenceEqual(virtualMethod.method.parameters)
                        )
                    )
                {
                    return(F.some(method));
                }
            }
            return(F.none <ExpandedMethod>());
        }
 public bool hasType(ExpandedType type)
 {
     return usedTypes.Contains(type);
 }
 public AnalyzerData addType(ExpandedType type)
 {
     return hasType(type)
     ? this : new AnalyzerData(usedTypes.Add(type), analyzedMethods, virtualMethodsToAnalyze, analyzedVirtualMethods);
 }
 public UnityEntryPoint(ExpandedType type)
 {
     this.type = type;
 }
 public void log(ExpandedType type, string msg)
 {
     log("[" + type.name + "] " + msg);
 }
 public void log(ExpandedType type, string msg)
 {
 }
 public static Option<ExpandedMethod> GetMethod(
     ExpandedType type, VirtualMethod virtualMethod
     )
 {
     var virtMethRef = virtualMethod.method.definition;
       foreach (var method in type.methods) {
     var methodDefinition = method.definition;
     if (
       (
     methodDefinition.Name == virtMethRef.Name
     // Find explicit implementations as well.
     || degenerifyMethodName(methodDefinition.Name) == $"{virtMethRef.DeclaringType.FullName}.{virtMethRef.Name}"
       ) &&
       methodDefinition.HasGenericParameters == virtMethRef.HasGenericParameters &&
       (
     !methodDefinition.HasGenericParameters
     || methodDefinition.GenericParameters.Count == virtMethRef.GenericParameters.Count
       ) && (
     //            AreSame(methodDefinition.ReturnType, virtMethRef.ReturnType)
     method.returnType == virtualMethod.method.returnType
     && methodDefinition.HasParameters == virtMethRef.HasParameters
       ) && (
     !methodDefinition.HasParameters && !virtMethRef.HasParameters
     || method.parameters.SequenceEqual(virtualMethod.method.parameters)
       )
     ) return F.some(method);
       }
       return F.none<ExpandedMethod>();
 }