InterMethod IResolver.Resolve(MethodReference methodRef, List <InterGenericArgument> genericArgs) { InterMethod founded = null; InterMethod tmp = new InterMethod(methodRef, genericArgs, this, M => founded = M); if (founded == null) { Messages.Verbose("Adding method {0} to compile...", tmp.ToString()); tmp.DeclaringType.Methods.Add(tmp); founded = tmp; var unionedGenericArgs = tmp.FullGenericArguments; if (tmp.HasBody) { MethodDefinition methodDef = tmp.Body.Method; ILAstBuilder builder = new ILAstBuilder(); ILBlock ilBody = new ILBlock(); DecompilerContext context = new DecompilerContext(methodDef.Module) { CurrentType = methodDef.DeclaringType, CurrentMethod = methodDef }; Utils.SetDecompillerSettings(context.Settings); ilBody.Body = builder.Build(methodDef, true, context); new ILAstOptimizer().Optimize(context, ilBody); ProcessMethodDecencies(tmp, ilBody, tmp.FullGenericArguments); } } return(founded); }
private Method CompileMethod(InterMethod method) { Messages.Verbose(" Compiling method {0}...", method.ToString()); Method result = new Method(); if (method.IsPublic) { result.AccessFlags |= MethodAccessFlags.Public; } else if (method.IsProtected) { result.AccessFlags |= MethodAccessFlags.Protected; } else { result.AccessFlags |= MethodAccessFlags.Private; } if (method.IsAbstract) { result.AccessFlags |= MethodAccessFlags.Abstract; } if ((method.IsFinal) || ((!method.IsVirtual) && (!method.IsConstructor)) && (!method.IsStatic)) { result.AccessFlags |= MethodAccessFlags.Final; } if (method.IsStatic) { result.AccessFlags |= MethodAccessFlags.Static; } if (method.IsSynchronized) { result.AccessFlags |= MethodAccessFlags.Synchronized; } if ((method.IsPrivate) && (method.IsVirtual)) { Messages.Message(MessageCode.MethodPrivateAndVirtual, method.ToString()); } if (method.IsVarArg) { result.AccessFlags |= MethodAccessFlags.VarArgs; } result.Name = MethodNameToJava(method.NewName); result.Descriptor = GetMethodDescriptor(method); if (method.HasBody) { CodeCompiler codeCompiler = new CodeCompiler(this, this, this, method, currentJavaClass.ConstantPool); codeCompiler.Compile(); result.Attributes.Add(codeCompiler.Result); if (Program.Debug) { string sourceFileName = codeCompiler.SourceFile; if (sourceFileName != null) { sourceFileNameCounter.Add(sourceFileName); } } } if ((method.IsStatic) && (method.IsConstructor)) { result.AccessFlags = MethodAccessFlags.Static; } return(result); }