Example #1
0
 /// <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();
        }
Example #3
0
 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);
     }
 }