fixed some bugs
[cdsspec-compiler.git] / src / edu / uci / eecs / specCompiler / codeGenerator / CodeGenerator.java
index 008ef66366277be3fb019e69e13f476815c86f6d..66bdca4ab408d740edb6a444ad684fc9fc48ee02 100644 (file)
@@ -89,15 +89,48 @@ public class CodeGenerator {
 
        // Mainly rename and wrap the interface
        private void interface2Code(InterfaceConstruct construct) {
-               ArrayList<String> newCode = CodeVariables.generateInterfaceWrapper(
-                               _semantics, construct);
-               int lineNum = construct.beginLineNum;
-               // Add it to the codeAdditions
-               CodeAddition addition = new CodeAddition(lineNum, newCode);
-               if (!codeAdditions.containsKey(construct.file)) {
-                       codeAdditions.put(construct.file, new ArrayList<CodeAddition>());
+               // First rename the interface
+               CodeVariables.renameInterface(_semantics, construct);
+
+               // If there's no define construct for it, we generate the wrapper just
+               // in place without declaration
+               InterfaceDefineConstruct defineConstruct = _semantics.interfaceName2DefineConstruct
+                               .get(construct.name);
+               ArrayList<String> newCode;
+               int lineNum;
+               CodeAddition addition;
+               // Then generate the wrapper if necessary
+               if (defineConstruct != null) { // Need to have a wrapper declaration
+                       newCode = CodeVariables.generateInterfaceWrapperDeclaration(_semantics, construct);
+                       lineNum = construct.beginLineNum;
+                       // Add the wrapper declaration
+                       addition = new CodeAddition(lineNum, newCode);
+                       if (!codeAdditions.containsKey(construct.file)) {
+                               codeAdditions.put(construct.file, new ArrayList<CodeAddition>());
+                       }
+                       codeAdditions.get(construct.file).add(addition);
+                       
+                       // Add the wrapper definition
+                       newCode = CodeVariables.generateInterfaceWrapperDefinition(_semantics, construct);
+                       lineNum = defineConstruct.beginLineNum;
+                       // Add the wrapper declaration
+                       addition = new CodeAddition(lineNum, newCode);
+                       if (!codeAdditions.containsKey(defineConstruct.file)) {
+                               codeAdditions.put(defineConstruct.file, new ArrayList<CodeAddition>());
+                       }
+                       codeAdditions.get(defineConstruct.file).add(addition);
+               } else { // No declaration needed
+                       // Last generate the definition
+                       newCode = CodeVariables.generateInterfaceWrapperDefinition(_semantics, construct);
+                       lineNum = construct.beginLineNum;
+                       // Add the wrapper declaration
+                       addition = new CodeAddition(lineNum, newCode);
+                       if (!codeAdditions.containsKey(construct.file)) {
+                               codeAdditions.put(construct.file, new ArrayList<CodeAddition>());
+                       }
+                       codeAdditions.get(construct.file).add(addition);
                }
-               codeAdditions.get(construct.file).add(addition);
+               
        }
 
        private void potentialCPDefine2Code(PotentialCPDefineConstruct construct) {
@@ -158,9 +191,10 @@ public class CodeGenerator {
                int curSrcLine = 0;
                for (int i = 0; i < additions.size(); i++) {
                        CodeAddition addition = additions.get(i);
-                       if (curSrcLine <  addition.lineNum) {
+                       if (curSrcLine < addition.lineNum) {
                                // Be careful, subList is the interval [begin, end)
-                               newContent.addAll(content.subList(curSrcLine, addition.lineNum));
+                               newContent
+                                               .addAll(content.subList(curSrcLine, addition.lineNum));
                                curSrcLine = addition.lineNum;
                        }
                        newContent.addAll(addition.newCode);
@@ -206,13 +240,14 @@ public class CodeGenerator {
        public static void main(String[] argvs) {
                String homeDir = Environment.HOME_DIRECTORY;
                File[] srcFiles = {
-                               new File(Environment.MODEL_CHECKER_TEST_DIR + "/backup_linuxrwlocks.c") };
-//              new File(homeDir + "/benchmark/linuxrwlocks/linuxrwlocks.c") };
-//             new File(homeDir
-//                             + "/benchmark/cliffc-hashtable/simplified_cliffc_hashtable.h"), };
+               // new File(Environment.MODEL_CHECKER_TEST_DIR +
+               // "/backup_linuxrwlocks.c") };
+               // new File(homeDir + "/benchmark/linuxrwlocks/linuxrwlocks.c") };
+               new File(homeDir
+                               + "/benchmark/cliffc-hashtable/simplified_cliffc_hashtable.h"), };
                // new File(homeDir + "/benchmark/ms-queue/my_queue.c"),
-               // new File(homeDir + "/benchmark/ms-queue/my_queue.h") };
-//             new File(homeDir + "/benchmark/test/test.c") };
+               // new File(homeDir + "/benchmark/ms-queue/my_queue.c") };
+               // new File(homeDir + "/benchmark/test/test.c") };
                CodeGenerator gen = new CodeGenerator(srcFiles);
                gen.generateCode();
        }