/// <exception cref="System.IO.IOException"/> public virtual void WriteClass(StructClass cl, TextBuffer buffer) { ClassesProcessor.ClassNode root = mapRootClasses.GetOrNull(cl.qualifiedName); if (root.type != ClassesProcessor.ClassNode.Class_Root) { return; } DecompilerContext.GetLogger().StartReadingClass(cl.qualifiedName); try { ImportCollector importCollector = new ImportCollector(root); DecompilerContext.StartClass(importCollector); new LambdaProcessor().ProcessClass(root); // add simple class names to implicit import AddClassnameToImport(root, importCollector); // build wrappers for all nested classes (that's where actual processing takes place) InitWrappers(root); new NestedClassProcessor().ProcessClass(root, root); new NestedMemberAccess().PropagateMemberAccess(root); TextBuffer classBuffer = new TextBuffer(Average_Class_Size); new ClassWriter().ClassToJava(root, classBuffer, 0, null); int index = cl.qualifiedName.LastIndexOf("/"); if (index >= 0) { string packageName = Sharpen.Runtime.Substring(cl.qualifiedName, 0, index).Replace ('/', '.'); buffer.Append("package "); buffer.Append(packageName); buffer.Append(";"); buffer.AppendLineSeparator(); buffer.AppendLineSeparator(); } int import_lines_written = importCollector.WriteImports(buffer); if (import_lines_written > 0) { buffer.AppendLineSeparator(); } int offsetLines = buffer.CountLines(); buffer.Append(classBuffer); if (DecompilerContext.GetOption(IFernflowerPreferences.Bytecode_Source_Mapping)) { BytecodeSourceMapper mapper = DecompilerContext.GetBytecodeSourceMapper(); mapper.AddTotalOffset(offsetLines); if (DecompilerContext.GetOption(IFernflowerPreferences.Dump_Original_Lines)) { buffer.DumpOriginalLineNumbers(mapper.GetOriginalLinesMapping()); } if (DecompilerContext.GetOption(IFernflowerPreferences.Unit_Test_Mode)) { buffer.AppendLineSeparator(); mapper.DumpMapping(buffer, true); } } } finally { DestroyWrappers(root); DecompilerContext.GetLogger().EndReadingClass(); } }
public static void StartClass(ImportCollector importCollector) { DecompilerContext context = GetCurrentContext(); context.importCollector = importCollector; context.counterContainer = new CounterContainer(); context.bytecodeSourceMapper = new BytecodeSourceMapper(); }
private static void AddClassnameToImport(ClassesProcessor.ClassNode node, ImportCollector imp) { if (node.simpleName != null && node.simpleName.Length > 0) { imp.GetShortName(node.type == ClassesProcessor.ClassNode.Class_Root ? node.classStruct .qualifiedName : node.simpleName, false); } foreach (ClassesProcessor.ClassNode nd in node.nested) { AddClassnameToImport(nd, imp); } }