/******************************************************************************* * Copyright (c) 2014 Jeff Martin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Jeff Martin - initial API and implementation ******************************************************************************/ package cuchaz.enigma.mapping; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MappingsWriter { public void write( Writer out, Mappings mappings ) throws IOException { write( new PrintWriter( out ), mappings ); } public void write( PrintWriter out, Mappings mappings ) throws IOException { for( ClassMapping classMapping : sorted( mappings.classes() ) ) { write( out, classMapping, 0 ); } } private void write( PrintWriter out, ClassMapping classMapping, int depth ) throws IOException { if( classMapping.getDeobfName() == null ) { out.format( "%sCLASS %s\n", getIndent( depth ), classMapping.getObfName() ); } else { out.format( "%sCLASS %s %s\n", getIndent( depth ), classMapping.getObfName(), classMapping.getDeobfName() ); } for( ClassMapping innerClassMapping : sorted( classMapping.innerClasses() ) ) { write( out, innerClassMapping, depth + 1 ); } for( FieldMapping fieldMapping : sorted( classMapping.fields() ) ) { write( out, fieldMapping, depth + 1 ); } for( MethodMapping methodMapping : sorted( classMapping.methods() ) ) { write( out, methodMapping, depth + 1 ); } } private void write( PrintWriter out, FieldMapping fieldMapping, int depth ) throws IOException { out.format( "%sFIELD %s %s\n", getIndent( depth ), fieldMapping.getObfName(), fieldMapping.getDeobfName() ); } private void write( PrintWriter out, MethodMapping methodMapping, int depth ) throws IOException { if( methodMapping.getDeobfName() == null ) { out.format( "%sMETHOD %s %s\n", getIndent( depth ), methodMapping.getObfName(), methodMapping.getObfSignature() ); } else { out.format( "%sMETHOD %s %s %s\n", getIndent( depth ), methodMapping.getObfName(), methodMapping.getDeobfName(), methodMapping.getObfSignature() ); } for( ArgumentMapping argumentMapping : sorted( methodMapping.arguments() ) ) { write( out, argumentMapping, depth + 1 ); } } private void write( PrintWriter out, ArgumentMapping argumentMapping, int depth ) throws IOException { out.format( "%sARG %d %s\n", getIndent( depth ), argumentMapping.getIndex(), argumentMapping.getName() ); } private > List sorted( Iterable classes ) { List out = new ArrayList(); for( T t : classes ) { out.add( t ); } Collections.sort( out ); return out; } private String getIndent( int depth ) { StringBuilder buf = new StringBuilder(); for( int i=0; i