package com.dragome.compiler.type;
import java.io.File;
import org.xmlvm.ClassToJs;
import com.dragome.compiler.DragomeJsCompiler;
import com.dragome.compiler.Project;
import com.dragome.compiler.ast.TypeDeclaration;
import com.dragome.compiler.generators.AbstractVisitor;
import com.dragome.compiler.parser.Parser;
import com.dragome.compiler.units.ClassUnit;
import com.dragome.compiler.utils.Log;
public class TypeResolver implements TypeVisitor
{
private AbstractVisitor generator;
private Project project;
public TypeResolver(Project theProject, AbstractVisitor theGenerator)
{
project= theProject;
generator= theGenerator;
}
public void visit(ClassUnit clazz)
{
if (clazz.isResolved())
return;
Log logger= Log.getLogger();
if (clazz.getSignature().toString().startsWith("["))
{
}
else if (!clazz.isUpToDate())
{
clazz.clear();
try
{
compile(clazz);
DragomeJsCompiler.compiler.compileCount++;
}
catch (RuntimeException ex)
{
DragomeJsCompiler.errorCount++;
logger.error(ex.toString());
if (DragomeJsCompiler.compiler.failOnError)
{
throw ex;
}
}
}
else
{
logger.debug("Up to date: " + clazz);
}
clazz.setResolved(true);
}
private void compile(ClassUnit classUnit)
{
classUnit.getNotReversibleMethods().clear();
if (classUnit.getClassFile() == null)
{
Log.getLogger().warn("Cannot read " + classUnit.getClassFile());
return;
}
Log.getLogger().debug("Cross-Compiling " + classUnit);
Log.getLogger().infoSameLine(".");
TypeDeclaration typeDecl= null;
try
{
typeDecl= parse(classUnit);
}
catch (Exception e)
{
Log.getLogger().debug("parse error:" + e.getMessage(), e);
}
{
typeDecl.visit(generator);
if (!classUnit.getNotReversibleMethods().isEmpty())
{
String filename= classUnit.getClassFile().getFilename();
classUnit.setAlternativeCompilation(ClassToJs.transformClassFileToJs(filename, classUnit.getBytecode()));
project.incrementBadMethods(classUnit.getNotReversibleMethods().size());
}
classUnit.setLastCompiled(classUnit.getLastModified());
classUnit.setLastCRC(classUnit.getCRC());
}
}
private TypeDeclaration parse(ClassUnit classUnit)
{
Parser parser= new Parser(classUnit);
TypeDeclaration typeDecl= parser.parse();
return typeDecl;
}
}