// Path: src/mgi/tools/jagdecs2/CodePrinter.java
// public class CodePrinter {
// 
// 	protected StringWriter writer;
// 	private int tabs;
// 	
// 	
// 	public CodePrinter() {
// 		writer = new StringWriter();
// 		tabs = 0;
// 	}
// 	
// 	/**
// 	 * Method , unused by default that notifies that specific node is
// 	 * about to be printed.
// 	 */
// 	public void beginPrinting(AbstractCodeNode node) { }
// 	
// 	/**
// 	 * Method, unused by default that notifies that specific node was
// 	 * printed.
// 	 */
// 	public void endPrinting(AbstractCodeNode node) { }
// 	
// 	
// 	public void print(CharSequence str) {
// 		for (int i = 0; i < str.length(); i++)
// 			print(str.charAt(i));
// 	}
// 	
// 	public void print(char c) {
// 		writer.append(c);
// 		if (c == '\n')
// 			writer.append(getTabs());
// 	}
// 	
// 	protected String getTabs() {
// 		StringBuilder tabs = new StringBuilder();
// 		for (int i = 0; i < this.tabs; i++)
// 			tabs.append('\t');
// 		return tabs.toString();
// 	}
// 	
// 	public void tab() {
// 		tabs++;
// 	}
// 	
// 	public void untab() {
// 		if (tabs <= 0)
// 			throw new RuntimeException("Not tabbed!");
// 		tabs--;
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		writer.flush();
// 		return writer.toString();
// 	}
// 	
// 	public static String print(AbstractCodeNode node) {
// 		CodePrinter printer = new CodePrinter();
// 		node.print(printer);
// 		return printer.toString();
// 	}
// 	
// }
// 
// Path: src/mgi/tools/jagdecs2/DecompilerException.java
// public class DecompilerException extends RuntimeException {
// 	private static final long serialVersionUID = 7195887685185051968L;
// 
// 	public DecompilerException(String string) {
// 		super(string);
// 	}
// 
// }


import java.util.ArrayList;
import java.util.List;
import mgi.tools.jagdecs2.CodePrinter;
import mgi.tools.jagdecs2.DecompilerException;


	public void setParent(AbstractCodeNode parentInstruction) {
		this.parent = parentInstruction;
	}

	public AbstractCodeNode getParent() {
		return parent;
	}
	
	
	private boolean needsBraces() {
		if (!(getParent() instanceof LoopNode) && !(getParent() instanceof IfElseNode))
			return true;
	
		int cElements = size();
		for (int i = 0; i < cElements; i++) {
			if (read(i) instanceof LoopNode || read(i) instanceof IfElseNode || read(i) instanceof SwitchNode)
				return true;
		}
		
		
		for (LocalVariable var : this.declaredLocalVariables)
			if (var.needsScopeDeclaration())
				cElements++;
		
		return cElements > 1;
	}
	

	@Override

// Path: src/mgi/tools/jagdecs2/CodePrinter.java
// public class CodePrinter {
// 
// 	protected StringWriter writer;
// 	private int tabs;
// 	
// 	
// 	public CodePrinter() {
// 		writer = new StringWriter();
// 		tabs = 0;
// 	}
// 	
// 	/**
// 	 * Method , unused by default that notifies that specific node is
// 	 * about to be printed.
// 	 */
// 	public void beginPrinting(AbstractCodeNode node) { }
// 	
// 	/**
// 	 * Method, unused by default that notifies that specific node was
// 	 * printed.
// 	 */
// 	public void endPrinting(AbstractCodeNode node) { }
// 	
// 	
// 	public void print(CharSequence str) {
// 		for (int i = 0; i < str.length(); i++)
// 			print(str.charAt(i));
// 	}
// 	
// 	public void print(char c) {
// 		writer.append(c);
// 		if (c == '\n')
// 			writer.append(getTabs());
// 	}
// 	
// 	protected String getTabs() {
// 		StringBuilder tabs = new StringBuilder();
// 		for (int i = 0; i < this.tabs; i++)
// 			tabs.append('\t');
// 		return tabs.toString();
// 	}
// 	
// 	public void tab() {
// 		tabs++;
// 	}
// 	
// 	public void untab() {
// 		if (tabs <= 0)
// 			throw new RuntimeException("Not tabbed!");
// 		tabs--;
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		writer.flush();
// 		return writer.toString();
// 	}
// 	
// 	public static String print(AbstractCodeNode node) {
// 		CodePrinter printer = new CodePrinter();
// 		node.print(printer);
// 		return printer.toString();
// 	}
// 	
// }
// 
// Path: src/mgi/tools/jagdecs2/DecompilerException.java
// public class DecompilerException extends RuntimeException {
// 	private static final long serialVersionUID = 7195887685185051968L;
// 
// 	public DecompilerException(String string) {
// 		super(string);
// 	}
// 
// }


// Path: src/mgi/tools/jagdecs2/ast/ScopeNode.java
import java.util.ArrayList;
import java.util.List;
import mgi.tools.jagdecs2.CodePrinter;
import mgi.tools.jagdecs2.DecompilerException;


	public void setParent(AbstractCodeNode parentInstruction) {
		this.parent = parentInstruction;
	}

	public AbstractCodeNode getParent() {
		return parent;
	}
	
	
	private boolean needsBraces() {
		if (!(getParent() instanceof LoopNode) && !(getParent() instanceof IfElseNode))
			return true;
	
		int cElements = size();
		for (int i = 0; i < cElements; i++) {
			if (read(i) instanceof LoopNode || read(i) instanceof IfElseNode || read(i) instanceof SwitchNode)
				return true;
		}
		
		
		for (LocalVariable var : this.declaredLocalVariables)
			if (var.needsScopeDeclaration())
				cElements++;
		
		return cElements > 1;
	}
	

	@Override

	public void print(CodePrinter printer) {
