diff dmd/module.c @ 875:330f999ade44

Merged DMD 1.038
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 06 Jan 2009 16:33:51 +0100
parents aa953cc960b6
children 369996c08420
line wrap: on
line diff
--- a/dmd/module.c	Tue Jan 06 15:54:48 2009 +0100
+++ b/dmd/module.c	Tue Jan 06 16:33:51 2009 +0100
@@ -889,6 +889,38 @@
     //printf("-Module::runDeferredSemantic('%s'), len = %d\n", toChars(), deferred.dim);
 }
 
+/************************************
+ * Recursively look at every module this module imports,
+ * return TRUE if it imports m.
+ * Can be used to detect circular imports.
+ */
+
+int Module::imports(Module *m)
+{
+    //printf("%s Module::imports(%s)\n", toChars(), m->toChars());
+    int aimports_dim = aimports.dim;
+#if 0
+    for (int i = 0; i < aimports.dim; i++)
+    {	Module *mi = (Module *)aimports.data[i];
+	printf("\t[%d] %s\n", i, mi->toChars());
+    }
+#endif
+    for (int i = 0; i < aimports.dim; i++)
+    {	Module *mi = (Module *)aimports.data[i];
+	if (mi == m)
+	    return TRUE;
+	if (!mi->insearch)
+	{
+	    mi->insearch = 1;
+	    int r = mi->imports(m);
+	    mi->insearch = 0;
+	    if (r)
+		return r;
+	}
+    }
+    return FALSE;
+}
+
 /* =========================== ModuleDeclaration ===================== */
 
 ModuleDeclaration::ModuleDeclaration(Array *packages, Identifier *id)