Skip to content

Commit 750626c

Browse files
committed
sort configs properly
1 parent bf0c597 commit 750626c

File tree

8 files changed

+99
-7
lines changed

8 files changed

+99
-7
lines changed

src/main/java/com/falsepattern/lib/internal/asm/FPTransformer.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
import com.falsepattern.lib.asm.IClassNodeTransformer;
2626
import com.falsepattern.lib.asm.SmartTransformer;
2727
import com.falsepattern.lib.internal.Tags;
28+
import com.falsepattern.lib.internal.asm.transformers.ConfigOrderTransformer;
29+
import com.falsepattern.lib.internal.asm.transformers.GasStationValidatorTransformer;
30+
import com.falsepattern.lib.internal.asm.transformers.IMixinPluginTransformer;
31+
import com.falsepattern.lib.internal.asm.transformers.ITypeDiscovererTransformer;
2832
import lombok.Getter;
2933
import lombok.experimental.Accessors;
3034
import org.apache.logging.log4j.LogManager;
@@ -36,7 +40,7 @@
3640
@Accessors(fluent = true)
3741
@StableAPI(since = "__INTERNAL__")
3842
public class FPTransformer implements SmartTransformer {
39-
static final Logger LOG = LogManager.getLogger(Tags.MODNAME + " ASM");
43+
public static final Logger LOG = LogManager.getLogger(Tags.MODNAME + " ASM");
4044

4145
@Getter
4246
private final List<IClassNodeTransformer> transformers;
@@ -45,6 +49,9 @@ public class FPTransformer implements SmartTransformer {
4549
private final Logger logger = LOG;
4650

4751
public FPTransformer() {
48-
transformers = Arrays.asList(new IMixinPluginTransformer(), new ITypeDiscovererTransformer(), new GasStationValidatorTransformer());
52+
transformers = Arrays.asList(new IMixinPluginTransformer(),
53+
new ITypeDiscovererTransformer(),
54+
new GasStationValidatorTransformer(),
55+
new ConfigOrderTransformer());
4956
}
5057
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.falsepattern.lib.internal.asm.transformers;
2+
3+
import com.falsepattern.lib.asm.IClassNodeTransformer;
4+
import com.falsepattern.lib.config.Config;
5+
import com.falsepattern.lib.internal.impl.config.DeclOrderInternal;
6+
import lombok.val;
7+
import org.objectweb.asm.Opcodes;
8+
import org.objectweb.asm.Type;
9+
import org.objectweb.asm.tree.AnnotationNode;
10+
import org.objectweb.asm.tree.ClassNode;
11+
12+
import java.util.ArrayList;
13+
import java.util.HashSet;
14+
import java.util.Optional;
15+
16+
public class ConfigOrderTransformer implements IClassNodeTransformer {
17+
private static final String DESC_CONFIG = Type.getDescriptor(Config.class);
18+
private static final String DESC_CONFIG_IGNORE = Type.getDescriptor(Config.Ignore.class);
19+
private static final String DESC_ORDER = Type.getDescriptor(DeclOrderInternal.class);
20+
@Override
21+
public String getName() {
22+
return "ConfigOrderTransformer";
23+
}
24+
25+
@Override
26+
public boolean shouldTransform(ClassNode cn, String transformedName, boolean obfuscated) {
27+
if (cn.visibleAnnotations != null) {
28+
for (val ann : cn.visibleAnnotations) {
29+
if (DESC_CONFIG.equals(ann.desc)) {
30+
return true;
31+
}
32+
}
33+
}
34+
return false;
35+
}
36+
37+
@Override
38+
public void transform(ClassNode cn, String transformedName, boolean obfuscated) {
39+
int order = 0;
40+
for (val field: cn.fields) {
41+
if ((field.access & Opcodes.ACC_PUBLIC) != 0 && (field.access & Opcodes.ACC_STATIC) != 0 && (field.access & Opcodes.ACC_FINAL) == 0) {
42+
if (field.visibleAnnotations != null) {
43+
for (val ann: field.visibleAnnotations) {
44+
if (DESC_CONFIG_IGNORE.equals(ann.desc)) {
45+
continue;
46+
}
47+
}
48+
}
49+
}
50+
val annVisitor = field.visitAnnotation(DESC_ORDER, true);
51+
annVisitor.visit("value", order++);
52+
annVisitor.visitEnd();
53+
}
54+
}
55+
}

src/main/java/com/falsepattern/lib/internal/asm/GasStationValidatorTransformer.java renamed to src/main/java/com/falsepattern/lib/internal/asm/transformers/GasStationValidatorTransformer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
* along with this program. If not, see <https://www.gnu.org/licenses/>.
2020
*/
2121

22-
package com.falsepattern.lib.internal.asm;
22+
package com.falsepattern.lib.internal.asm.transformers;
2323

2424
import com.falsepattern.lib.asm.IClassNodeTransformer;
25+
import com.falsepattern.lib.internal.asm.CoreLoadingPlugin;
2526
import org.objectweb.asm.tree.ClassNode;
2627

2728
import static com.falsepattern.lib.mixin.MixinInfo.isClassPresentSafe;

src/main/java/com/falsepattern/lib/internal/asm/IMixinPluginTransformer.java renamed to src/main/java/com/falsepattern/lib/internal/asm/transformers/IMixinPluginTransformer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
* along with this program. If not, see <https://www.gnu.org/licenses/>.
2020
*/
2121

22-
package com.falsepattern.lib.internal.asm;
22+
package com.falsepattern.lib.internal.asm.transformers;
2323

2424
import com.falsepattern.lib.asm.IClassNodeTransformer;
2525
import com.falsepattern.lib.internal.Tags;
26+
import com.falsepattern.lib.internal.asm.FPTransformer;
2627
import lombok.val;
2728
import org.objectweb.asm.tree.ClassNode;
2829
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;

src/main/java/com/falsepattern/lib/internal/asm/ITypeDiscovererTransformer.java renamed to src/main/java/com/falsepattern/lib/internal/asm/transformers/ITypeDiscovererTransformer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
* along with this program. If not, see <https://www.gnu.org/licenses/>.
2020
*/
2121

22-
package com.falsepattern.lib.internal.asm;
22+
package com.falsepattern.lib.internal.asm.transformers;
2323

2424
import com.falsepattern.lib.asm.IClassNodeTransformer;
2525
import lombok.val;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.falsepattern.lib.internal.impl.config;
2+
3+
import java.lang.annotation.Documented;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Retention;
6+
import java.lang.annotation.RetentionPolicy;
7+
import java.lang.annotation.Target;
8+
9+
/**
10+
* Preserve ordering of elements in the config file and guis based on the ordering in the class.
11+
*/
12+
@Documented
13+
@Retention(RetentionPolicy.RUNTIME)
14+
@Target(ElementType.FIELD)
15+
public @interface DeclOrderInternal {
16+
int value();
17+
}

src/main/java/com/falsepattern/lib/internal/impl/config/ParsedConfiguration.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,14 @@
4646
import java.lang.reflect.Field;
4747
import java.lang.reflect.Modifier;
4848
import java.util.ArrayList;
49+
import java.util.Comparator;
4950
import java.util.HashMap;
5051
import java.util.List;
5152
import java.util.Map;
5253
import java.util.Optional;
5354
import java.util.function.BiConsumer;
55+
import java.util.stream.Collectors;
56+
import java.util.stream.Stream;
5457

5558
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
5659
public class ParsedConfiguration {
@@ -197,11 +200,16 @@ public void reloadFields() throws ConfigException, IllegalAccessException {
197200
save();
198201
}));
199202
}
203+
rawConfig.setCategoryPropertyOrder(category, fieldsSorted().map((prop) -> prop.name).collect(Collectors.toList()));
204+
}
205+
206+
private Stream<AConfigField<?>> fieldsSorted() {
207+
return fields.values().stream().sorted(Comparator.comparingInt((prop) -> prop.order));
200208
}
201209

202210
@SuppressWarnings("rawtypes")
203211
public List<IConfigElement> getConfigElements() {
204-
return new ArrayList<>(elements.values());
212+
return fieldsSorted().map((field) -> elements.get(field.name)).collect(Collectors.toList());
205213
}
206214

207215
public boolean validate(BiConsumer<Class<?>, Field> invalidFieldHandler, boolean resetInvalid) {

src/main/java/com/falsepattern/lib/internal/impl/config/fields/AConfigField.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
package com.falsepattern.lib.internal.impl.config.fields;
2222

2323
import com.falsepattern.lib.config.Config;
24+
import com.falsepattern.lib.internal.impl.config.DeclOrderInternal;
2425
import lombok.val;
2526

2627
import net.minecraftforge.common.config.Configuration;
@@ -34,10 +35,11 @@
3435

3536
public abstract class AConfigField<T> {
3637
public final boolean noSync;
38+
public final int order;
39+
public final String name;
3740
protected final Field field;
3841
protected final Configuration configuration;
3942
protected final String category;
40-
protected final String name;
4143
protected final String langKey;
4244
protected final Property.Type type;
4345
protected final Property property;
@@ -71,6 +73,7 @@ protected AConfigField(Field field, Configuration configuration, String category
7173
}
7274
property.setLanguageKey(langKey);
7375
noSync = field.isAnnotationPresent(Config.NoSync.class);
76+
order = Optional.ofNullable(field.getAnnotation(DeclOrderInternal.class)).map(DeclOrderInternal::value).orElse(-1);
7477
}
7578

7679
protected abstract T getField();

0 commit comments

Comments
 (0)