summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping/MappingsReaderOld.java
blob: a23a33fad2c85da955d0d3384b129ff837269e9d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package cuchaz.enigma.mapping;

import com.google.common.collect.Queues;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Deque;

public class MappingsReaderOld {

    public Mappings read(Reader in) throws IOException, MappingParseException {
        return read(new BufferedReader(in));
    }

    public Mappings read(BufferedReader in) throws IOException, MappingParseException {
        Mappings mappings = new Mappings();
        Deque<Object> mappingStack = Queues.newArrayDeque();

        int lineNumber = 0;
        String line;
        while ((line = in.readLine()) != null) {
            lineNumber++;

            // strip comments
            int commentPos = line.indexOf('#');
            if (commentPos >= 0) {
                line = line.substring(0, commentPos);
            }

            // skip blank lines
            if (line.trim().length() <= 0) {
                continue;
            }

            // get the indent of this line
            int indent = 0;
            for (int i = 0; i < line.length(); i++) {
                if (line.charAt(i) != '\t') {
                    break;
                }
                indent++;
            }

            // handle stack pops
            while (indent < mappingStack.size()) {
                mappingStack.pop();
            }

            String[] parts = line.trim().split("\\s");
            try {
                // read the first token
                String token = parts[0];

                if (token.equalsIgnoreCase("CLASS")) {
                    ClassMapping classMapping;
                    if (indent <= 0) {
                        // outer class
                        classMapping = readClass(parts, false);
                        mappings.addClassMapping(classMapping);
                    } else {

                        // inner class
                        if (!(mappingStack.peek() instanceof ClassMapping)) {
                            throw new MappingParseException(lineNumber, "Unexpected CLASS entry here!");
                        }

                        classMapping = readClass(parts, true);
                        ((ClassMapping) mappingStack.peek()).addInnerClassMapping(classMapping);
                    }
                    mappingStack.push(classMapping);
                } else if (token.equalsIgnoreCase("FIELD")) {
                    if (mappingStack.isEmpty() || !(mappingStack.peek() instanceof ClassMapping)) {
                        throw new MappingParseException(lineNumber, "Unexpected FIELD entry here!");
                    }
                    ((ClassMapping) mappingStack.peek()).addFieldMapping(readField(parts));
                } else if (token.equalsIgnoreCase("METHOD")) {
                    if (mappingStack.isEmpty() || !(mappingStack.peek() instanceof ClassMapping)) {
                        throw new MappingParseException(lineNumber, "Unexpected METHOD entry here!");
                    }
                    MethodMapping methodMapping = readMethod(parts);
                    ((ClassMapping) mappingStack.peek()).addMethodMapping(methodMapping);
                    mappingStack.push(methodMapping);
                } else if (token.equalsIgnoreCase("ARG")) {
                    if (mappingStack.isEmpty() || !(mappingStack.peek() instanceof MethodMapping)) {
                        throw new MappingParseException(lineNumber, "Unexpected ARG entry here!");
                    }
                    ((MethodMapping) mappingStack.peek()).addArgumentMapping(readArgument(parts));
                }
            } catch (ArrayIndexOutOfBoundsException | IllegalArgumentException ex) {
                throw new MappingParseException(lineNumber, "Malformed line:\n" + line);
            }
        }

        return mappings;
    }

    private ArgumentMapping readArgument(String[] parts) {
        return new ArgumentMapping(Integer.parseInt(parts[1]), parts[2]);
    }

    private ClassMapping readClass(String[] parts, boolean makeSimple) {
        if (parts.length == 2) {
            return new ClassMapping(parts[1]);
        } else {
            return new ClassMapping(parts[1], parts[2]);
        }
    }

    /* TEMP */
    protected FieldMapping readField(String[] parts) {
        return new FieldMapping(parts[1], new Type(parts[3]), parts[2]);
    }

    private MethodMapping readMethod(String[] parts) {
        if (parts.length == 3) {
            return new MethodMapping(parts[1], new Signature(parts[2]));
        } else {
            return new MethodMapping(parts[1], new Signature(parts[3]), parts[2]);
        }
    }
}