/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com This file is part of the sharpen open source java to c# translator. sharpen is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation and as clarified by db4objects' GPL interpretation policy, available at http://www.db4o.com/about/company/legalpolicies/gplinterpretation/ Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street, Suite 350, San Mateo, CA 94403, USA. sharpen is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package sharpen.core; import java.io.File; import java.io.IOException; import java.io.Writer; import sharpen.core.csharp.CSharpPrinter; import sharpen.core.csharp.ast.CSCompilationUnit; import sharpen.core.framework.*; import org.eclipse.jdt.core.dom.*; import sharpen.core.io.IO; public class SharpenConversion { private CSharpPrinter _printer; protected String _source; protected Writer _writer; protected final Configuration _configuration; private ASTResolver _resolver = new ASTResolver() { public ASTNode findDeclaringNode(IBinding binding) { return null; } }; public SharpenConversion(Configuration configuration) { _configuration = configuration; } public void setSource(String source) { _source = source; } public void setTargetWriter(Writer writer) { _writer = writer; } public Writer getTargetWriter() { return _writer; } public void setPrinter(CSharpPrinter printer) { _printer = printer; } private CSharpPrinter getPrinter() { if (null == _printer) { _printer = new CSharpPrinter(); } return _printer; } public Configuration getConfiguration() { return _configuration; } protected void print(CSCompilationUnit unit) { printHeader(); printTree(unit); } private void printHeader() { try { _writer.write(_configuration.header().replace("\n", "\r\n")); } catch (IOException x) { throw new RuntimeException(x); } } private void printTree(CSCompilationUnit unit) { CSharpPrinter printer = getPrinter(); printer.setWriter(_writer, _configuration.getIndentString(), _configuration.getMaxColumns()); printer.print(unit); } protected CSCompilationUnit run(final CompilationUnit ast) { processProblems(ast); prepareForConversion(ast); CSCompilationUnit cs = convert(ast); if (!cs.ignore() && !cs.types().isEmpty()) { print(cs); } return cs; } protected void processProblems(CompilationUnit ast) { if (ASTUtility.dumpProblemsToStdErr(ast) && !ignoringErrors()) { throw new RuntimeException("'" + _source + "' has errors, check stderr for details."); } } private CSCompilationUnit convert(final CompilationUnit ast) { final CSCompilationUnit compilationUnit = new CSCompilationUnit(); final Environment environment = Environments.newConventionBasedEnvironment(ast, _configuration, _resolver, compilationUnit); Environments.runWith(environment, new Runnable() { public void run() { CSharpBuilder builder = new CSharpBuilder(); String source = readFile(SharpenConversion.this._source); builder.setSourceContent(source); builder.run(); }}); return compilationUnit; } private String readFile(String sourcePath) { try { return IO.readFile(new File(sourcePath)); } catch (IOException e) { System.err.println("Can't load source from file " + sourcePath); return ""; } } private boolean ignoringErrors() { return _configuration.getIgnoreErrors(); } private void prepareForConversion(final CompilationUnit ast) { WarningHandler warningHandler = new WarningHandler() { public void warning(ASTNode node, String message) { System.err.println(getSourcePath() + "(" + ASTUtility.lineNumber(ast, node) + "): " + message); } }; _configuration.setWarningHandler(warningHandler); } private String getSourcePath() { return _source.substring(0, _source.lastIndexOf("/")-1); } public ASTResolver getASTResolver() { return _resolver; } public void setASTResolver(ASTResolver resolver) { _resolver = resolver; } }