annotate dmd/dsymbol.c @ 314:8d98e42ece93 trunk

[svn r335] The basics of exception handling are in place. Still need to make sure calls are turned into invokes everywhere. (NewExpression for instance) Still some rough edges and corner cases to figure out. Needs testing!
author ChristianK
date Wed, 02 Jul 2008 22:20:18 +0200
parents 5acec6b2eef8
children aaade6ded589
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
3 // Copyright (c) 1999-2007 by Digital Mars
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
15 #include "mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
16
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
17 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
18 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
19 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
20 #include "identifier.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
21 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
22 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
23 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
24 #include "statement.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
25 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
26 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
27 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
28 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
29 #include "import.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
30 #include "template.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
31
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
32 #include "../gen/enums.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
33
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
34 /****************************** Dsymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
35
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
36 Dsymbol::Dsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
37 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
38 //printf("Dsymbol::Dsymbol(%p)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
39 this->ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
40 this->c_ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
41 this->parent = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
42 this->csym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
43 this->isym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
44 this->loc = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
45 this->comment = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
46
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
47 this->llvmInternal = LLVMnone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
48 this->llvmInternal1 = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
49 this->llvmInternal2 = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
50 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
51
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
52 Dsymbol::Dsymbol(Identifier *ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
53 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
54 //printf("Dsymbol::Dsymbol(%p, ident)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
55 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
56 this->c_ident = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
57 this->parent = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
58 this->csym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
59 this->isym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
60 this->loc = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
61 this->comment = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
62
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
63 this->llvmInternal = LLVMnone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
64 this->llvmInternal1 = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
65 this->llvmInternal2 = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
66 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
67
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
68 int Dsymbol::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
69 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
70
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
71 if (this == o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
72 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
73 s = (Dsymbol *)(o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
74 if (s && ident->equals(s->ident))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
75 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
76 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
77 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
78
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 * Copy the syntax.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
81 * Used for template instantiations.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
82 * If s is NULL, allocate the new object, otherwise fill it in.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
83 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
84
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
85 Dsymbol *Dsymbol::syntaxCopy(Dsymbol *s)
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 print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
88 printf("%s %s\n", kind(), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
89 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
90 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
91 }
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 * Determine if this symbol is only one.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
95 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
96 * FALSE, *ps = NULL: There are 2 or more symbols
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
97 * TRUE, *ps = NULL: There are zero symbols
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
98 * TRUE, *ps = symbol: The one and only one symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
99 */
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 int Dsymbol::oneMember(Dsymbol **ps)
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 //printf("Dsymbol::oneMember()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
104 *ps = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
105 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
106 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
107
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 * Same as Dsymbol::oneMember(), but look at an array of Dsymbols.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
110 */
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 int Dsymbol::oneMembers(Array *members, Dsymbol **ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
113 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
114 //printf("Dsymbol::oneMembers() %d\n", members ? members->dim : 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
115 Dsymbol *s = NULL;
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 if (members)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
118 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
119 for (int i = 0; i < members->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
120 { Dsymbol *sx = (Dsymbol *)members->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
121
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
122 int x = sx->oneMember(ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
123 //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
124 if (!x)
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 //printf("\tfalse 1\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
127 assert(*ps == NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
128 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
129 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
130 if (*ps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
131 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
132 if (s) // more than one symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
133 { *ps = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
134 //printf("\tfalse 2\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
135 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
136 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
137 s = *ps;
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 }
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 *ps = s; // s is the one symbol, NULL if none
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
142 //printf("\ttrue\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
143 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
144 }
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 /*****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
147 * Is Dsymbol a variable that contains pointers?
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 int Dsymbol::hasPointers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
151 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
152 //printf("Dsymbol::hasPointers() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
153 return 0;
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 char *Dsymbol::toChars()
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 return ident ? ident->toChars() : (char *)"__anonymous";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
159 }
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 char *Dsymbol::toPrettyChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
162 { Dsymbol *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
163 char *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
164 char *q;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
165 size_t len;
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 //printf("Dsymbol::toPrettyChars() '%s'\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
168 if (!parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
169 return toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
170
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
171 len = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
172 for (p = this; p; p = p->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
173 len += strlen(p->toChars()) + 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
174
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
175 s = (char *)mem.malloc(len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
176 q = s + len - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
177 *q = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
178 for (p = this; p; p = p->parent)
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 char *t = p->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
181 len = strlen(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
182 q -= len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
183 memcpy(q, t, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
184 if (q == s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
185 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
186 q--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
187 *q = '.';
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 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
190 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
191
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
192 char *Dsymbol::locToChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
193 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
194 OutBuffer buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
195 char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
196
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
197 Module *m = getModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
198
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
199 if (m && m->srcfile)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
200 loc.filename = m->srcfile->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
201 return loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
202 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
203
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
204 char *Dsymbol::kind()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
205 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
206 return "symbol";
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
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 * If this symbol is really an alias for another,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
211 * return that other.
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
214 Dsymbol *Dsymbol::toAlias()
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 return this;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
219 Dsymbol *Dsymbol::toParent()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
220 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
221 return parent ? parent->pastMixin() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
222 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
223
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
224 Dsymbol *Dsymbol::pastMixin()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
225 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
226 Dsymbol *s = this;
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 //printf("Dsymbol::pastMixin() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
229 while (s && s->isTemplateMixin())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
230 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
231 return s;
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
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 * Use this instead of toParent() when looking for the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
236 * 'this' pointer of the enclosing function/class.
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
239 Dsymbol *Dsymbol::toParent2()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
240 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
241 Dsymbol *s = parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
242 while (s && s->isTemplateInstance())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
243 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
244 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
245 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
248 int Dsymbol::isAnonymous()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
249 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
250 return ident ? 0 : 1;
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 void Dsymbol::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
254 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
255 error("%p has no semantic routine", this);
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 void Dsymbol::semantic2(Scope *sc)
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 // Most Dsymbols have no further semantic analysis needed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
261 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
262
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
263 void Dsymbol::semantic3(Scope *sc)
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 // Most Dsymbols have no further semantic analysis needed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
266 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
267
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
268 void Dsymbol::inlineScan()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
269 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
270 // Most Dsymbols have no further semantic analysis needed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
271 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
272
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
273 Dsymbol *Dsymbol::search(Loc loc, Identifier *ident, int flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
274 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
275 //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
276 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
277 }
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 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
280 * Search for identifier id as a member of 'this'.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
281 * id may be a template instance.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
282 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
283 * symbol found, NULL if not
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
284 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
285
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
286 Dsymbol *Dsymbol::searchX(Loc loc, Scope *sc, Identifier *id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
287 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
288 //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
289 Dsymbol *s = toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
290 Dsymbol *sm;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
291
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
292 switch (id->dyncast())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
293 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
294 case DYNCAST_IDENTIFIER:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
295 sm = s->search(loc, id, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
296 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
297
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
298 case DYNCAST_DSYMBOL:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
299 { // It's a template instance
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
300 //printf("\ttemplate instance id\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
301 Dsymbol *st = (Dsymbol *)id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
302 TemplateInstance *ti = st->isTemplateInstance();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
303 id = ti->name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
304 sm = s->search(loc, id, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
305 if (!sm)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
306 { error("template identifier %s is not a member of %s %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
307 id->toChars(), s->kind(), s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
308 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
309 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
310 sm = sm->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
311 TemplateDeclaration *td = sm->isTemplateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
312 if (!td)
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 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
315 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
316 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
317 ti->tempdecl = td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
318 if (!ti->semanticdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
319 ti->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
320 sm = ti->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
321 break;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
324 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
325 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
326 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
327 return sm;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
328 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
329
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
330 int Dsymbol::overloadInsert(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
331 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
332 //printf("Dsymbol::overloadInsert('%s')\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
333 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
334 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
335
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
336 void Dsymbol::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
337 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
338 buf->writestring(toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
339 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
340
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
341 unsigned Dsymbol::size(Loc loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
342 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
343 error("Dsymbol '%s' has no size\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
344 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
345 }
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 int Dsymbol::isforwardRef()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
348 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
349 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
350 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
351
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
352 AggregateDeclaration *Dsymbol::isThis()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
353 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
354 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
355 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
356
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
357 ClassDeclaration *Dsymbol::isClassMember() // are we a member of a class?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
358 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
359 Dsymbol *parent = toParent();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
360 if (parent && parent->isClassDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
361 return (ClassDeclaration *)parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
362 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
363 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
364
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
365 void Dsymbol::defineRef(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
366 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
367 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
368 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
369
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
370 int Dsymbol::isExport()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
371 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
372 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
373 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
374
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
375 int Dsymbol::isImportedSymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
376 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
377 return FALSE;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
380 int Dsymbol::isDeprecated()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
381 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
382 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
383 }
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 LabelDsymbol *Dsymbol::isLabel() // is this a LabelDsymbol()?
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 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
388 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
389
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
390 AggregateDeclaration *Dsymbol::isMember() // is this a member of an AggregateDeclaration?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
391 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
392 Dsymbol *parent = toParent();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
393 return parent ? parent->isAggregateDeclaration() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
394 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
395
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
396 Type *Dsymbol::getType()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
397 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
398 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
399 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
400
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
401 int Dsymbol::needThis()
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 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
404 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
405
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
406 int Dsymbol::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
407 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
408 //printf("Dsymbol::addMember('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
409 //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
410 //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
411 parent = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
412 if (!isAnonymous()) // no name, so can't add it to symbol table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
413 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
414 if (!sd->symtab->insert(this)) // if name is already defined
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 Dsymbol *s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
417
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
418 s2 = sd->symtab->lookup(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
419 if (!s2->overloadInsert(this))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
420 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
421 sd->multiplyDefined(0, this, s2);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
424 if (sd->isAggregateDeclaration() || sd->isEnumDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
425 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
426 if (ident == Id::__sizeof || ident == Id::alignof || ident == Id::mangleof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
427 error(".%s property cannot be redefined", ident->toChars());
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 return 1;
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 return 0;
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 void Dsymbol::error(const char *format, ...)
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 //printf("Dsymbol::error()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
437 if (!global.gag)
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 char *p = locToChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
440
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
441 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
442 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
443 mem.free(p);
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 if (isAnonymous())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
446 fprintf(stdmsg, "%s ", kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
447 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
448 fprintf(stdmsg, "%s %s ", kind(), toPrettyChars());
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 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
451 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
452 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
453 va_end(ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
454
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
455 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
456 fflush(stdmsg);
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 global.errors++;
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 //fatal();
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 void Dsymbol::error(Loc loc, const char *format, ...)
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 if (!global.gag)
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 char *p = loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
468 if (!*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
469 p = locToChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
470
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
471 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
472 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
473 mem.free(p);
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 fprintf(stdmsg, "%s %s ", kind(), toPrettyChars());
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 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
478 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
479 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
480 va_end(ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
481
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
482 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
483 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
484 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
485
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
486 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
487
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
488 //fatal();
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
491 void Dsymbol::checkDeprecated(Loc loc, Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
492 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
493 if (!global.params.useDeprecated && isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
494 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
495 // Don't complain if we're inside a deprecated symbol's scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
496 for (Dsymbol *sp = sc->parent; sp; sp = sp->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
497 { if (sp->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
498 return;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
501 for (; sc; sc = sc->enclosing)
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 if (sc->scopesym && sc->scopesym->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
504 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
505 }
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 error(loc, "is deprecated");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
508 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
511 /**********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
512 * Determine which Module a Dsymbol is in.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
513 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
514
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
515 Module *Dsymbol::getModule()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
516 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
517 Module *m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
518 Dsymbol *s;
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 //printf("Dsymbol::getModule()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
521 s = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
522 while (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
523 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
524 //printf("\ts = '%s'\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
525 m = s->isModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
526 if (m)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
527 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
528 s = s->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
529 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
530 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
531 }
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 /*************************************
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 enum PROT Dsymbol::prot()
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 return PROTpublic;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
539 }
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 /*************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
542 * Do syntax copy of an array of Dsymbol's.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
543 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
544
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
545
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
546 Array *Dsymbol::arraySyntaxCopy(Array *a)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
547 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
548
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
549 Array *b = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
550 if (a)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
551 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
552 b = a->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
553 for (int i = 0; i < b->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
554 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
555 Dsymbol *s = (Dsymbol *)b->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
556
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
557 s = s->syntaxCopy(NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
558 b->data[i] = (void *)s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
559 }
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 return b;
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
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 * Add documentation comment to Dsymbol.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
567 * Ignore NULL comments.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
568 */
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 void Dsymbol::addComment(unsigned char *comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
571 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
572 // if (comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
573 // printf("adding comment '%s' to symbol %p '%s'\n", comment, this, toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
574
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
575 if (!this->comment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
576 this->comment = comment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
577 #if 1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
578 else if (comment && strcmp((char *)comment, (char *)this->comment))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
579 { // Concatenate the two
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
580 this->comment = Lexer::combineComments(this->comment, comment);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
581 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
582 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
583 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
584
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 /********************************* ScopeDsymbol ****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
587
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
588 ScopeDsymbol::ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
589 : Dsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
590 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
591 members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
592 symtab = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
593 imports = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
594 prots = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
595 }
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 ScopeDsymbol::ScopeDsymbol(Identifier *id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
598 : Dsymbol(id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
599 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
600 members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
601 symtab = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
602 imports = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
603 prots = NULL;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
606 Dsymbol *ScopeDsymbol::syntaxCopy(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
607 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
608 //printf("ScopeDsymbol::syntaxCopy('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
609
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
610 ScopeDsymbol *sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
611 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
612 sd = (ScopeDsymbol *)s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
613 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
614 sd = new ScopeDsymbol(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
615 sd->members = arraySyntaxCopy(members);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
616 return sd;
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 Dsymbol *ScopeDsymbol::search(Loc loc, Identifier *ident, int flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
620 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
621 int i;
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 //printf("%s->ScopeDsymbol::search(ident='%s', flags=x%x)\n", toChars(), ident->toChars(), flags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
624 // Look in symbols declared in this module
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
625 s = symtab ? symtab->lookup(ident) : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
626 if (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("\ts = '%s.%s'\n",toChars(),s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
629 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
630 else if (imports)
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 // Look in imported modules
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
633 for (i = 0; i < imports->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
634 { ScopeDsymbol *ss = (ScopeDsymbol *)imports->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
635 Dsymbol *s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
636
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
637 // If private import, don't search it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
638 if (flags & 1 && prots[i] == PROTprivate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
639 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
640
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
641 //printf("\tscanning import '%s', prots = %d, isModule = %p, isImport = %p\n", ss->toChars(), prots[i], ss->isModule(), ss->isImport());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
642 s2 = ss->search(loc, ident, ss->isModule() ? 1 : 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
643 if (!s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
644 s = s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
645 else if (s2 && s != s2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
646 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
647 if (s->toAlias() == s2->toAlias())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
648 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
649 if (s->isDeprecated())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
650 s = s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
651 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
652 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
653 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
654 /* Two imports of the same module should be regarded as
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
655 * the same.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
656 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
657 Import *i1 = s->isImport();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
658 Import *i2 = s2->isImport();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
659 if (!(i1 && i2 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
660 (i1->mod == i2->mod ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
661 (!i1->parent->isImport() && !i2->parent->isImport() &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
662 i1->ident->equals(i2->ident))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
663 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
664 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
665 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
666 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
667 ss->multiplyDefined(loc, s, s2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
668 break;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
673 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
674 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
675 Declaration *d = s->isDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
676 if (d && d->protection == PROTprivate && !d->parent->isTemplateMixin())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
677 error("%s is private", d->toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
678 }
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 return s;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
683 void ScopeDsymbol::importScope(ScopeDsymbol *s, enum PROT protection)
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 //printf("%s->ScopeDsymbol::importScope(%s, %d)\n", toChars(), s->toChars(), protection);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
686
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
687 // No circular or redundant import's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
688 if (s != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
689 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
690 if (!imports)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
691 imports = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
692 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
693 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
694 for (int i = 0; i < imports->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
695 { ScopeDsymbol *ss;
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 ss = (ScopeDsymbol *) imports->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
698 if (ss == s)
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 if (protection > prots[i])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
701 prots[i] = protection; // upgrade access
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
702 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
703 }
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 imports->push(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
707 prots = (unsigned char *)mem.realloc(prots, imports->dim * sizeof(prots[0]));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
708 prots[imports->dim - 1] = protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
709 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
712 int ScopeDsymbol::isforwardRef()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
713 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
714 return (members == NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
715 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
716
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
717 void ScopeDsymbol::defineRef(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
718 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
719 ScopeDsymbol *ss;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
720
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
721 ss = s->isScopeDsymbol();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
722 members = ss->members;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
723 ss->members = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
724 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
725
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
726 void ScopeDsymbol::multiplyDefined(Loc loc, Dsymbol *s1, Dsymbol *s2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
727 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
728 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
729 printf("ScopeDsymbol::multiplyDefined()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
730 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
731 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
732 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
733 if (loc.filename)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
734 { ::error(loc, "%s at %s conflicts with %s at %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
735 s1->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
736 s1->locToChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
737 s2->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
738 s2->locToChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
739 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
740 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
741 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
742 s1->error(loc, "conflicts with %s %s at %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
743 s2->kind(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
744 s2->toPrettyChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
745 s2->locToChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
746 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
747 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
748
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
749 Dsymbol *ScopeDsymbol::nameCollision(Dsymbol *s)
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 Dsymbol *sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
752
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
753 // Look to see if we are defining a forward referenced symbol
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 sprev = symtab->lookup(s->ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
756 assert(sprev);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
757 if (s->equals(sprev)) // if the same symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
758 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
759 if (s->isforwardRef()) // if second declaration is a forward reference
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
760 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
761 if (sprev->isforwardRef())
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 sprev->defineRef(s); // copy data from s into sprev
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
764 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
765 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
766 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
767 multiplyDefined(0, s, sprev);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
768 return sprev;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
769 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
770
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
771 char *ScopeDsymbol::kind()
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 return "ScopeDsymbol";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
774 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
775
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
776
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
777 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
778 * Look for member of the form:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
779 * const(MemberInfo)[] getMembers(string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
780 * Returns NULL if not found
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
781 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
782
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
783 #if V2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
784 FuncDeclaration *ScopeDsymbol::findGetMembers()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
785 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
786 Dsymbol *s = search_function(this, Id::getmembers);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
787 FuncDeclaration *fdx = s ? s->isFuncDeclaration() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
788
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
789 #if 0 // Finish
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
790 static TypeFunction *tfgetmembers;
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 if (!tfgetmembers)
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 Scope sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
795 Arguments *arguments = new Arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
796 Arguments *arg = new Argument(STCin, Type::tchar->constOf()->arrayOf(), NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
797 arguments->push(arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
798
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
799 Type *tret = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
800 tfgetmembers = new TypeFunction(arguments, tret, 0, LINKd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
801 tfgetmembers = (TypeFunction *)tfgetmembers->semantic(0, &sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
802 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
803 if (fdx)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
804 fdx = fdx->overloadExactMatch(tfgetmembers);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
805 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
806 if (fdx && fdx->isVirtual())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
807 fdx = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
808
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
809 return fdx;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
810 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
811 #endif
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
814 /****************************** WithScopeSymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
815
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
816 WithScopeSymbol::WithScopeSymbol(WithStatement *withstate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
817 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
818 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
819 this->withstate = withstate;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
820 }
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 Dsymbol *WithScopeSymbol::search(Loc loc, Identifier *ident, int flags)
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 // Acts as proxy to the with class declaration
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
825 return withstate->exp->type->toDsymbol(NULL)->search(loc, ident, 0);
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
828 /****************************** ArrayScopeSymbol ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
829
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
830 ArrayScopeSymbol::ArrayScopeSymbol(Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
831 : ScopeDsymbol()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
832 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
833 assert(e->op == TOKindex || e->op == TOKslice);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
834 exp = e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
835 type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
836 td = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
837 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
838
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
839 ArrayScopeSymbol::ArrayScopeSymbol(TypeTuple *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
840 : ScopeDsymbol()
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 exp = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
843 type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
844 td = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
845 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
846
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
847 ArrayScopeSymbol::ArrayScopeSymbol(TupleDeclaration *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
848 : ScopeDsymbol()
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 exp = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
851 type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
852 td = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
853 }
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 Dsymbol *ArrayScopeSymbol::search(Loc loc, Identifier *ident, int flags)
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 //printf("ArrayScopeSymbol::search('%s', flags = %d)\n", ident->toChars(), flags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
858 if (ident == Id::length || ident == Id::dollar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
859 { VarDeclaration **pvar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
860 Expression *ce;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
861
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
862 L1:
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 if (td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
865 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
866 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
867 Expression *e = new IntegerExp(0, td->objects->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
868 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
869 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
870 return v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
871 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
872
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
873 if (type)
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 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
876 Expression *e = new IntegerExp(0, type->arguments->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
877 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
878 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
879 return v;
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 if (exp->op == TOKindex)
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 IndexExp *ie = (IndexExp *)exp;
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 pvar = &ie->lengthVar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
887 ce = ie->e1;
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 else if (exp->op == TOKslice)
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 SliceExp *se = (SliceExp *)exp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
892
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
893 pvar = &se->lengthVar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
894 ce = se->e1;
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
897 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
898
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
899 if (ce->op == TOKtype)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
900 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
901 Type *t = ((TypeExp *)ce)->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
902 if (t->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
903 { type = (TypeTuple *)t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
904 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
905 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
906 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
907
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
908 if (!*pvar)
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 VarDeclaration *v = new VarDeclaration(loc, Type::tsize_t, Id::dollar, NULL);
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 if (ce->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
913 { /* It is for a string literal, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
914 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
915 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
916 Expression *e = new IntegerExp(0, ((StringExp *)ce)->len, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
917 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
918 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
919 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
920 else if (ce->op == TOKarrayliteral)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
921 { /* It is for an array literal, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
922 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
923 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
924 Expression *e = new IntegerExp(0, ((ArrayLiteralExp *)ce)->elements->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
925 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
926 v->storage_class |= STCconst;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
927 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
928 else if (ce->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
929 { /* It is for an expression tuple, so the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
930 * length will be a const.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
931 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
932 Expression *e = new IntegerExp(0, ((TupleExp *)ce)->exps->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
933 v->init = new ExpInitializer(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
934 v->storage_class |= STCconst;
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 *pvar = v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
937 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
938 return (*pvar);
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 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
941 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
944 /****************************** DsymbolTable ******************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
945
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
946 DsymbolTable::DsymbolTable()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
947 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
948 tab = new StringTable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
949 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
950
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
951 DsymbolTable::~DsymbolTable()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
952 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
953 delete tab;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
954 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
955
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
956 Dsymbol *DsymbolTable::lookup(Identifier *ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
957 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
958
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
959 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
960 assert(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
961 assert(tab);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
962 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
963 sv = tab->lookup((char*)ident->string, ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
964 return (Dsymbol *)(sv ? sv->ptrvalue : NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
965 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
966
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
967 Dsymbol *DsymbolTable::insert(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
968 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
969 Identifier *ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
970
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
971 //printf("DsymbolTable::insert(this = %p, '%s')\n", this, s->ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
972 ident = s->ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
973 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
974 assert(ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
975 assert(tab);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
976 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
977 sv = tab->insert(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
978 if (!sv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
979 return NULL; // already in table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
980 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
981 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
982 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
983
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
984 Dsymbol *DsymbolTable::insert(Identifier *ident, Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
985 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
986
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
987 //printf("DsymbolTable::insert()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
988 sv = tab->insert(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
989 if (!sv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
990 return NULL; // already in table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
991 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
992 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
993 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
994
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
995 Dsymbol *DsymbolTable::update(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
996 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
997 Identifier *ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
998
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
999 ident = s->ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1000 sv = tab->update(ident->toChars(), ident->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1001 sv->ptrvalue = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1002 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1003 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1004
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1005
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1006
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 156
diff changeset
1007