@@ -391,38 +391,39 @@ public void writeClass(ClassNode node, TextBuffer buffer, int indent) {
391391        hasContent .set (true );
392392      };
393393
394-       boolean  enumFields  = false ;
395- 
394+       // fields 
396395      List <StructRecordComponent > components  = cl .getRecordComponents ();
397396
398-       // FIXME: fields don't have line mappings 
399-       // fields 
397+       List < StructField >  enumFields  =  new   ArrayList <>(); 
398+       List < StructField >  nonEnumFields  =  new   ArrayList <>(); 
400399
401-       // Find the last field marked as an enum 
402-       int  maxEnumIdx  = 0 ;
403-       for  (int  i  = 0 ; i  < cl .getFields ().size (); i ++) {
404-         StructField  fd  = cl .getFields ().get (i );
400+       for  (StructField  fd  : cl .getFields ()) {
405401        boolean  isEnum  = fd .hasModifier (CodeConstants .ACC_ENUM ) && DecompilerContext .getOption (IFernflowerPreferences .DECOMPILE_ENUM );
406402        if  (isEnum ) {
407-           maxEnumIdx  = i ;
403+           enumFields .add (fd );
404+         } else  {
405+           nonEnumFields .add (fd );
408406        }
409407      }
410408
411-       List <StructField > deferredEnumFields  = new  ArrayList <>();
412- 
413-       // Find any regular fields mixed in with the enum fields 
414-       // This is invalid but allowed in bytecode. 
415-       for  (int  i  = 0 ; i  < cl .getFields ().size (); i ++) {
416-         StructField  fd  = cl .getFields ().get (i );
417-         boolean  isEnum  = fd .hasModifier (CodeConstants .ACC_ENUM ) && DecompilerContext .getOption (IFernflowerPreferences .DECOMPILE_ENUM );
418-         if  (i  < maxEnumIdx  && !isEnum ) {
419-           deferredEnumFields .add (fd );
409+       boolean  enums  = false ;
410+       for  (StructField  fd  : enumFields ) {
411+         if  (enums ) {
412+           buffer .append (',' ).appendLineSeparator ();
420413        }
414+         enums  = true ;
415+ 
416+         haveContent .run ();
417+         writeField (buffer , indent , fd , wrapper );
421418      }
422419
423-       for  (StructField  fd  : cl .getFields ()) {
420+       if  (enums ) {
421+         buffer .append (';' ).appendLineSeparator ();
422+       }
423+ 
424+       for  (StructField  fd  : nonEnumFields ) {
424425        boolean  hide  = fd .isSynthetic () && DecompilerContext .getOption (IFernflowerPreferences .REMOVE_SYNTHETIC ) ||
425-                        wrapper .getHiddenMembers ().contains (InterpreterUtil .makeUniqueKey (fd .getName (), fd .getDescriptor ())) ||  deferredEnumFields . contains ( fd ) ;
426+                        wrapper .getHiddenMembers ().contains (InterpreterUtil .makeUniqueKey (fd .getName (), fd .getDescriptor ()));
426427        if  (hide ) continue ;
427428
428429        if  (components  != null  && fd .getAccessFlags () == (CodeConstants .ACC_FINAL  | CodeConstants .ACC_PRIVATE ) &&
@@ -431,45 +432,14 @@ public void writeClass(ClassNode node, TextBuffer buffer, int indent) {
431432          continue ;
432433        }
433434
434-         boolean  isEnum  = fd .hasModifier (CodeConstants .ACC_ENUM ) && DecompilerContext .getOption (IFernflowerPreferences .DECOMPILE_ENUM );
435-         if  (isEnum ) {
436-           if  (enumFields ) {
437-             buffer .append (',' ).appendLineSeparator ();
438-           }
439-           enumFields  = true ;
440-         }
441-         else  if  (enumFields ) {
442-           buffer .append (';' );
435+         if  (enums ) {
436+           // Add an extra line break between enums and non-enum fields 
443437          buffer .appendLineSeparator ();
444-           buffer .appendLineSeparator ();
445-           enumFields  = false ;
446- 
447-           // If the fields after are non enum, readd the fields found scattered throughout the enum 
448-           for  (StructField  fd2  : deferredEnumFields ) {
449-             TextBuffer  fieldBuffer  = new  TextBuffer ();
450-             writeField (wrapper , cl , fd2 , fieldBuffer , indent  + 1 );
451-             fieldBuffer .clearUnassignedBytecodeMappingData ();
452-             buffer .append (fieldBuffer );
453-           }
438+           enums  = false ;
454439        }
455440
456-         TextBuffer  fieldBuffer  = new  TextBuffer ();
457-         writeField (wrapper , cl , fd , fieldBuffer , indent  + 1 );
458-         fieldBuffer .clearUnassignedBytecodeMappingData ();
459441        haveContent .run ();
460-         buffer .append (fieldBuffer );
461-       }
462- 
463-       if  (enumFields ) {
464-         buffer .append (';' ).appendLineSeparator ();
465- 
466-         // If we end with enum fields, readd the fields found mixed in 
467-         for  (StructField  fd2  : deferredEnumFields ) {
468-           TextBuffer  fieldBuffer  = new  TextBuffer ();
469-           writeField (wrapper , cl , fd2 , fieldBuffer , indent  + 1 );
470-           fieldBuffer .clearUnassignedBytecodeMappingData ();
471-           buffer .append (fieldBuffer );
472-         }
442+         writeField (buffer , indent , fd , wrapper );
473443      }
474444
475445      // methods 
@@ -810,6 +780,13 @@ private static boolean isSuperClassSealed(StructClass cl) {
810780    return  false ;
811781  }
812782
783+   private  void  writeField (TextBuffer  buffer , int  indent , StructField  fd , ClassWrapper  wrapper ) {
784+     TextBuffer  fieldBuffer  = new  TextBuffer ();
785+     writeField (wrapper , wrapper .getClassStruct (), fd , fieldBuffer , indent  + 1 );
786+     fieldBuffer .clearUnassignedBytecodeMappingData ();
787+     buffer .append (fieldBuffer );
788+   }
789+ 
813790  public  void  writeField (ClassWrapper  wrapper , StructClass  cl , StructField  fd , TextBuffer  buffer , int  indent ) {
814791    if  (RecordHelper .isHiddenRecordField (cl .getRecordComponents (), fd )) {
815792      return ;
0 commit comments