Jarrett Billingsley wrote:
> On Sun, Mar 15, 2009 at 5:55 PM, Jeremie Pelletier <[email protected]> wrote:
>> I don't know if it's really a bug, but the package protection attribute
>> seems to have a different semantic in the current packages than in nested
>> packages.
>>
>> For example, say you have the module test which declares the following:
>> ---
>> module test.Foo;
>>
>> package uint myVar;
>> package class MyClass {}
>>
>> package void MyFunc();
>>
>> class Foo {
>> package void MyFoo();
>> }
>> ---
>>
>> All declarations are accessible from any module in the test package, but if
>> you try and access them from a child package, say test.somepackage.Foo, then
>> only myVar and MyClass are accessible, both MyFunc and Foo.MyFoo says they
>> aren't accessible from test.somepackage.Foo.
>>
>> I'm using the latest DMD version 2.
>>
>
> http://d.puremagic.com/issues/show_bug.cgi?id=2529
>
> Feel free to comment or vote.
A quick poke in the source code reveals a hasPackageAccess function in
access.c. Haven't tried this, but maybe the attached patch (made
against the 1.041 release) will get the desired behaviour; I just
quickly changed it to search not just the scope's package, but also its
ancestors.
-- Daniel
--- access.c 2009-03-05 01:56:46.000000000 +1100
+++ access.c 2009-03-16 10:47:56.187500000 +1100
@@ -305,12 +305,21 @@
printf("\tthis is in package '%s'\n", s->toChars());
#endif
- if (s && s == sc->module->parent)
+ if (s)
{
-#if LOG
- printf("\ts is in same package as sc\n");
-#endif
- return 1;
+ Dsymbol scp = sc->module->parent;
+ for (Dsymbol scp = sc->module->parent;
+ scp && scp->isPackage() && !scp->isModule();
+ scp = scp->parent)
+ {
+ if (s && s == scp)
+ {
+#if LOG
+ printf("\ts is in same package as or ancestor package of sc\n");
+#endif
+ return 1;
+ }
+ }
}