Skip to content

Commit 7f6258f

Browse files
committed
Create cross-format StandardProperties class
- Now supports `component` intermediary counter - Removes some hardcoded values - Tiny v1 now supports reading arbitrary metadata (prefixed with `#`)
1 parent 1c5ba91 commit 7f6258f

File tree

7 files changed

+197
-84
lines changed

7 files changed

+197
-84
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package net.fabricmc.mappingio.format;
2+
3+
import java.util.Collections;
4+
import java.util.HashMap;
5+
import java.util.HashSet;
6+
import java.util.Map;
7+
import java.util.Set;
8+
9+
import org.jetbrains.annotations.ApiStatus;
10+
11+
public final class StandardProperties {
12+
private StandardProperties() {
13+
}
14+
15+
public static Set<StandardProperty> values() {
16+
return Collections.unmodifiableSet(values);
17+
}
18+
19+
public static StandardProperty getByName(String name) {
20+
return valuesByName.get(name);
21+
}
22+
23+
@ApiStatus.Internal
24+
public static StandardProperty getById(String id) {
25+
return valuesById.get(id);
26+
}
27+
28+
public static final StandardProperty NEXT_INTERMEDIARY_CLASS;
29+
public static final StandardProperty NEXT_INTERMEDIARY_FIELD;
30+
public static final StandardProperty NEXT_INTERMEDIARY_METHOD;
31+
public static final StandardProperty NEXT_INTERMEDIARY_COMPONENT;
32+
public static final StandardProperty MISSING_LVT_INDICES;
33+
public static final StandardProperty ESCAPED_NAMES;
34+
private static final Set<StandardProperty> values = new HashSet<>();
35+
private static final Map<String, StandardProperty> valuesByName = new HashMap<>();
36+
private static final Map<String, StandardProperty> valuesById = new HashMap<>();
37+
38+
static {
39+
NEXT_INTERMEDIARY_CLASS = register(
40+
"next-intermediary-class",
41+
new HashMap<MappingFormat, String>() {{
42+
put(MappingFormat.TINY_FILE, "INTERMEDIARY_COUNTER class");
43+
put(MappingFormat.TINY_2_FILE, "next-intermediary-class");
44+
}});
45+
NEXT_INTERMEDIARY_FIELD = register(
46+
"next-intermediary-field",
47+
new HashMap<MappingFormat, String>() {{
48+
put(MappingFormat.TINY_FILE, "INTERMEDIARY_COUNTER field");
49+
put(MappingFormat.TINY_2_FILE, "next-intermediary-field");
50+
}});
51+
NEXT_INTERMEDIARY_METHOD = register(
52+
"next-intermediary-method",
53+
new HashMap<MappingFormat, String>() {{
54+
put(MappingFormat.TINY_FILE, "INTERMEDIARY_COUNTER method");
55+
put(MappingFormat.TINY_2_FILE, "next-intermediary-method");
56+
}});
57+
NEXT_INTERMEDIARY_COMPONENT = register(
58+
"next-intermediary-component",
59+
new HashMap<MappingFormat, String>() {{
60+
put(MappingFormat.TINY_FILE, "INTERMEDIARY_COUNTER component");
61+
put(MappingFormat.TINY_2_FILE, "next-intermediary-component");
62+
}});
63+
MISSING_LVT_INDICES = register(
64+
"missing-lvt-indices",
65+
new HashMap<MappingFormat, String>() {{
66+
put(MappingFormat.TINY_2_FILE, "missing-lvt-indices");
67+
}});
68+
ESCAPED_NAMES = register(
69+
"escaped-names",
70+
new HashMap<MappingFormat, String>() {{
71+
put(MappingFormat.TINY_2_FILE, "escaped-names");
72+
}});
73+
}
74+
75+
private static StandardProperty register(String id, Map<MappingFormat, String> nameByFormat) {
76+
StandardProperty ret = new StandardPropertyImpl(id, nameByFormat);
77+
values.add(ret);
78+
valuesById.put(id, ret);
79+
80+
for (String name : nameByFormat.values()) {
81+
valuesByName.putIfAbsent(name, ret);
82+
}
83+
84+
return ret;
85+
}
86+
87+
private static class StandardPropertyImpl implements StandardProperty {
88+
StandardPropertyImpl(String id, Map<MappingFormat, String> nameByFormat) {
89+
this.id = id;
90+
this.nameByFormat = nameByFormat;
91+
}
92+
93+
@Override
94+
public Set<MappingFormat> getApplicableFormats() {
95+
return nameByFormat.keySet();
96+
}
97+
98+
@Override
99+
public boolean isApplicableTo(MappingFormat format) {
100+
return nameByFormat.containsKey(format);
101+
}
102+
103+
@Override
104+
public String getNameFor(MappingFormat format) {
105+
return nameByFormat.get(format);
106+
}
107+
108+
@Override
109+
public String getId() {
110+
return id;
111+
}
112+
113+
private final String id;
114+
private final Map<MappingFormat, String> nameByFormat;
115+
}
116+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package net.fabricmc.mappingio.format;
2+
3+
import java.util.Set;
4+
5+
import org.jetbrains.annotations.ApiStatus;
6+
7+
public interface StandardProperty {
8+
Set<MappingFormat> getApplicableFormats();
9+
boolean isApplicableTo(MappingFormat format);
10+
String getNameFor(MappingFormat format);
11+
12+
/**
13+
* Used internally by MappingTrees, consistency between JVM sessions
14+
* or library versions isn't guaranteed!
15+
*/
16+
@ApiStatus.Internal
17+
String getId();
18+
}

src/main/java/net/fabricmc/mappingio/format/tiny/Tiny1FileReader.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import net.fabricmc.mappingio.MappingFlag;
2727
import net.fabricmc.mappingio.MappingVisitor;
2828
import net.fabricmc.mappingio.format.ColumnFileReader;
29+
import net.fabricmc.mappingio.format.MappingFormat;
30+
import net.fabricmc.mappingio.format.StandardProperties;
31+
import net.fabricmc.mappingio.format.StandardProperty;
2932
import net.fabricmc.mappingio.tree.MappingTree;
3033
import net.fabricmc.mappingio.tree.MemoryMappingTree;
3134

@@ -131,28 +134,26 @@ private static void read(ColumnFileReader reader, MappingVisitor visitor) throws
131134
}
132135
} else {
133136
String line = reader.nextCol();
134-
final String prefix = TinyProperties.intermediaryCounter + " ";
135-
String[] parts;
136-
137-
if (line.startsWith(prefix)
138-
&& (parts = line.substring(prefix.length()).split(" ")).length == 2) {
139-
String property = null;
140-
141-
switch (parts[0]) {
142-
case "class":
143-
property = TinyProperties.NEXT_INTERMEDIARY_CLASS;
144-
break;
145-
case "field":
146-
property = TinyProperties.NEXT_INTERMEDIARY_FIELD;
147-
break;
148-
case "method":
149-
property = TinyProperties.NEXT_INTERMEDIARY_METHOD;
150-
break;
137+
138+
if (line.startsWith("#") && line.length() >= 4) { // Metadata
139+
line = line.substring(2);
140+
String[] parts = line.split(" ");
141+
String value = parts[parts.length - 1];
142+
String key = line.substring(0, line.lastIndexOf(value));
143+
144+
if (key.isEmpty()) {
145+
String oldValue = value;
146+
value = key;
147+
key = oldValue;
151148
}
152149

150+
StandardProperty property = StandardProperties.getByName(key);
151+
153152
if (property != null) {
154-
visitor.visitMetadata(property, parts[1]);
153+
key = property.getId();
155154
}
155+
156+
visitor.visitMetadata(key, value);
156157
}
157158
}
158159
}
@@ -176,4 +177,6 @@ private static void readDstNames(ColumnFileReader reader, MappedElementKind subj
176177
if (!name.isEmpty()) visitor.visitDstName(subjectKind, dstNs, name);
177178
}
178179
}
180+
181+
private static final MappingFormat format = MappingFormat.TINY_FILE;
179182
}

src/main/java/net/fabricmc/mappingio/format/tiny/Tiny1FileWriter.java

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import net.fabricmc.mappingio.MappedElementKind;
2727
import net.fabricmc.mappingio.MappingFlag;
2828
import net.fabricmc.mappingio.MappingWriter;
29+
import net.fabricmc.mappingio.format.MappingFormat;
30+
import net.fabricmc.mappingio.format.StandardProperties;
31+
import net.fabricmc.mappingio.format.StandardProperty;
2932

3033
public final class Tiny1FileWriter implements MappingWriter {
3134
public Tiny1FileWriter(Writer writer) {
@@ -59,28 +62,18 @@ public void visitNamespaces(String srcNamespace, List<String> dstNamespaces) thr
5962

6063
@Override
6164
public void visitMetadata(String key, String value) throws IOException {
62-
switch (key) {
63-
case TinyProperties.NEXT_INTERMEDIARY_CLASS:
64-
case TinyProperties.NEXT_INTERMEDIARY_FIELD:
65-
case TinyProperties.NEXT_INTERMEDIARY_METHOD:
66-
switch (key) {
67-
case TinyProperties.NEXT_INTERMEDIARY_CLASS:
68-
write(TinyProperties.NEXT_INTERMEDIARY_CLASS);
69-
break;
70-
case TinyProperties.NEXT_INTERMEDIARY_FIELD:
71-
write(TinyProperties.NEXT_INTERMEDIARY_FIELD);
72-
break;
73-
case TinyProperties.NEXT_INTERMEDIARY_METHOD:
74-
write(TinyProperties.NEXT_INTERMEDIARY_METHOD);
75-
break;
76-
default:
77-
throw new IllegalStateException();
78-
}
65+
StandardProperty property = StandardProperties.getById(key);
7966

80-
write(" ");
81-
write(value);
82-
writeLn();
67+
if (property != null) {
68+
if (!property.isApplicableTo(format)) return;
69+
key = property.getNameFor(format);
8370
}
71+
72+
write("# ");
73+
write(key);
74+
write(" ");
75+
write(value);
76+
writeLn();
8477
}
8578

8679
@Override
@@ -189,6 +182,7 @@ private void writeTab() throws IOException {
189182
}
190183

191184
private static final Set<MappingFlag> flags = EnumSet.of(MappingFlag.NEEDS_SRC_FIELD_DESC, MappingFlag.NEEDS_SRC_METHOD_DESC);
185+
private static final MappingFormat format = MappingFormat.TINY_FILE;
192186

193187
private final Writer writer;
194188
private String classSrcName;

src/main/java/net/fabricmc/mappingio/format/tiny/Tiny2FileReader.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import net.fabricmc.mappingio.MappingFlag;
2626
import net.fabricmc.mappingio.MappingVisitor;
2727
import net.fabricmc.mappingio.format.ColumnFileReader;
28+
import net.fabricmc.mappingio.format.MappingFormat;
29+
import net.fabricmc.mappingio.format.StandardProperties;
30+
import net.fabricmc.mappingio.format.StandardProperty;
2831

2932
public final class Tiny2FileReader {
3033
public static List<String> getNamespaces(Reader reader) throws IOException {
@@ -86,16 +89,21 @@ private static void read(ColumnFileReader reader, MappingVisitor visitor) throws
8689
if (visitHeader || firstIteration) {
8790
while (reader.nextLine(1)) {
8891
if (!visitHeader) {
89-
if (!escapeNames && reader.nextCol(TinyProperties.ESCAPED_NAMES)) {
92+
if (!escapeNames && reader.nextCol(StandardProperties.ESCAPED_NAMES.getNameFor(format))) {
9093
escapeNames = true;
9194
}
9295
} else {
9396
String key = reader.nextCol();
9497
if (key == null) throw new IOException("missing property key in line "+reader.getLineNumber());
9598
String value = reader.nextEscapedCol(); // may be missing -> null
99+
StandardProperty property = StandardProperties.getByName(key);
96100

97-
if (key.equals(TinyProperties.ESCAPED_NAMES)) {
98-
escapeNames = true;
101+
if (property != null) {
102+
key = property.getId();
103+
104+
if (property == StandardProperties.ESCAPED_NAMES) {
105+
escapeNames = true;
106+
}
99107
}
100108

101109
visitor.visitMetadata(key, value);
@@ -212,4 +220,6 @@ private static void readDstNames(ColumnFileReader reader, MappedElementKind subj
212220
if (!name.isEmpty()) visitor.visitDstName(subjectKind, dstNs, name);
213221
}
214222
}
223+
224+
private static final MappingFormat format = MappingFormat.TINY_2_FILE;
215225
}

src/main/java/net/fabricmc/mappingio/format/tiny/Tiny2FileWriter.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import net.fabricmc.mappingio.MappedElementKind;
2727
import net.fabricmc.mappingio.MappingFlag;
2828
import net.fabricmc.mappingio.MappingWriter;
29+
import net.fabricmc.mappingio.format.MappingFormat;
30+
import net.fabricmc.mappingio.format.StandardProperties;
31+
import net.fabricmc.mappingio.format.StandardProperty;
2932

3033
public final class Tiny2FileWriter implements MappingWriter {
3134
public Tiny2FileWriter(Writer writer, boolean escapeNames) {
@@ -60,9 +63,16 @@ public void visitNamespaces(String srcNamespace, List<String> dstNamespaces) thr
6063

6164
@Override
6265
public void visitMetadata(String key, String value) throws IOException {
63-
if (key.equals(TinyProperties.ESCAPED_NAMES)) {
64-
escapeNames = true;
65-
wroteEscapedNamesProperty = true;
66+
StandardProperty property = StandardProperties.getById(key);
67+
68+
if (property != null) {
69+
if (!property.isApplicableTo(format)) return;
70+
key = property.getNameFor(format);
71+
72+
if (property == StandardProperties.ESCAPED_NAMES) {
73+
escapeNames = true;
74+
wroteEscapedNamesProperty = true;
75+
}
6676
}
6777

6878
writeTab();
@@ -80,7 +90,7 @@ public void visitMetadata(String key, String value) throws IOException {
8090
public boolean visitContent() throws IOException {
8191
if (escapeNames && !wroteEscapedNamesProperty) {
8292
write("\t");
83-
write(TinyProperties.ESCAPED_NAMES);
93+
write(StandardProperties.ESCAPED_NAMES.getNameFor(format));
8494
writeLn();
8595
}
8696

@@ -201,6 +211,7 @@ private void writeTabs(int count) throws IOException {
201211
}
202212

203213
private static final Set<MappingFlag> flags = EnumSet.of(MappingFlag.NEEDS_HEADER_METADATA, MappingFlag.NEEDS_UNIQUENESS, MappingFlag.NEEDS_SRC_FIELD_DESC, MappingFlag.NEEDS_SRC_METHOD_DESC);
214+
private static final MappingFormat format = MappingFormat.TINY_2_FILE;
204215

205216
private final Writer writer;
206217
private boolean escapeNames;

src/main/java/net/fabricmc/mappingio/format/tiny/TinyProperties.java

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)