Skip to content

Commit 0910fa9

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 ad0c724 commit 0910fa9

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

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

153+
StandardProperty property = StandardProperties.getByName(key);
154+
156155
if (property != null) {
157-
visitor.visitMetadata(property, parts[1]);
156+
key = property.getId();
158157
}
158+
159+
visitor.visitMetadata(key, value);
159160
}
160161
}
161162
}
@@ -179,4 +180,6 @@ private static void readDstNames(ColumnFileReader reader, MappedElementKind subj
179180
if (!name.isEmpty()) visitor.visitDstName(subjectKind, dstNs, name);
180181
}
181182
}
183+
184+
private static final MappingFormat format = MappingFormat.TINY_FILE;
182185
}

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
private Tiny2FileReader() {
@@ -89,16 +92,21 @@ private static void read(ColumnFileReader reader, MappingVisitor visitor) throws
8992
if (visitHeader || firstIteration) {
9093
while (reader.nextLine(1)) {
9194
if (!visitHeader) {
92-
if (!escapeNames && reader.nextCol(TinyProperties.ESCAPED_NAMES)) {
95+
if (!escapeNames && reader.nextCol(StandardProperties.ESCAPED_NAMES.getNameFor(format))) {
9396
escapeNames = true;
9497
}
9598
} else {
9699
String key = reader.nextCol();
97100
if (key == null) throw new IOException("missing property key in line "+reader.getLineNumber());
98101
String value = reader.nextEscapedCol(); // may be missing -> null
102+
StandardProperty property = StandardProperties.getByName(key);
99103

100-
if (key.equals(TinyProperties.ESCAPED_NAMES)) {
101-
escapeNames = true;
104+
if (property != null) {
105+
key = property.getId();
106+
107+
if (property == StandardProperties.ESCAPED_NAMES) {
108+
escapeNames = true;
109+
}
102110
}
103111

104112
visitor.visitMetadata(key, value);
@@ -215,4 +223,6 @@ private static void readDstNames(ColumnFileReader reader, MappedElementKind subj
215223
if (!name.isEmpty()) visitor.visitDstName(subjectKind, dstNs, name);
216224
}
217225
}
226+
227+
private static final MappingFormat format = MappingFormat.TINY_2_FILE;
218228
}

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)