private void Process(MethodSignature methodSig, Module module, bool forceUnstrip = false) { switch (methodSig.Type) { case MethodSignatureType.CallSite: { Process(methodSig.ReturnType, module); Process(methodSig.Arguments, module); } break; case MethodSignatureType.DeclaringMethod: { Process(methodSig.CallSite, module); var method = methodSig.Resolve(module); if (method != null) { var buildMethod = method.DeclaringMethod as BuildMethod; if (buildMethod != null) { if (forceUnstrip) { UnstripAndEnqueue(buildMethod); } else { UnstripAndEnqueueEncrypted(buildMethod); } } } else { Process(methodSig.Owner, module); } } break; case MethodSignatureType.GenericMethod: { Process(methodSig.DeclaringMethod, module); Process(methodSig.GenericArguments, module); } break; default: throw new InvalidOperationException(); } }