diff dmd/Package.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children 2e2a5c3f943a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmd/Package.d	Sat Oct 24 08:42:06 2009 +0400
@@ -0,0 +1,75 @@
+module dmd.Package;
+
+import dmd.ScopeDsymbol;
+import dmd.Identifier;
+import dmd.Array;
+import dmd.DsymbolTable;
+import dmd.Scope;
+import dmd.Dsymbol;
+import dmd.Module;
+import dmd.Util;
+
+class Package : ScopeDsymbol
+{
+    this(Identifier ident)
+	{
+		super(ident);
+	}
+	
+    string kind()
+	{
+		assert(false);
+	}
+
+    static DsymbolTable resolve(Array packages, Dsymbol* pparent, Package* ppkg)
+	{
+		DsymbolTable dst = Module.modules;
+		Dsymbol parent = null;
+
+		//printf("Package::resolve()\n");
+		if (ppkg)
+			*ppkg = null;
+
+		if (packages)
+		{
+			for (int i = 0; i < packages.dim; i++)
+			{   
+				Identifier pid = cast(Identifier)packages.data[i];
+				Dsymbol p = dst.lookup(pid);
+				if (!p)
+				{
+					p = new Package(pid);
+					dst.insert(p);
+					p.parent = parent;
+					(cast(ScopeDsymbol)p).symtab = new DsymbolTable();
+				}
+				else
+				{
+					assert(p.isPackage());
+version (TARGET_NET) {		//dot net needs modules and packages with same name
+} else {
+					if (p.isModule())
+					{   
+						p.error("module and package have the same name");
+						fatal();
+						break;
+					}
+}
+				}
+				parent = p;
+				dst = (cast(Package)p).symtab;
+				if (ppkg && !*ppkg)
+					*ppkg = cast(Package)p;
+			}
+			if (pparent)
+			{
+				*pparent = parent;
+			}
+		}
+		return dst;
+	}
+
+    Package isPackage() { return this; }
+
+    void semantic(Scope sc) { }
+}
\ No newline at end of file