annotate dmd/dsymbol.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents 9bf06e02070b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
2 // Compiler implementation of the D programming language
1640
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
3 // Copyright (c) 1999-2010 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
11 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
12 #include <string.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
13 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
14
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 946
diff changeset
15 #include "rmem.h"
1640
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
16 #include "speller.h"
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
17
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
18 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
19 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
20 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
21 #include "identifier.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
22 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
23 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
24 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
25 #include "statement.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
26 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
27 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
28 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
29 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
30 #include "import.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
31 #include "template.h"
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
32 #include "attrib.h"
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1607
diff changeset
33 #if IN_LLVM
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
34 #include "../gen/enums.h"
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1607
diff changeset
35 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
36
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
37 /****************************** Dsymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
38
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
39 Dsymbol::Dsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
40 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
41 //printf("Dsymbol::Dsymbol(%p)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
42 this->ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
43 this->c_ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
44 this->parent = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
45 #if IN_DMD
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
46 this->csym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
47 this->isym = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
48 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
49 this->loc = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
50 this->comment = NULL;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
51 this->scope = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
52 #if IN_LLVM
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
53 this->llvmInternal = LLVMnone;
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
54 this->irsym = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
55 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
56 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
57
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
58 Dsymbol::Dsymbol(Identifier *ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
59 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
60 //printf("Dsymbol::Dsymbol(%p, ident)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
61 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
62 this->c_ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
63 this->parent = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
64 #if IN_DMD
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
65 this->csym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
66 this->isym = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
67 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
68 this->loc = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
69 this->comment = NULL;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
70 this->scope = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
71 #if IN_LLVM
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
72 this->llvmInternal = LLVMnone;
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
73 this->irsym = NULL;
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
74 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
75 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
76
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
77 int Dsymbol::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
78 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
79
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
80 if (this == o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
81 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
82 s = (Dsymbol *)(o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
83 if (s && ident->equals(s->ident))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
84 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
85 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
86 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
87
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
88 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
89 * Copy the syntax.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
90 * Used for template instantiations.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
91 * If s is NULL, allocate the new object, otherwise fill it in.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
92 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
93
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
94 Dsymbol *Dsymbol::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
95 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
96 print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
97 printf("%s %s\n", kind(), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
98 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
99 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
100 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
101
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
102 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
103 * Determine if this symbol is only one.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
104 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
105 * FALSE, *ps = NULL: There are 2 or more symbols
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
106 * TRUE, *ps = NULL: There are zero symbols
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
107 * TRUE, *ps = symbol: The one and only one symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
108 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
109
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
110 int Dsymbol::oneMember(Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
111 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
112 //printf("Dsymbol::oneMember()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
113 *ps = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
114 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
115 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
116
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
117 /*****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
118 * Same as Dsymbol::oneMember(), but look at an array of Dsymbols.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
119 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
120
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
121 int Dsymbol::oneMembers(Array *members, Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
122 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
123 //printf("Dsymbol::oneMembers() %d\n", members ? members->dim : 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
124 Dsymbol *s = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
125
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
126 if (members)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
127 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
128 for (int i = 0; i < members->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
129 { Dsymbol *sx = (Dsymbol *)members->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
130
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
131 int x = sx->oneMember(ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
132 //printf("\t[%d] kind %s = %d, s = %p\n", i, sx->kind(), x, *ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
133 if (!x)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
134 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
135 //printf("\tfalse 1\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
136 assert(*ps == NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
137 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
138 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
139 if (*ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
140 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
141 if (s) // more than one symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
142 { *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
143 //printf("\tfalse 2\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
144 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
145 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
146 s = *ps;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
147 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
148 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
149 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
150 *ps = s; // s is the one symbol, NULL if none
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
151 //printf("\ttrue\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
152 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
153 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
154
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
155 /*****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
156 * Is Dsymbol a variable that contains pointers?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
157 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
158
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
159 int Dsymbol::hasPointers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
160 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
161 //printf("Dsymbol::hasPointers() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
162 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
163 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
164
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
165 char *Dsymbol::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
166 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
167 return ident ? ident->toChars() : (char *)"__anonymous";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
168 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
169
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
170 const char *Dsymbol::toPrettyChars()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
171 { Dsymbol *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
172 char *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
173 char *q;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
174 size_t len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
175
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
176 //printf("Dsymbol::toPrettyChars() '%s'\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
177 if (!parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
178 return toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
179
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
180 len = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
181 for (p = this; p; p = p->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
182 len += strlen(p->toChars()) + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
183
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
184 s = (char *)mem.malloc(len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
185 q = s + len - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
186 *q = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
187 for (p = this; p; p = p->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
188 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
189 char *t = p->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
190 len = strlen(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
191 q -= len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
192 memcpy(q, t, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
193 if (q == s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
194 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
195 q--;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
196 #if TARGET_NET
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
197 if (AggregateDeclaration* ad = p->isAggregateDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
198 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
199 if (ad->isNested() && p->parent && p->parent->isAggregateDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
200 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
201 *q = '/';
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
202 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
203 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
204 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
205 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
206 *q = '.';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
207 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
208 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
209 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
210
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
211 char *Dsymbol::locToChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
212 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
213 OutBuffer buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
214 char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
215
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
216 Module *m = getModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
218 if (m && m->srcfile)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
219 loc.filename = m->srcfile->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
220 return loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
221 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
222
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
223 const char *Dsymbol::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
224 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
225 return "symbol";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
226 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
227
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
228 /*********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
229 * If this symbol is really an alias for another,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
230 * return that other.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
231 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
232
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
233 Dsymbol *Dsymbol::toAlias()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
234 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
235 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
236 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
237
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
238 Dsymbol *Dsymbol::toParent()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
239 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
240 return parent ? parent->pastMixin() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
241 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
242
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
243 Dsymbol *Dsymbol::pastMixin()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
244 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
245 Dsymbol *s = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
246
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
247 //printf("Dsymbol::pastMixin() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
248 while (s && s->isTemplateMixin())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
249 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
250 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
251 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
252
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
253 /**********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
254 * Use this instead of toParent() when looking for the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
255 * 'this' pointer of the enclosing function/class.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
256 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
257
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
258 Dsymbol *Dsymbol::toParent2()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
259 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
260 Dsymbol *s = parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
261 while (s && s->isTemplateInstance())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
262 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
263 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
264 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
265
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
266 TemplateInstance *Dsymbol::inTemplateInstance()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
267 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
268 for (Dsymbol *parent = this->parent; parent; parent = parent->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
269 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
270 TemplateInstance *ti = parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
271 if (ti)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
272 return ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
273 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
274 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
275 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
276
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
277 int Dsymbol::isAnonymous()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
278 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
279 return ident ? 0 : 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
280 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
281
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
282 /*************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
283 * Set scope for future semantic analysis so we can
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
284 * deal better with forward references.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
285 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
286
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
287 void Dsymbol::setScope(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
288 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
289 //printf("Dsymbol::setScope() %p %s\n", this, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
290 if (!sc->nofree)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
291 sc->setNoFree(); // may need it even after semantic() finishes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
292 scope = sc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
293 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
294
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
295 void Dsymbol::importAll(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
296 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
297 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
298
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
299 /*************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
300 * Does semantic analysis on the public face of declarations.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
301 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
302
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
303 void Dsymbol::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
304 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
305 error("%p has no semantic routine", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
306 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
307
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
308 /*************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
309 * Does semantic analysis on initializers and members of aggregates.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
310 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
311
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
312 void Dsymbol::semantic2(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
313 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
314 // Most Dsymbols have no further semantic analysis needed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
315 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
316
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
317 /*************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
318 * Does semantic analysis on function bodies.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
319 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
320
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
321 void Dsymbol::semantic3(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
322 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
323 // Most Dsymbols have no further semantic analysis needed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
324 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
325
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
326 /*************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
327 * Look for function inlining possibilities.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
328 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
329
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
330 void Dsymbol::inlineScan()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
331 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
332 // Most Dsymbols aren't functions
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
333 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
334
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
335 /*********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
336 * Search for ident as member of s.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
337 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
338 * flags: 1 don't find private members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
339 * 2 don't give error messages
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
340 * 4 return NULL if ambiguous
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
341 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
342 * NULL if not found
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
343 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
344
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
345 Dsymbol *Dsymbol::search(Loc loc, Identifier *ident, int flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
346 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
347 //printf("Dsymbol::search(this=%p,%s, ident='%s')\n", this, toChars(), ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
348 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
349 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
350
1640
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
351 /***************************************************
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
352 * Search for symbol with correct spelling.
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
353 */
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
354
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
355 void *symbol_search_fp(void *arg, const char *seed)
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
356 {
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
357 Dsymbol *s = (Dsymbol *)arg;
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
358 Identifier id(seed, 0);
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
359 Module::clearCache();
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
360 s = s->search(0, &id, 4|2);
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
361 return s;
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
362 }
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
363
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
364 Dsymbol *Dsymbol::search_correct(Identifier *ident)
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
365 {
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
366 if (global.gag)
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
367 return NULL; // don't do it for speculative compiles; too time consuming
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
368
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
369 return (Dsymbol *)speller(ident->toChars(), &symbol_search_fp, this, idchars);
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
370 }
9bf06e02070b Merge DMD 1.057.
Christian Kamm <kamm incasoftware de>
parents: 1630
diff changeset
371
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
372 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
373 * Search for identifier id as a member of 'this'.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
374 * id may be a template instance.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
375 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
376 * symbol found, NULL if not
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
377 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
378
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
379 Dsymbol *Dsymbol::searchX(Loc loc, Scope *sc, Identifier *id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
380 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
381 //printf("Dsymbol::searchX(this=%p,%s, ident='%s')\n", this, toChars(), ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
382 Dsymbol *s = toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
383 Dsymbol *sm;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
384
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
385 switch (id->dyncast())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
386 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
387 case DYNCAST_IDENTIFIER:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
388 sm = s->search(loc, id, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
389 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
390
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
391 case DYNCAST_DSYMBOL:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
392 { // It's a template instance
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
393 //printf("\ttemplate instance id\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
394 Dsymbol *st = (Dsymbol *)id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
395 TemplateInstance *ti = st->isTemplateInstance();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
396 id = ti->name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
397 sm = s->search(loc, id, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
398 if (!sm)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
399 { error("template identifier %s is not a member of %s %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
400 id->toChars(), s->kind(), s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
401 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
402 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
403 sm = sm->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
404 TemplateDeclaration *td = sm->isTemplateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
405 if (!td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
406 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
407 error("%s is not a template, it is a %s", id->toChars(), sm->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
408 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
409 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
410 ti->tempdecl = td;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
411 if (!ti->semanticRun)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
412 ti->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
413 sm = ti->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
414 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
415 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
416
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
417 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
418 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
419 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
420 return sm;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
421 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
422
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
423 int Dsymbol::overloadInsert(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
424 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
425 //printf("Dsymbol::overloadInsert('%s')\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
426 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
427 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
428
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
429 void Dsymbol::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
430 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
431 buf->writestring(toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
432 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
433
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
434 unsigned Dsymbol::size(Loc loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
435 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
436 error("Dsymbol '%s' has no size\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
437 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
438 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
439
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
440 int Dsymbol::isforwardRef()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
441 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
442 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
443 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
444
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
445 AggregateDeclaration *Dsymbol::isThis()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
446 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
447 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
448 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
449
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
450 ClassDeclaration *Dsymbol::isClassMember() // are we a member of a class?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
451 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
452 Dsymbol *parent = toParent();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
453 if (parent && parent->isClassDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
454 return (ClassDeclaration *)parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
455 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
456 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
457
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
458 void Dsymbol::defineRef(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
459 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
460 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
461 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
462
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
463 int Dsymbol::isExport()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
464 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
465 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
466 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
467
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
468 int Dsymbol::isImportedSymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
469 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
470 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
471 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
472
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
473 int Dsymbol::isDeprecated()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
474 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
475 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
476 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
477
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
478 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
479 int Dsymbol::isOverloadable()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
480 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
481 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
482 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
483 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
484
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
485 LabelDsymbol *Dsymbol::isLabel() // is this a LabelDsymbol()?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
486 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
487 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
488 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
489
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
490 AggregateDeclaration *Dsymbol::isMember() // is this a member of an AggregateDeclaration?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
491 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
492 //printf("Dsymbol::isMember() %s\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
493 Dsymbol *parent = toParent();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
494 //printf("parent is %s %s\n", parent->kind(), parent->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
495 return parent ? parent->isAggregateDeclaration() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
496 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
497
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
498 Type *Dsymbol::getType()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
499 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
500 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
501 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
502
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
503 int Dsymbol::needThis()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
504 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
505 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
506 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
507
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
508 int Dsymbol::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
509 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
510 //printf("Dsymbol::addMember('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
511 //printf("Dsymbol::addMember(this = %p, '%s' scopesym = '%s')\n", this, toChars(), sd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
512 //printf("Dsymbol::addMember(this = %p, '%s' sd = %p, sd->symtab = %p)\n", this, toChars(), sd, sd->symtab);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
513 parent = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
514 if (!isAnonymous()) // no name, so can't add it to symbol table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
515 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
516 if (!sd->symtabInsert(this)) // if name is already defined
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
517 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
518 Dsymbol *s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
519
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
520 s2 = sd->symtab->lookup(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
521 if (!s2->overloadInsert(this))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
522 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
523 sd->multiplyDefined(0, this, s2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
524 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
525 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
526 if (sd->isAggregateDeclaration() || sd->isEnumDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
527 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
528 if (ident == Id::__sizeof || ident == Id::alignof || ident == Id::mangleof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
529 error(".%s property cannot be redefined", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
530 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
531 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
532 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
533 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
534 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
535
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
536 void Dsymbol::error(const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
537 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
538 //printf("Dsymbol::error()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
539 if (!global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
540 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
541 char *p = locToChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
542
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
543 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
544 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
545 mem.free(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
546
427
f1d37dc5d354 Give errors originating from Dsymbol::error the proper 'Error:' heading.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
547 fprintf(stdmsg, "Error: ");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
548 if (isAnonymous())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
549 fprintf(stdmsg, "%s ", kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
550 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
551 fprintf(stdmsg, "%s %s ", kind(), toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
552
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
553 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
554 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
555 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
556 va_end(ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
557
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
558 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
559 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
560 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
561 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
562
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
563 //fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
564 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
565
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
566 void Dsymbol::error(Loc loc, const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
567 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
568 if (!global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
569 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
570 char *p = loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
571 if (!*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
572 p = locToChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
573
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
574 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
575 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
576 mem.free(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
577
427
f1d37dc5d354 Give errors originating from Dsymbol::error the proper 'Error:' heading.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
578 fprintf(stdmsg, "Error: ");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
579 fprintf(stdmsg, "%s %s ", kind(), toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
580
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
581 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
582 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
583 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
584 va_end(ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
585
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
586 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
587 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
588 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
589
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
590 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
591
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
592 //fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
593 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
594
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
595 void Dsymbol::checkDeprecated(Loc loc, Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
596 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
597 if (!global.params.useDeprecated && isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
598 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
599 // Don't complain if we're inside a deprecated symbol's scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
600 for (Dsymbol *sp = sc->parent; sp; sp = sp->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
601 { if (sp->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
602 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
603 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
604
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
605 for (; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
606 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
607 if (sc->scopesym && sc->scopesym->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
608 return;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
609
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
610 // If inside a StorageClassDeclaration that is deprecated
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
611 if (sc->stc & STCdeprecated)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
612 return;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
613 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
614
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
615 error(loc, "is deprecated");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
616 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
617 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
618
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
619 /**********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
620 * Determine which Module a Dsymbol is in.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
621 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
622
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
623 Module *Dsymbol::getModule()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
624 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
625 Module *m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
626 Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
627
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
628 //printf("Dsymbol::getModule()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
629 s = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
630 while (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
631 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
632 //printf("\ts = '%s'\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
633 m = s->isModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
634 if (m)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
635 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
636 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
637 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
638 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
639 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
640
946
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
641
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
642 /**********************************
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
643 * Determine which Module a Dsymbol will be compiled in.
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
644 * This may be different from getModule for templates.
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
645 */
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
646
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
647 Module *Dsymbol::getCompilationModule()
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
648 {
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
649 Module *m;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
650 TemplateInstance *ti;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
651 Dsymbol *s;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
652
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
653 //printf("Dsymbol::getModule()\n");
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
654 s = this;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
655 while (s)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
656 {
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
657 //printf("\ts = '%s'\n", s->toChars());
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
658 m = s->isModule();
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
659 if (m)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
660 return m;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
661 ti = s->isTemplateInstance();
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
662 if (ti && ti->tmodule)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
663 return ti->tmodule;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
664 s = s->parent;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
665 }
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
666 return NULL;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
667 }
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 626
diff changeset
668
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
669 /*************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
670 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
671
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
672 enum PROT Dsymbol::prot()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
673 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
674 return PROTpublic;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
675 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
676
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
677 /*************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
678 * Do syntax copy of an array of Dsymbol's.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
679 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
680
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
681
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
682 Array *Dsymbol::arraySyntaxCopy(Array *a)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
683 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
684
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
685 Array *b = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
686 if (a)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
687 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
688 b = a->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
689 for (int i = 0; i < b->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
690 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
691 Dsymbol *s = (Dsymbol *)b->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
692
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
693 s = s->syntaxCopy(NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
694 b->data[i] = (void *)s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
695 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
696 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
697 return b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
698 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
699
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
700
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
701 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
702 * Add documentation comment to Dsymbol.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
703 * Ignore NULL comments.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
704 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
705
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
706 void Dsymbol::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
707 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
708 //if (comment)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
709 //printf("adding comment '%s' to symbol %p '%s'\n", comment, this, toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
710
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
711 if (!this->comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
712 this->comment = comment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
713 #if 1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
714 else if (comment && strcmp((char *)comment, (char *)this->comment))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
715 { // Concatenate the two
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
716 this->comment = Lexer::combineComments(this->comment, comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
717 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
718 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
719 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
720
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
721 /********************************* OverloadSet ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
722
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
723 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
724 OverloadSet::OverloadSet()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
725 : Dsymbol()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
726 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
727 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
728
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
729 void OverloadSet::push(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
730 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
731 a.push(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
732 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
733
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
734 const char *OverloadSet::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
735 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
736 return "overloadset";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
737 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
738 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
739
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
740
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
741 /********************************* ScopeDsymbol ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
742
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
743 ScopeDsymbol::ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
744 : Dsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
745 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
746 members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
747 symtab = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
748 imports = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
749 prots = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
750 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
751
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
752 ScopeDsymbol::ScopeDsymbol(Identifier *id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
753 : Dsymbol(id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
754 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
755 members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
756 symtab = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
757 imports = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
758 prots = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
759 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
760
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
761 Dsymbol *ScopeDsymbol::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
762 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
763 //printf("ScopeDsymbol::syntaxCopy('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
764
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
765 ScopeDsymbol *sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
766 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
767 sd = (ScopeDsymbol *)s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
768 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
769 sd = new ScopeDsymbol(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
770 sd->members = arraySyntaxCopy(members);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
771 return sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
772 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
773
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
774 Dsymbol *ScopeDsymbol::search(Loc loc, Identifier *ident, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
775 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
776 //printf("%s->ScopeDsymbol::search(ident='%s', flags=x%x)\n", toChars(), ident->toChars(), flags);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
777 //if (strcmp(ident->toChars(),"c") == 0) *(char*)0=0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
778
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
779 // Look in symbols declared in this module
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
780 Dsymbol *s = symtab ? symtab->lookup(ident) : NULL;
626
e83ba4ae4878 Fix import visibility bugs 313 and 314.
Christian Kamm <kamm incasoftware de>
parents: 443
diff changeset
781
1358
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1147
diff changeset
782 // hide the aliases generated by selective or renamed private imports
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1147
diff changeset
783 if (s && flags & 1)
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1147
diff changeset
784 if (AliasDeclaration* ad = s->isAliasDeclaration())
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1147
diff changeset
785 // may be a private alias to a function that is overloaded. these
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1147
diff changeset
786 // are sorted out during overload resolution, accept them here
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1147
diff changeset
787 if (ad->importprot == PROTprivate && !ad->aliassym->isFuncAliasDeclaration())
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1147
diff changeset
788 s = NULL;
626
e83ba4ae4878 Fix import visibility bugs 313 and 314.
Christian Kamm <kamm incasoftware de>
parents: 443
diff changeset
789
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
790 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
791 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
792 //printf("\ts = '%s.%s'\n",toChars(),s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
793 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
794 else if (imports)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
795 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
796 // Look in imported modules
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
797 for (int i = 0; i < imports->dim; i++)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
798 { ScopeDsymbol *ss = (ScopeDsymbol *)imports->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
799 Dsymbol *s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
800
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
801 // If private import, don't search it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
802 if (flags & 1 && prots[i] == PROTprivate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
803 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
804
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
805 //printf("\tscanning import '%s', prots = %d, isModule = %p, isImport = %p\n", ss->toChars(), prots[i], ss->isModule(), ss->isImport());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
806 /* Don't find private members if ss is a module
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
807 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
808 s2 = ss->search(loc, ident, ss->isModule() ? 1 : 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
809 if (!s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
810 s = s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
811 else if (s2 && s != s2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
812 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
813 if (s->toAlias() == s2->toAlias())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
814 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
815 /* After following aliases, we found the same symbol,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
816 * so it's not an ambiguity.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
817 * But if one alias is deprecated, prefer the other.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
818 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
819 if (s->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
820 s = s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
821 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
822 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
823 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
824 /* Two imports of the same module should be regarded as
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
825 * the same.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
826 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
827 Import *i1 = s->isImport();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
828 Import *i2 = s2->isImport();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
829 if (!(i1 && i2 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
830 (i1->mod == i2->mod ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
831 (!i1->parent->isImport() && !i2->parent->isImport() &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
832 i1->ident->equals(i2->ident))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
833 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
834 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
835 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
836 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
837 ss->multiplyDefined(loc, s, s2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
838 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
839 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
840 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
841 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
842 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
843 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
844 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
845 Declaration *d = s->isDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
846 if (d && d->protection == PROTprivate && !d->parent->isTemplateMixin())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
847 error("%s is private", d->toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
848 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
849 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
850 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
851 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
852
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
853 void ScopeDsymbol::importScope(ScopeDsymbol *s, enum PROT protection)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
854 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
855 //printf("%s->ScopeDsymbol::importScope(%s, %d)\n", toChars(), s->toChars(), protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
856
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
857 // No circular or redundant import's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
858 if (s != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
859 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
860 if (!imports)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
861 imports = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
862 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
863 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
864 for (int i = 0; i < imports->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
865 { ScopeDsymbol *ss;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
866
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
867 ss = (ScopeDsymbol *) imports->data[i];
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
868 if (ss == s) // if already imported
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
869 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
870 if (protection > prots[i])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
871 prots[i] = protection; // upgrade access
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
872 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
873 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
874 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
875 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
876 imports->push(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
877 prots = (unsigned char *)mem.realloc(prots, imports->dim * sizeof(prots[0]));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
878 prots[imports->dim - 1] = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
879 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
880 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
881
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
882 int ScopeDsymbol::isforwardRef()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
883 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
884 return (members == NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
885 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
886
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
887 void ScopeDsymbol::defineRef(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
888 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
889 ScopeDsymbol *ss;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
890
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
891 ss = s->isScopeDsymbol();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
892 members = ss->members;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
893 ss->members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
894 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
895
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
896 void ScopeDsymbol::multiplyDefined(Loc loc, Dsymbol *s1, Dsymbol *s2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
897 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
898 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
899 printf("ScopeDsymbol::multiplyDefined()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
900 printf("s1 = %p, '%s' kind = '%s', parent = %s\n", s1, s1->toChars(), s1->kind(), s1->parent ? s1->parent->toChars() : "");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
901 printf("s2 = %p, '%s' kind = '%s', parent = %s\n", s2, s2->toChars(), s2->kind(), s2->parent ? s2->parent->toChars() : "");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
902 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
903 if (loc.filename)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
904 { ::error(loc, "%s at %s conflicts with %s at %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
905 s1->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
906 s1->locToChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
907 s2->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
908 s2->locToChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
909 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
910 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
911 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
912 s1->error(loc, "conflicts with %s %s at %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
913 s2->kind(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
914 s2->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
915 s2->locToChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
916 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
917 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
918
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
919 Dsymbol *ScopeDsymbol::nameCollision(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
920 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
921 Dsymbol *sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
922
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
923 // Look to see if we are defining a forward referenced symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
924
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
925 sprev = symtab->lookup(s->ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
926 assert(sprev);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
927 if (s->equals(sprev)) // if the same symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
928 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
929 if (s->isforwardRef()) // if second declaration is a forward reference
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
930 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
931 if (sprev->isforwardRef())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
932 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
933 sprev->defineRef(s); // copy data from s into sprev
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
934 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
935 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
936 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
937 multiplyDefined(0, s, sprev);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
938 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
939 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
940
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
941 const char *ScopeDsymbol::kind()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
942 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
943 return "ScopeDsymbol";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
944 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
945
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
946 Dsymbol *ScopeDsymbol::symtabInsert(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
947 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
948 return symtab->insert(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
949 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
950
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
951 /***************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
952 * Determine number of Dsymbols, folding in AttribDeclaration members.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
953 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
954
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
955 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
956 size_t ScopeDsymbol::dim(Array *members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
957 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
958 size_t n = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
959 if (members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
960 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
961 for (size_t i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
962 { Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
963 AttribDeclaration *a = s->isAttribDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
964
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
965 if (a)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
966 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
967 n += dim(a->decl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
968 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
969 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
970 n++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
971 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
972 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
973 return n;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
974 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
975 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
976
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
977 /***************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
978 * Get nth Dsymbol, folding in AttribDeclaration members.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
979 * Returns:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
980 * Dsymbol* nth Dsymbol
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
981 * NULL not found, *pn gets incremented by the number
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
982 * of Dsymbols
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
983 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
984
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
985 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
986 Dsymbol *ScopeDsymbol::getNth(Array *members, size_t nth, size_t *pn)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
987 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
988 if (!members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
989 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
990
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
991 size_t n = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
992 for (size_t i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
993 { Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
994 AttribDeclaration *a = s->isAttribDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
995
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
996 if (a)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
997 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
998 s = getNth(a->decl, nth - n, &n);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
999 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1000 return s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1001 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1002 else if (n == nth)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1003 return s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1004 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1005 n++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1006 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1007
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1008 if (pn)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1009 *pn += n;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1010 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1011 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1012 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1013
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1014 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1015 * Look for member of the form:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1016 * const(MemberInfo)[] getMembers(string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1017 * Returns NULL if not found
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1018 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1019
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 159
diff changeset
1020 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1021 FuncDeclaration *ScopeDsymbol::findGetMembers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1022 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1023 Dsymbol *s = search_function(this, Id::getmembers);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1024 FuncDeclaration *fdx = s ? s->isFuncDeclaration() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1025
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1026 #if 0 // Finish
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1027 static TypeFunction *tfgetmembers;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1028
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1029 if (!tfgetmembers)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1030 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1031 Scope sc;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1032 Parameters *arguments = new Parameters;
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
1033 Parameters *arg = new Parameter(STCin, Type::tchar->constOf()->arrayOf(), NULL, NULL);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1034 arguments->push(arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1035
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1036 Type *tret = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1037 tfgetmembers = new TypeFunction(arguments, tret, 0, LINKd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1038 tfgetmembers = (TypeFunction *)tfgetmembers->semantic(0, &sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1039 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1040 if (fdx)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1041 fdx = fdx->overloadExactMatch(tfgetmembers);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1042 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1043 if (fdx && fdx->isVirtual())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1044 fdx = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1045
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1046 return fdx;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1047 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1048 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1049
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1050
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1051 /****************************** WithScopeSymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1052
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1053 WithScopeSymbol::WithScopeSymbol(WithStatement *withstate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1054 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1055 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1056 this->withstate = withstate;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1057 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1058
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1059 Dsymbol *WithScopeSymbol::search(Loc loc, Identifier *ident, int flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1060 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1061 // Acts as proxy to the with class declaration
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1062 return withstate->exp->type->toDsymbol(NULL)->search(loc, ident, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1063 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1064
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1065 /****************************** ArrayScopeSymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1066
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1067 ArrayScopeSymbol::ArrayScopeSymbol(Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1068 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1069 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1070 assert(e->op == TOKindex || e->op == TOKslice);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1071 exp = e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1072 type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1073 td = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1074 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1075
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1076 ArrayScopeSymbol::ArrayScopeSymbol(TypeTuple *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1077 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1078 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1079 exp = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1080 type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1081 td = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1082 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1083
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1084 ArrayScopeSymbol::ArrayScopeSymbol(TupleDeclaration *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1085 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1086 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1087 exp = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1088 type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1089 td = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1090 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1091
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1092 Dsymbol *ArrayScopeSymbol::search(Loc loc, Identifier *ident, int flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1093 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1094 //printf("ArrayScopeSymbol::search('%s', flags = %d)\n", ident->toChars(), flags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1095 if (ident == Id::length || ident == Id::dollar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1096 { VarDeclaration **pvar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1097 Expression *ce;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1098
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1099 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1100
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1101 if (td)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1102 { /* $ gives the number of elements in the tuple
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1103 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1104 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1105 Expression *e = new IntegerExp(0, td->objects->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1106 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1107 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1108 return v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1109 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1110
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1111 if (type)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1112 { /* $ gives the number of type entries in the type tuple
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1113 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1114 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1115 Expression *e = new IntegerExp(0, type->arguments->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1116 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1117 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1118 return v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1119 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1120
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1121 if (exp->op == TOKindex)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1122 { /* array[index] where index is some function of $
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1123 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1124 IndexExp *ie = (IndexExp *)exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1125
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1126 pvar = &ie->lengthVar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1127 ce = ie->e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1128 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1129 else if (exp->op == TOKslice)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1130 { /* array[lwr .. upr] where lwr or upr is some function of $
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1131 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1132 SliceExp *se = (SliceExp *)exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1133
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1134 pvar = &se->lengthVar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1135 ce = se->e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1136 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1137 else
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1138 /* Didn't find $, look in enclosing scope(s).
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1139 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1140 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1141
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1142 /* If we are indexing into an array that is really a type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1143 * tuple, rewrite this as an index into a type tuple and
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1144 * try again.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1145 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1146 if (ce->op == TOKtype)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1147 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1148 Type *t = ((TypeExp *)ce)->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1149 if (t->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1150 { type = (TypeTuple *)t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1151 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1152 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1153 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1154
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1155 /* *pvar is lazily initialized, so if we refer to $
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1156 * multiple times, it gets set only once.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1157 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1158 if (!*pvar) // if not already initialized
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1159 { /* Create variable v and set it to the value of $,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1160 * which will be a constant.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1161 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1162 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1163
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1164 if (ce->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1165 { /* It is for a string literal, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1166 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1167 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1168 Expression *e = new IntegerExp(0, ((StringExp *)ce)->len, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1169 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1170 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1171 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1172 else if (ce->op == TOKarrayliteral)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1173 { /* It is for an array literal, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1174 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1175 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1176 Expression *e = new IntegerExp(0, ((ArrayLiteralExp *)ce)->elements->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1177 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1178 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1179 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1180 else if (ce->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1181 { /* It is for an expression tuple, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1182 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1183 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1184 Expression *e = new IntegerExp(0, ((TupleExp *)ce)->exps->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1185 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1186 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1187 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1188 *pvar = v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1189 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1190 return (*pvar);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1191 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1192 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1193 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1194
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1195
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1196 /****************************** DsymbolTable ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1197
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1198 DsymbolTable::DsymbolTable()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1199 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1200 tab = new StringTable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1201 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1202
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1203 DsymbolTable::~DsymbolTable()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1204 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1205 delete tab;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1206 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1207
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1208 Dsymbol *DsymbolTable::lookup(Identifier *ident)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1209 {
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1210 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1211 assert(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1212 assert(tab);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1213 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1358
diff changeset
1214 StringValue *sv = tab->lookup((char*)ident->string, ident->len);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1215 return (Dsymbol *)(sv ? sv->ptrvalue : NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1216 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1218 Dsymbol *DsymbolTable::insert(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1219 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1220 Identifier *ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1221
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1222 //printf("DsymbolTable::insert(this = %p, '%s')\n", this, s->ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1223 ident = s->ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1224 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1225 assert(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1226 assert(tab);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1227 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1228 sv = tab->insert(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1229 if (!sv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1230 return NULL; // already in table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1231 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1232 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1233 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1234
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1235 Dsymbol *DsymbolTable::insert(Identifier *ident, Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1236 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1237
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1238 //printf("DsymbolTable::insert()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1239 sv = tab->insert(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1240 if (!sv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1241 return NULL; // already in table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1242 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1243 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1244 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1245
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1246 Dsymbol *DsymbolTable::update(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1247 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1248 Identifier *ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1249
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1250 ident = s->ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1251 sv = tab->update(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1252 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1253 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1254 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1255
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1256
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1257
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1258