Skip to content

Commit f5160a4

Browse files
committed
Clean up field writing to reduce redundancies
1 parent fec7cd2 commit f5160a4

File tree

9 files changed

+173
-195
lines changed

9 files changed

+173
-195
lines changed

src/org/jetbrains/java/decompiler/main/ClassWriter.java

Lines changed: 32 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

testData/results/pkg/TestEnumStaticField.dec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package pkg;
33
public enum TestEnumStaticField {
44
TEST_1,
55
TEST_2;
6+
67
public static Integer field;
78
}
89

testData/results/pkg/TestEnumStaticField2.dec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package pkg;
33
public enum TestEnumStaticField2 {
44
TEST_1,
55
TEST_2;
6+
67
public static Integer field;
78
}
89

testData/results/pkg/TestJava11StringConcat.dec

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ class 'pkg/TestJava11StringConcat' {
3434
0 8
3535
1 8
3636
2 8
37-
3 8
38-
4 8
39-
5 8
4037
6 8
4138
7 8
4239
8 8
40+
9 8
41+
a 8
42+
b 8
4343
}
4444

4545
method 'testEmptyPrefix (I)Ljava/lang/String;' {

testData/results/pkg/TestSwitchPatternMatching13.dec

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,18 @@ class 'pkg/TestSwitchPatternMatching13' {
114114
51 15
115115
52 15
116116
53 15
117+
54 15
118+
55 15
119+
56 15
117120
57 15
118121
58 15
119122
59 15
120123
5a 15
121124
5b 15
122-
5c 15
123-
5d 15
124-
5e 15
125-
5f 16
125+
5c 16
126+
63 17
127+
64 17
128+
65 17
126129
66 17
127130
67 17
128131
68 17
@@ -131,18 +134,18 @@ class 'pkg/TestSwitchPatternMatching13' {
131134
6b 17
132135
6c 17
133136
6d 17
134-
6e 17
135-
6f 17
136-
70 17
137+
76 18
138+
77 18
139+
78 18
137140
79 18
138141
7a 18
139142
7b 18
140143
7c 18
141144
7d 18
142-
7e 18
143-
7f 18
144-
80 18
145-
81 19
145+
7e 19
146+
85 20
147+
86 20
148+
87 20
146149
88 20
147150
89 20
148151
8a 20
@@ -151,84 +154,81 @@ class 'pkg/TestSwitchPatternMatching13' {
151154
8d 20
152155
8e 20
153156
8f 20
154-
90 20
155-
91 20
156-
92 20
157+
98 21
158+
99 21
159+
9a 21
157160
9b 21
158161
9c 21
159162
9d 21
160163
9e 21
161164
9f 21
162-
a0 21
163-
a1 21
164-
a2 21
165+
a0 23
166+
a1 23
167+
a2 23
165168
a3 23
166169
a4 23
167170
a5 23
168171
a6 23
169-
a7 23
170-
a8 23
171-
a9 23
172+
aa 24
173+
ab 24
174+
ac 24
172175
ad 24
173176
ae 24
174177
af 24
175178
b0 24
176179
b1 24
177-
b2 24
178-
b3 24
179-
b4 24
180-
bc 27
181-
bd 27
180+
b9 27
181+
ba 27
182+
bb 28
183+
bc 28
184+
bd 28
182185
be 28
183186
bf 28
184187
c0 28
185188
c1 28
186189
c2 28
187-
c3 28
188-
c4 28
189-
c5 28
190+
c3 29
191+
c4 29
192+
c5 29
190193
c6 29
191194
c7 29
192195
c8 29
193196
c9 29
194197
ca 29
195-
cb 29
196-
cc 29
197-
cd 29
198+
cb 32
199+
cc 32
200+
cd 32
198201
ce 32
199202
cf 32
200203
d0 32
201204
d1 32
202205
d2 32
203-
d3 32
204-
d4 32
205-
d5 32
206-
d6 33
206+
d3 33
207+
d6 6
208+
d7 6
209+
d8 6
207210
d9 6
208211
da 6
209212
db 6
210213
dc 6
211214
dd 6
212-
de 6
213-
df 6
214-
e0 6
215+
de 7
216+
df 7
217+
e0 7
215218
e1 7
216219
e2 7
217220
e3 7
218221
e4 7
219222
e5 7
220-
e6 7
221-
e7 7
222-
e8 7
223+
e9 35
224+
ea 35
225+
eb 35
223226
ec 35
224227
ed 35
225228
ee 35
226229
ef 35
227230
f0 35
228-
f1 35
229-
f2 35
230-
f3 35
231-
f7 37
231+
f4 37
232232
}
233233
}
234234

@@ -261,4 +261,4 @@ Lines mapping:
261261
28 <-> 8
262262
32 <-> 36
263263
34 <-> 38
264-
44 <-> 47
264+
44 <-> 47

testData/results/pkg/TestSwitchPatternMatching14.dec

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -81,40 +81,40 @@ class 'pkg/TestSwitchPatternMatching14' {
8181
39 15
8282
3a 15
8383
3b 15
84+
3c 15
85+
3d 15
86+
3e 15
8487
3f 15
8588
40 15
8689
41 15
8790
42 15
8891
43 15
89-
44 15
90-
45 15
91-
46 15
92-
47 16
92+
44 16
93+
47 6
94+
48 6
95+
49 6
9396
4a 6
9497
4b 6
9598
4c 6
9699
4d 6
97100
4e 6
98-
4f 6
99-
50 6
100-
51 6
101+
4f 7
102+
50 7
103+
51 7
101104
52 7
102105
53 7
103106
54 7
104107
55 7
105108
56 7
106-
57 7
107-
58 7
108-
59 7
109+
5a 18
110+
5b 18
111+
5c 18
109112
5d 18
110113
5e 18
111114
5f 18
112115
60 18
113116
61 18
114-
62 18
115-
63 18
116-
64 18
117-
65 20
117+
62 20
118118
}
119119
}
120120

@@ -136,4 +136,4 @@ Lines mapping:
136136
14 <-> 8
137137
18 <-> 19
138138
20 <-> 21
139-
30 <-> 30
139+
30 <-> 30

0 commit comments

Comments
 (0)