Charj: fix namespace handling to use symbol table correctly
[charm.git] / src / langs / charj / src / charj / translator / PackageScope.java
1
2 package charj.translator;
3
4 import java.util.HashMap;
5 import java.util.Map;
6
7 public class PackageScope extends SymbolWithScope {
8
9     /** List of packages and classes in this package */
10     Map<String, Symbol> members = new HashMap(); // union of types and subpackages
11     Scope enclosingScope;
12
13     public PackageScope(
14             SymbolTable symtab, 
15             String name, 
16             Scope enclosingScope) {
17         super(symtab, name);
18         this.enclosingScope = enclosingScope;
19     }
20
21     public Scope getEnclosingScope() {
22         return enclosingScope;
23     }
24
25     /** See if type is already defined in this package.  If not, look
26      *  for type on the disk in same package.  For example, first time
27      *  charj.lang.Chare fails to resolve.  Load from disk and put File
28      *  in package io which is in package charj.  Next time, File will
29      *  be found.
30      */
31     public ClassSymbol resolveType(String type) {
32         if (type == null) return null;
33         if (debug()) System.out.println(
34                 " PackageScope.resolveType(" + type + 
35                 "): examine " + toString());
36
37         // break off leading package names and look them up,
38         // then look up the base class name within the appropriate package scope.
39         String[] nameParts = type.split("[.]", 2);
40         if (nameParts.length == 1) return (ClassSymbol)members.get(type);
41         PackageScope innerPackage = (PackageScope)members.get(nameParts[0]);
42         if (innerPackage == null) {
43             if (debug()) System.out.println("Package lookup for " +
44                     nameParts[0] + "failed.\n");
45             return null;
46         }
47         return innerPackage.resolveType(nameParts[1]);
48     }
49
50     public String getFullyQualifiedName() {
51         if ( name.equals(SymbolTable.DEFAULT_PACKAGE_NAME) ) {
52             return null;
53         }
54         return super.getFullyQualifiedName();
55     }
56
57     public Map<String, Symbol> getMembers() {
58         return members;
59     }
60
61     public String toString() {
62         return "PackageScope[" + name + "]: " + members.keySet();
63     }
64 }