package immibis.bon.mcp; import immibis.bon.Mapping; import immibis.bon.NameSet; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class SrgFile { public Map<String, String> classes = new HashMap<String, String>(); // name -> name public Map<String, String> fields = new HashMap<String, String>(); // owner/name -> name public Map<String, String> methods = new HashMap<String, String>(); // owner/namedesc -> name public static String getLastComponent(String s) { String[] parts = s.split("/"); return parts[parts.length - 1]; } private SrgFile() {} /** Does not close <var>r</var>. */ public static SrgFile read(Reader r, boolean reverse) throws IOException { @SuppressWarnings("resource") Scanner in = new Scanner(r); SrgFile rv = new SrgFile(); while(in.hasNextLine()) { if(in.hasNext("CL:")) { in.next(); String obf = in.next(); String deobf = in.next(); if(reverse) rv.classes.put(deobf, obf); else rv.classes.put(obf, deobf); } else if(in.hasNext("FD:")) { in.next(); String obf = in.next(); String deobf = in.next(); if(reverse) rv.fields.put(deobf, getLastComponent(obf)); else rv.fields.put(obf, getLastComponent(deobf)); } else if(in.hasNext("MD:")) { in.next(); String obf = in.next(); String obfdesc = in.next(); String deobf = in.next(); String deobfdesc = in.next(); if(reverse) rv.methods.put(deobf + deobfdesc, getLastComponent(obf)); else rv.methods.put(obf + obfdesc, getLastComponent(deobf)); } else { in.nextLine(); } } return rv; } @Deprecated public SrgFile(File f, boolean reverse) throws IOException { try (FileReader fr = new FileReader(f)) { SrgFile sf = read(new BufferedReader(fr), reverse); classes = sf.classes; fields = sf.fields; methods = sf.methods; } } public Mapping toMapping(NameSet fromNS, NameSet toNS) { Mapping m = new Mapping(fromNS, toNS); for(Map.Entry<String, String> entry : classes.entrySet()) { m.setClass(entry.getKey(), entry.getValue()); } for(Map.Entry<String, String> entry : fields.entrySet()) { int i = entry.getKey().lastIndexOf('/'); m.setField(entry.getKey().substring(0, i), entry.getKey().substring(i+1), entry.getValue()); } for(Map.Entry<String, String> entry : methods.entrySet()) { int i = entry.getKey().lastIndexOf('('); String desc = entry.getKey().substring(i); String classandname = entry.getKey().substring(0,i); i = classandname.lastIndexOf('/'); m.setMethod(classandname.substring(0,i), classandname.substring(i+1), desc, entry.getValue()); } return m; } }