Charj: recognize array types in SymbolDefiner rather than SymbolResolver
authorAaron Becker <akbecker@gmail.com>
Thu, 30 Sep 2010 20:34:32 +0000 (15:34 -0500)
committerAaron Becker <akbecker@gmail.com>
Thu, 30 Sep 2010 20:34:32 +0000 (15:34 -0500)
The original implementation doesn't fill in var declaration symbol types
correctly, despite inferring correct array types elsewhere. This fix
recognizes array types everywhere.

src/langs/charj/src/charj/translator/SymbolDefiner.g
src/langs/charj/src/charj/translator/SymbolResolver.g

index 2f8de2bb1d268e5641bd97498ee82f1f70548c6d..348e6d4592fcc11b3decde4d4fe262c0918ab138 100644 (file)
@@ -250,6 +250,25 @@ type returns [Type namedType]
     ArrayList<TypeName> typeName = new ArrayList<TypeName>();
     if (currentScope == null) System.out.println("*****ERROR: null type scope");
     assert currentScope != null;
+}
+@after {
+    // TODO: Special case for Arrays, change this?
+    if (typeName.size() > 0 && typeName.get(0).name.equals("Array") &&
+            $namedType == null) {
+
+        int numDims = 1;
+        ClassSymbol cs = new ClassSymbol(symtab, "Array");
+        cs.templateArgs = typeName.get(0).parameters;
+
+        if (cs.templateArgs != null &&
+            cs.templateArgs.size() > 1) {
+            if (cs.templateArgs.get(1) instanceof LiteralType) {
+                numDims = Integer.valueOf(
+                    ((LiteralType)cs.templateArgs.get(1)).literal);
+            }
+        }
+        $namedType = new PointerType(symtab, cs);
+    }
 }
     :   VOID {
             $VOID.scope = currentScope;
index d1a2d0e3a076beb92db7ba7472dca8a44745f227..97ea116dcd53ece1f4929f5f07abe80708bc6718 100644 (file)
@@ -349,32 +349,13 @@ type returns [Type sym]
        boolean proxySection = false;
 }
 @after {
+    $start.symbolType = scope.resolveType(typeText);
     //System.out.println("\ntype string: " + typeText);
     //System.out.println("direct scope: " + scope);
-    $start.symbolType = scope.resolveType(typeText);
     //System.out.println("symbolType: " + $start.symbolType);
     if (proxy && $start.symbolType != null) $start.symbolType = new ProxyType(symtab, $start.symbolType);
     if (pointer && $start.symbolType != null) $start.symbolType = new PointerType(symtab, $start.symbolType);
        if (proxySection && $start.symbolType != null) $start.symbolType = new ProxySectionType(symtab, $start.symbolType);
-
-    // TODO: Special case for Arrays, change this?
-    if (typeText != null && typeText.size() > 0 &&
-        typeText.get(0).name.equals("Array") && $start.symbolType == null) {
-
-        int numDims = 1;
-
-        ClassSymbol cs = new ClassSymbol(symtab, "Array");
-        cs.templateArgs = typeText.get(0).parameters;
-
-        if (cs.templateArgs != null &&
-            cs.templateArgs.size() > 1) {
-            if (cs.templateArgs.get(1) instanceof LiteralType) {
-                numDims = Integer.valueOf(((LiteralType)cs.templateArgs.get(1)).literal);
-            }
-        }
-        $start.symbolType = new PointerType(symtab, cs);
-    }
-
     $sym = $start.symbolType;
     if ($sym == null) System.out.println("Couldn't resolve type: " + typeText);
 }