Merged arrays into Charj mainline.
[charm.git] / src / langs / charj / src / charj / translator / Translator.java
index f0bdce59c819cc6b8a0a331976ce5a3056804de7..901b8bfee813cdeb5523ca4111eb8b97eab1e550 100644 (file)
@@ -31,6 +31,7 @@ public class Translator {
     private String m_stdlib;
     private List<String> m_usrlibs;
 
+    private String m_basename;
     private SymbolTable m_symtab;
     private CommonTree m_ast;
     private CommonTreeNodeStream m_nodes;
@@ -57,6 +58,7 @@ public class Translator {
 
     public boolean debug()      { return m_debug; }
     public boolean verbose()    { return m_verbose; }
+    public String basename()    { return m_basename; }
 
     public static TreeAdaptor m_adaptor = new CommonTreeAdaptor() {
         public Object create(Token token) {
@@ -72,6 +74,8 @@ public class Translator {
     };
 
     public String translate(String filename) throws Exception {
+        m_basename = filename.substring(0, filename.lastIndexOf("."));
+
         ANTLRFileStream input = new ANTLRFileStream(filename);
             
         CharjLexer lexer = new CharjLexer(input);
@@ -88,26 +92,29 @@ public class Translator {
         m_nodes.setTokenStream(tokens);
         m_nodes.setTreeAdaptor(m_adaptor);
 
-        // do AST rewriting in semantic phase
-        if (m_printAST) printAST("Before Semantic Pass", "before.html");
-        ClassSymbol sem = semanticPass();
+        // do AST rewriting and semantic checking
+        if (m_printAST) printAST("Before Modifier Pass", "before_mod.html");
+        modifierPass();
+        m_nodes = new CommonTreeNodeStream(m_ast);
+        m_nodes.setTokenStream(tokens);
+        m_nodes.setTreeAdaptor(m_adaptor);
+        if (m_printAST) printAST("Before Semantic Pass", "before_sem.html");
+       ClassSymbol sem = semanticPass();
        modifyNodes(sem);
-        if (m_printAST) printAST("After Semantic Pass", "after.html");
+        //semanticPass();
+        if (m_printAST) printAST("After Semantic Pass", "after_sem.html");
 
        m_nodes = new CommonTreeNodeStream(m_ast);
         m_nodes.setTokenStream(tokens);
         m_nodes.setTreeAdaptor(m_adaptor);
 
         // emit code for .ci, .h, and .cc based on rewritten AST
-        m_nodes.reset();
         String ciOutput = translationPass(OutputMode.ci);
         writeTempFile(filename, ciOutput, OutputMode.ci);
 
-        m_nodes.reset();
         String hOutput = translationPass(OutputMode.h);
         writeTempFile(filename, hOutput, OutputMode.h);
         
-        m_nodes.reset();
         String ccOutput = translationPass(OutputMode.cc);
         writeTempFile(filename, ccOutput, OutputMode.cc);
         if (!m_translate_only) compileTempFiles(filename, m_charmc);
@@ -122,9 +129,19 @@ public class Translator {
             ccHeader + ccOutput + footer;
     }
 
+    private void modifierPass() throws
+        RecognitionException, IOException, InterruptedException
+    {
+        m_nodes.reset();
+        CharjASTModifier mod = new CharjASTModifier(m_nodes);
+        mod.setTreeAdaptor(m_adaptor);
+        m_ast = (CommonTree)mod.charjSource(m_symtab).getTree();
+    }
+
     private ClassSymbol semanticPass() throws
         RecognitionException, IOException, InterruptedException
     {
+        m_nodes.reset();
         CharjSemantics sem = new CharjSemantics(m_nodes);
         return sem.charjSource(m_symtab);
     }
@@ -161,7 +178,7 @@ public class Translator {
            if (init.getType() == CharjParser.IDENT) {
                CharjAST ast1 = new CharjAST(CharjParser.EXPR, "EXPR");
                CharjAST ast2 = new CharjAST(CharjParser.METHOD_CALL, "METHOD_CALL");
-               CharjAST ast2_1 = new CharjAST(CharjParser.T__140, ".");
+               CharjAST ast2_1 = new CharjAST(CharjParser.DOT, ".");
                CharjAST ast2_2 = new CharjAST(CharjParser.IDENT, init.getText());
                CharjAST ast2_3 = new CharjAST(CharjParser.IDENT, "init");
                CharjAST ast4 = new CharjAST(CharjParser.ARGUMENT_LIST, "ARGUMENT_LIST");
@@ -186,6 +203,7 @@ public class Translator {
     private String translationPass(OutputMode m) throws
         RecognitionException, IOException, InterruptedException
     {
+        m_nodes.reset();
         CharjEmitter emitter = new CharjEmitter(m_nodes);
         StringTemplateGroup templates = getTemplates(templateFile);
         emitter.setTemplateLib(templates);
@@ -262,7 +280,7 @@ public class Translator {
             String fullName = packageDir + "/" + typeName + ".cj";
                
             ClassLoader cl = Thread.currentThread().getContextClassLoader();
-            boolean fileExists = (cl.getResource(fullName) == null);
+            boolean fileExists = (cl.getResource(fullName) != null);
             if (!fileExists) {
                 if (debug()) System.out.println(
                         " \tloadType(" + typeName + "): not found");
@@ -308,24 +326,17 @@ public class Translator {
             String output) throws
         IOException
     {
-        int lastDot = filename.lastIndexOf(".");
-        int lastSlash = filename.lastIndexOf(java.io.File.separator);
-        String tempFile = filename.substring(0, lastSlash + 1) +
-            ".charj" + java.io.File.separator;
-        new File(tempFile).mkdir();
-        tempFile += filename.substring(lastSlash + 1, filename.length());
-        if (m_verbose) System.out.println(" [charjc] create: " + tempFile);
-        FileWriter fw = new FileWriter(tempFile);
+        if (m_verbose) System.out.println(" [charjc] create: " + filename);
+        FileWriter fw = new FileWriter(filename);
         fw.write(output);
         fw.close();
         return;
     }
 
     /**
-     * Enters the .charj directory and compiles the .cc and .ci files 
-     * generated from the given filename. The given charmc string 
-     * includes all options to be passed to charmc. Any generated .o 
-     * file is moved back to the initial directory.
+     * Compiles the .cc and .ci files generated from the given filename.
+     * The given charmc string includes all options to be passed to charmc.
+     * Any generated .o file is moved back to the initial directory.
      */
     private void compileTempFiles(
             String filename,
@@ -338,29 +349,27 @@ public class Translator {
         if (baseDirectory.equals("")) {
             baseDirectory = "./";
         }
-        String tempDirectory = baseDirectory + ".charj/";
         String moduleName = filename.substring(lastSlash + 1, lastDot);
-        String baseTempFilename = tempDirectory + moduleName;
+        String baseTempFilename = moduleName;
 
         // Compile interface file
         String cmd = charmc + " " + baseTempFilename + ".ci";
         File currentDir = new File(".");
         int retVal = exec(cmd, currentDir);
         if (retVal != 0) {
-            error("Could not compile generated interface file");
+            error("Could not compile generated interface file.");
             return;
         }
 
         // Move decl.h and def.h into temp directory.
         // charmxi/charmc doesn't offer control over where to generate these
-        cmd = "mv " + moduleName + ".decl.h " + moduleName + ".def.h " +
-            tempDirectory;
+        cmd = "touch " + baseTempFilename + ".decl.h " +
+            baseTempFilename + ".def.h";
         retVal = exec(cmd, currentDir);
-         if (retVal != 0) {
-            error("Could not move .decl.h and .def.h files " +
-                    "into temp directory");
+        if (retVal != 0) {
+            error("Could not touch .decl.h and .def.h files.");
             return;
-        }       
+        }
 
         // Compile c++ output
         cmd = charmc + " -c " + baseTempFilename + ".cc" + 
@@ -370,12 +379,6 @@ public class Translator {
             error("Could not compile generated C++ file");
             return;
         }
-
-        // move generated .o and .h file into .cj directory
-        cmd = "mv -f " + baseTempFilename + ".o " + baseDirectory;
-        exec(cmd, currentDir);
-        cmd = "cp -f " + baseTempFilename + ".h " + baseDirectory;
-        exec(cmd, currentDir);
     }
 
     /**
@@ -403,7 +406,7 @@ public class Translator {
      * Print a representation of the Charj AST. If message is not null,
      * it is printed, along with an ASCII representation of the tree,
      * to stdout. If filename is not null, an html temp file containin
-     * the representation is printed to .charj/filename.
+     * the representation is printed to filename.
      */
     public void printAST(String message, String filename) throws IOException
     {