diff python/c3/analyse.py @ 289:bd2593de3ff8

Semifix burn2
author Windel Bouwman
date Thu, 21 Nov 2013 15:46:50 +0100
parents a747a45dcd78
children 6aa721e7b10b
line wrap: on
line diff
--- a/python/c3/analyse.py	Thu Nov 21 14:26:13 2013 +0100
+++ b/python/c3/analyse.py	Thu Nov 21 15:46:50 2013 +0100
@@ -71,7 +71,6 @@
     def analyzePackage(self, pkg, packageDict):
         self.ok = True
         # Prepare top level scope and set scope to all objects:
-        AddScope(self.diag).addScope(pkg)
 
         self.logger.info('Resolving imports for package {}'.format(pkg.name))
         # Handle imports:
@@ -91,7 +90,23 @@
 
     # Reference fixups:
     def resolveDesignator(self, d, scope):
-        assert type(d) is Designator, type(d)
+        assert isinstance(d, Designator), type(d)
+        assert type(scope) is Scope
+        if scope.hasSymbol(d.tname):
+            s = scope.getSymbol(d.tname)
+            if isinstance(d, ImportDesignator):
+                if s.innerScope.hasSymbol(d.vname):
+                    return s.innerScope.getSymbol(d.vname)
+            else:
+                if hasattr(s, 'addRef'):
+                    # TODO: make this nicer
+                    s.addRef(None)
+                return s
+        else:
+            self.error('Cannot resolve name {0}'.format(d.tname), d.loc)
+
+    def resolveImportDesignator(self, d, scope):
+        assert isinstance(d, ImportDesignator), type(d)
         assert type(scope) is Scope
         if scope.hasSymbol(d.tname):
             s = scope.getSymbol(d.tname)
@@ -114,7 +129,7 @@
                 offset += theType(mem.typ).bytesize
             t.bytesize = offset
             return t
-        elif type(t) is Designator:
+        elif isinstance(t, Designator):
             t = self.resolveDesignator(t, scope)
             if t:
                 return self.resolveType(t, scope)