2 * A scoped C++ namespace symbol
4 * D supports the following syntax to declare symbol(s) as being part of a
7 * extern (C++, "myNamespace") { /+ Symbols +/ } // String variant
8 * extern (C++, SomeNamespace) { /+ Other symbols +/ } // Identifier variant
10 * The first form is an attribute and only affects mangling, and is implemented
12 * The second form introduces a named scope and allows symbols to be refered
13 * to with or without the namespace name, much like a named template mixin,
14 * and is implemented in this module.
16 * extern (C++, Basket)
19 * void swapFood (Strawberry* f1, Strawberry* f2);
23 * Basket.StrawBerry fruit1;
25 * Basket.swapFood(fruit1, fruit2);
26 * swapFood(fruit1, fruit2);
29 * Hence the `Nspace` symbol implements the usual `ScopeDsymbol` semantics.
31 * Note that it implies `extern(C++)` so it cannot be used as a generic
32 * named scope. Additionally, `Nspace` with the same `Identifier` can be
33 * defined in different module (as C++ allows a namespace to be spread accross
34 * translation units), but symbols in it should be considered
35 * part of the same scope. Lastly, not all possible C++ namespace names
36 * are valid D identifier.
38 * See_Also: https://github.com/dlang/dmd/pull/10031
39 * Copyright: Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved
40 * Authors: $(LINK2 https://www.digitalmars.com, Walter Bright)
41 * License: $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
42 * Source: $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/nspace.d, _nspace.d)
43 * Documentation: https://dlang.org/phobos/dmd_nspace.html
44 * Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/nspace.d
49 import dmd
.arraytypes
;
51 import dmd
.expression
;
52 import dmd
.identifier
;
55 import core
.stdc
.stdio
;
58 extern (C
++) final class Nspace
: ScopeDsymbol
61 * Namespace identifier resolved during semantic.
65 extern (D
) this(const ref Loc loc
, Identifier ident
, Expression identExp
, Dsymbols
* members
)
68 //printf("Nspace::Nspace(ident = %s)\n", ident.toChars());
69 this.members
= members
;
70 this.identExp
= identExp
;
73 override Nspace
syntaxCopy(Dsymbol s
)
75 auto ns
= new Nspace(loc
, ident
, identExp
, null);
76 ScopeDsymbol
.syntaxCopy(ns
);
80 override bool hasPointers()
82 //printf("Nspace::hasPointers() %s\n", toChars());
83 return members
.foreachDsymbol( (s
) { return s
.hasPointers(); } ) != 0;
86 override const(char)* kind() const
91 override inout(Nspace
) isNspace() inout
96 override void accept(Visitor v
)