annotate gcc/d/dmd/dimport.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 /* Compiler implementation of the D programming language
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * written by Walter Bright
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * http://www.digitalmars.com
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 * http://www.boost.org/LICENSE_1_0.txt
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 * https://github.com/D-Programming-Language/dmd/blob/master/src/import.c
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 #include "root/dsystem.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 #include "root/root.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #include "mars.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #include "dsymbol.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 #include "import.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 #include "identifier.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 #include "module.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 #include "scope.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #include "mtype.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #include "declaration.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include "id.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #include "attrib.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #include "hdrgen.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 /********************************* Import ****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 Import::Import(Loc loc, Identifiers *packages, Identifier *id, Identifier *aliasId,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 int isstatic)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 : Dsymbol(NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 assert(id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 this->loc = loc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 this->packages = packages;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 this->id = id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 this->aliasId = aliasId;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 this->isstatic = isstatic;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 this->protection = Prot(PROTprivate); // default to private
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 this->pkg = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 this->mod = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 // Set symbol name (bracketed)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 if (aliasId)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 // import [cstdio] = std.stdio;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 this->ident = aliasId;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 else if (packages && packages->dim)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 // import [std].stdio;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 this->ident = (*packages)[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 // import [foo];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 this->ident = id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 void Import::addAlias(Identifier *name, Identifier *alias)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 if (isstatic)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 error("cannot have an import bind list");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 if (!aliasId)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 this->ident = NULL; // make it an anonymous import
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 names.push(name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 aliases.push(alias);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 const char *Import::kind() const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 return isstatic ? "static import" : "import";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 Prot Import::prot()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 return protection;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 Dsymbol *Import::syntaxCopy(Dsymbol *s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 assert(!s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 Import *si = new Import(loc, packages, id, aliasId, isstatic);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 for (size_t i = 0; i < names.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 si->addAlias(names[i], aliases[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 return si;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 void Import::load(Scope *sc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 //printf("Import::load('%s') %p\n", toPrettyChars(), this);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 // See if existing module
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 DsymbolTable *dst = Package::resolve(packages, NULL, &pkg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 Dsymbol *s = dst->lookup(id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 if (s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 if (s->isModule())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 mod = (Module *)s;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 if (s->isAliasDeclaration())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 ::error(loc, "%s %s conflicts with %s", s->kind(), s->toPrettyChars(), id->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 else if (Package *p = s->isPackage())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 if (p->isPkgMod == PKGunknown)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 mod = Module::load(loc, packages, id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 if (!mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 p->isPkgMod = PKGpackage;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 // mod is a package.d, or a normal module which conflicts with the package name.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 assert(mod->isPackageFile == (p->isPkgMod == PKGmodule));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 if (mod->isPackageFile)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 mod->tag = p->tag; // reuse the same package tag
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 mod = p->isPackageMod();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 if (!mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 ::error(loc, "can only import from a module, not from package %s.%s",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 p->toPrettyChars(), id->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 else if (pkg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 ::error(loc, "can only import from a module, not from package %s.%s",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 pkg->toPrettyChars(), id->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 ::error(loc, "can only import from a module, not from package %s",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 id->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 if (!mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 // Load module
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 mod = Module::load(loc, packages, id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 if (mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 dst->insert(id, mod); // id may be different from mod->ident,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 // if so then insert alias
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 if (mod && !mod->importedFrom)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 mod->importedFrom = sc ? sc->_module->importedFrom : Module::rootModule;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 if (!pkg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 pkg = mod;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 //printf("-Import::load('%s'), pkg = %p\n", toChars(), pkg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 void Import::importAll(Scope *sc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 if (!mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 load(sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 if (mod) // if successfully loaded module
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 mod->importAll(NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 if (mod->md && mod->md->isdeprecated)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 Expression *msg = mod->md->msg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 if (StringExp *se = msg ? msg->toStringExp() : NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 mod->deprecation(loc, "is deprecated - %s", se->string);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 mod->deprecation(loc, "is deprecated");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 if (sc->explicitProtection)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 protection = sc->protection;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 if (!isstatic && !aliasId && !names.dim)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 sc->scopesym->importScope(mod, protection);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 void Import::semantic(Scope *sc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 //printf("Import::semantic('%s') %s\n", toPrettyChars(), id->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 if (semanticRun > PASSinit)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 if (_scope)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 sc = _scope;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 _scope = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 if (!sc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 semanticRun = PASSsemantic;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 // Load if not already done so
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 if (!mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 load(sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 if (mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 mod->importAll(NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 if (mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 // Modules need a list of each imported module
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 //printf("%s imports %s\n", sc->_module->toChars(), mod->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 sc->_module->aimports.push(mod);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 if (sc->explicitProtection)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 protection = sc->protection;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 if (!aliasId && !names.dim) // neither a selective nor a renamed import
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 ScopeDsymbol *scopesym = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 if (sc->explicitProtection)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 protection = sc->protection.kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 for (Scope *scd = sc; scd; scd = scd->enclosing)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 if (!scd->scopesym)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 scopesym = scd->scopesym;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 if (!isstatic)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 scopesym->importScope(mod, protection);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 // Mark the imported packages as accessible from the current
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 // scope. This access check is necessary when using FQN b/c
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 // we're using a single global package tree. See Bugzilla 313.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 if (packages)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 // import a.b.c.d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 Package *p = pkg; // a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 scopesym->addAccessiblePackage(p, protection);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 for (size_t i = 1; i < packages->dim; i++) // [b, c]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 Identifier *id = (*packages)[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 p = (Package *) p->symtab->lookup(id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 scopesym->addAccessiblePackage(p, protection);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 scopesym->addAccessiblePackage(mod, protection); // d
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 mod->semantic(NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 if (mod->needmoduleinfo)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 //printf("module4 %s because of %s\n", sc->_module->toChars(), mod->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 sc->_module->needmoduleinfo = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 sc = sc->push(mod);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 sc->protection = protection;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 for (size_t i = 0; i < aliasdecls.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 AliasDeclaration *ad = aliasdecls[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 //printf("\tImport %s alias %s = %s, scope = %p\n", toPrettyChars(), aliases[i]->toChars(), names[i]->toChars(), ad->_scope);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 if (mod->search(loc, names[i]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 ad->semantic(sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 // If the import declaration is in non-root module,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 // analysis of the aliased symbol is deferred.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 // Therefore, don't see the ad->aliassym or ad->type here.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 Dsymbol *s = mod->search_correct(names[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 if (s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 mod->error(loc, "import '%s' not found, did you mean %s '%s'?", names[i]->toChars(), s->kind(), s->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 mod->error(loc, "import '%s' not found", names[i]->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 ad->type = Type::terror;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 sc = sc->pop();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 semanticRun = PASSsemanticdone;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 // object self-imports itself, so skip that (Bugzilla 7547)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 // don't list pseudo modules __entrypoint.d, __main.d (Bugzilla 11117, 11164)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 if (global.params.moduleDeps != NULL &&
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 !(id == Id::object && sc->_module->ident == Id::object) &&
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 sc->_module->ident != Id::entrypoint &&
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 strcmp(sc->_module->ident->toChars(), "__main") != 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 /* The grammar of the file is:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 * ImportDeclaration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 * ::= BasicImportDeclaration [ " : " ImportBindList ] [ " -> "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 * ModuleAliasIdentifier ] "\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 * BasicImportDeclaration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 * ::= ModuleFullyQualifiedName " (" FilePath ") : " Protection|"string"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 * " [ " static" ] : " ModuleFullyQualifiedName " (" FilePath ")"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 * FilePath
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 * - any string with '(', ')' and '\' escaped with the '\' character
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 OutBuffer *ob = global.params.moduleDeps;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 Module* imod = sc->instantiatingModule();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 if (!global.params.moduleDepsFile)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 ob->writestring("depsImport ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 ob->writestring(imod->toPrettyChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 ob->writestring(" (");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 escapePath(ob, imod->srcfile->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 ob->writestring(") : ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 // use protection instead of sc->protection because it couldn't be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 // resolved yet, see the comment above
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 protectionToBuffer(ob, protection);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 ob->writeByte(' ');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 if (isstatic)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 stcToBuffer(ob, STCstatic);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 ob->writeByte(' ');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 ob->writestring(": ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 if (packages)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 for (size_t i = 0; i < packages->dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 Identifier *pid = (*packages)[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 ob->printf("%s.", pid->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 ob->writestring(id->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 ob->writestring(" (");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 if (mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 escapePath(ob, mod->srcfile->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 ob->writestring("???");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 ob->writeByte(')');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 for (size_t i = 0; i < names.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 ob->writeByte(':');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 ob->writeByte(',');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 Identifier *name = names[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 Identifier *alias = aliases[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 if (!alias)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 ob->printf("%s", name->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 alias = name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 ob->printf("%s=%s", alias->toChars(), name->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 if (aliasId)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 ob->printf(" -> %s", aliasId->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 ob->writenl();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 //printf("-Import::semantic('%s'), pkg = %p\n", toChars(), pkg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 void Import::semantic2(Scope *sc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 //printf("Import::semantic2('%s')\n", toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 if (mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 mod->semantic2(NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 if (mod->needmoduleinfo)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 //printf("module5 %s because of %s\n", sc->_module->toChars(), mod->toChars());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 if (sc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 sc->_module->needmoduleinfo = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 Dsymbol *Import::toAlias()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 if (aliasId)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 return mod;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 return this;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 /*****************************
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 * Add import to sd's symbol table.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 void Import::addMember(Scope *sc, ScopeDsymbol *sd)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 //printf("Import::addMember(this=%s, sd=%s, sc=%p)\n", toChars(), sd->toChars(), sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 if (names.dim == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 return Dsymbol::addMember(sc, sd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 if (aliasId)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 Dsymbol::addMember(sc, sd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 /* Instead of adding the import to sd's symbol table,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 * add each of the alias=name pairs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 for (size_t i = 0; i < names.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 Identifier *name = names[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 Identifier *alias = aliases[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 if (!alias)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 alias = name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 TypeIdentifier *tname = new TypeIdentifier(loc, name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 AliasDeclaration *ad = new AliasDeclaration(loc, alias, tname);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 ad->_import = this;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 ad->addMember(sc, sd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 aliasdecls.push(ad);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 void Import::setScope(Scope *sc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 Dsymbol::setScope(sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 if (aliasdecls.dim)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 if (!mod)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 importAll(sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 sc = sc->push(mod);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 sc->protection = protection;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 for (size_t i = 0; i < aliasdecls.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 AliasDeclaration *ad = aliasdecls[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 ad->setScope(sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 sc = sc->pop();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 Dsymbol *Import::search(const Loc &loc, Identifier *ident, int flags)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 //printf("%s.Import::search(ident = '%s', flags = x%x)\n", toChars(), ident->toChars(), flags);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 if (!pkg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 load(NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 mod->importAll(NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 mod->semantic(NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 // Forward it to the package/module
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 return pkg->search(loc, ident, flags);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 bool Import::overloadInsert(Dsymbol *s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 /* Allow multiple imports with the same package base, but disallow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 * alias collisions (Bugzilla 5412).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 assert(ident && ident == s->ident);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 Import *imp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 if (!aliasId && (imp = s->isImport()) != NULL && !imp->aliasId)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 }