Skip to content

Commit 2289b10

Browse files
author
Eli Friedman
committed
Slightly simplify the code for type-checking decls.
Swift SVN r2001
1 parent a75fdba commit 2289b10

File tree

1 file changed

+39
-72
lines changed

1 file changed

+39
-72
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 39 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -179,16 +179,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
179179
}
180180

181181
void visitOneOfDecl(OneOfDecl *OOD) {
182-
if (IsSecondPass) {
183-
for (auto elt : OOD->getElements())
184-
visitOneOfElementDecl(elt);
185-
186-
checkExplicitConformance(OOD, OOD->getDeclaredType(),
187-
OOD->getInherited());
188-
return;
189-
}
190-
191-
checkInherited(OOD, OOD->getDeclaredType(), OOD->getInherited());
182+
if (!IsSecondPass)
183+
checkInherited(OOD, OOD->getDeclaredType(), OOD->getInherited());
192184

193185
for (auto elt : OOD->getElements())
194186
visitOneOfElementDecl(elt);
@@ -199,53 +191,39 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
199191
}
200192

201193
void visitStructDecl(StructDecl *SD) {
202-
if (IsSecondPass) {
203-
for (Decl *Member : SD->getMembers())
204-
visit(Member);
205-
206-
checkExplicitConformance(SD, SD->getDeclaredType(),
207-
SD->getInherited());
208-
return;
209-
}
210-
211-
checkInherited(SD, SD->getDeclaredType(), SD->getInherited());
194+
if (!IsSecondPass)
195+
checkInherited(SD, SD->getDeclaredType(), SD->getInherited());
212196

213197
for (Decl *Member : SD->getMembers()) {
214198
visit(Member);
215199
}
216-
217-
// FIXME: We should come up with a better way to represent this implied
218-
// constructor.
219-
SmallVector<TupleTypeElt, 8> TupleElts;
220-
for (Decl *Member : SD->getMembers())
221-
if (VarDecl *VarD = dyn_cast<VarDecl>(Member))
222-
if (!VarD->isProperty())
223-
TupleElts.push_back(TupleTypeElt(VarD->getType(), VarD->getName()));
224-
TupleType *TT = TupleType::get(TupleElts, TC.Context);
225-
Type CreateTy = FunctionType::get(TT, SD->getDeclaredType(), TC.Context);
226-
cast<OneOfElementDecl>(SD->getMembers().back())->setType(CreateTy);
227-
cast<OneOfElementDecl>(SD->getMembers().back())->setArgumentType(TT);
228-
200+
201+
if (!IsSecondPass) {
202+
// FIXME: We should come up with a better way to represent this implied
203+
// constructor.
204+
SmallVector<TupleTypeElt, 8> TupleElts;
205+
for (Decl *Member : SD->getMembers())
206+
if (VarDecl *VarD = dyn_cast<VarDecl>(Member))
207+
if (!VarD->isProperty())
208+
TupleElts.push_back(TupleTypeElt(VarD->getType(),
209+
VarD->getName()));
210+
TupleType *TT = TupleType::get(TupleElts, TC.Context);
211+
Type CreateTy = FunctionType::get(TT, SD->getDeclaredType(), TC.Context);
212+
cast<OneOfElementDecl>(SD->getMembers().back())->setType(CreateTy);
213+
cast<OneOfElementDecl>(SD->getMembers().back())->setArgumentType(TT);
214+
}
215+
229216
if (!IsFirstPass)
230217
checkExplicitConformance(SD, SD->getDeclaredType(),
231218
SD->getInherited());
232219
}
233220

234221
void visitClassDecl(ClassDecl *CD) {
235-
if (IsSecondPass) {
236-
for (Decl *Member : CD->getMembers())
237-
visit(Member);
222+
if (!IsSecondPass)
223+
checkInherited(CD, CD->getDeclaredType(), CD->getInherited());
238224

239-
checkExplicitConformance(CD, CD->getDeclaredType(),
240-
CD->getInherited());
241-
return;
242-
}
243-
244-
checkInherited(CD, CD->getDeclaredType(), CD->getInherited());
245-
246-
for (Decl *Member : CD->getMembers()) {
225+
for (Decl *Member : CD->getMembers())
247226
visit(Member);
248-
}
249227

250228
if (!IsFirstPass)
251229
checkExplicitConformance(CD, CD->getDeclaredType(),
@@ -318,36 +296,25 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
318296
}
319297

320298
void visitExtensionDecl(ExtensionDecl *ED) {
321-
if (IsSecondPass) {
322-
for (Decl *Member : ED->getMembers())
323-
// First recursively type check each thing in the extension.
324-
visit(Member);
325-
326-
checkExplicitConformance(ED, ED->getExtendedType(),
327-
ED->getInherited());
328-
return;
329-
}
330-
331-
332-
if (TC.validateType(ED->getExtendedType(), IsFirstPass)) {
333-
ED->setExtendedType(ErrorType::get(TC.Context));
334-
} else {
335-
Type ExtendedTy = ED->getExtendedType();
336-
if (!ExtendedTy->is<OneOfType>() && !ExtendedTy->is<StructType>() &&
337-
!ExtendedTy->is<ClassType>() && !ExtendedTy->is<ErrorType>()) {
338-
TC.diagnose(ED->getLocStart(), diag::non_nominal_extension,
339-
ExtendedTy->is<ProtocolType>(), ExtendedTy);
340-
// FIXME: It would be nice to point out where we found the named type
341-
// declaration, if any.
342-
}
299+
if (!IsSecondPass) {
300+
if (TC.validateType(ED->getExtendedType(), IsFirstPass)) {
301+
ED->setExtendedType(ErrorType::get(TC.Context));
302+
} else {
303+
Type ExtendedTy = ED->getExtendedType();
304+
if (!ExtendedTy->is<OneOfType>() && !ExtendedTy->is<StructType>() &&
305+
!ExtendedTy->is<ClassType>() && !ExtendedTy->is<ErrorType>()) {
306+
TC.diagnose(ED->getLocStart(), diag::non_nominal_extension,
307+
ExtendedTy->is<ProtocolType>(), ExtendedTy);
308+
// FIXME: It would be nice to point out where we found the named type
309+
// declaration, if any.
310+
}
343311

344-
checkInherited(ED, ExtendedTy, ED->getInherited());
312+
checkInherited(ED, ExtendedTy, ED->getInherited());
313+
}
345314
}
346-
347-
for (Decl *Member : ED->getMembers()) {
348-
// First recursively type check each thing in the extension.
315+
316+
for (Decl *Member : ED->getMembers())
349317
visit(Member);
350-
}
351318

352319
if (!IsFirstPass)
353320
checkExplicitConformance(ED, ED->getExtendedType(),

0 commit comments

Comments
 (0)