aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/ParseObjc.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-11 18:57:04 +0000
committerChris Lattner <sabre@nondot.org>2009-04-11 18:57:04 +0000
commite294d3fbaffcbc0cf5f16067ab31d2b2763d25e9 (patch)
treef2c07c503173ba2db46c9bbb18fe94d09c02cb28 /lib/Parse/ParseObjc.cpp
parentda0895d003dff3e9c57ca899fc2a3a2b397edb2e (diff)
change the interface to ActOnMethodDeclaration to pass down argument
information in a little struct instead of individually. While we're at it, add per-argument loc info and attribute info. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68871 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseObjc.cpp')
-rw-r--r--lib/Parse/ParseObjc.cpp33
1 files changed, 16 insertions, 17 deletions
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp
index 42ec857251..239d35f806 100644
--- a/lib/Parse/ParseObjc.cpp
+++ b/lib/Parse/ParseObjc.cpp
@@ -699,18 +699,15 @@ Parser::DeclPtrTy Parser::ParseObjCMethodDecl(SourceLocation mLoc,
Selector Sel = PP.getSelectorTable().getNullarySelector(SelIdent);
return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(),
mType, IDecl, DSRet, ReturnType, Sel,
- 0, 0, 0, CargNames,
+ 0, CargNames,
MethodAttrs, MethodImplKind);
}
llvm::SmallVector<IdentifierInfo *, 12> KeyIdents;
- llvm::SmallVector<Action::TypeTy *, 12> KeyTypes;
- llvm::SmallVector<ObjCDeclSpec, 12> ArgTypeQuals;
- llvm::SmallVector<IdentifierInfo *, 12> ArgNames;
+ llvm::SmallVector<Action::ObjCArgInfo, 12> ArgInfos;
- Action::TypeTy *TypeInfo;
while (1) {
- KeyIdents.push_back(SelIdent);
+ Action::ObjCArgInfo ArgInfo;
// Each iteration parses a single keyword argument.
if (Tok.isNot(tok::colon)) {
@@ -718,25 +715,28 @@ Parser::DeclPtrTy Parser::ParseObjCMethodDecl(SourceLocation mLoc,
break;
}
ConsumeToken(); // Eat the ':'.
- ObjCDeclSpec DSType;
- if (Tok.is(tok::l_paren)) // Parse the argument type.
- TypeInfo = ParseObjCTypeName(DSType);
- else
- TypeInfo = 0;
- KeyTypes.push_back(TypeInfo);
- ArgTypeQuals.push_back(DSType);
+ ArgInfo.Type = 0;
+ if (Tok.is(tok::l_paren)) // Parse the argument type if present.
+ ArgInfo.Type = ParseObjCTypeName(ArgInfo.DeclSpec);
+
// If attributes exist before the argument name, parse them.
+ ArgInfo.ArgAttrs = 0;
if (getLang().ObjC2 && Tok.is(tok::kw___attribute))
- ParseAttributes(); // FIXME: pass attributes through.
+ ArgInfo.ArgAttrs = ParseAttributes();
if (Tok.isNot(tok::identifier)) {
Diag(Tok, diag::err_expected_ident); // missing argument name.
break;
}
- ArgNames.push_back(Tok.getIdentifierInfo());
+
+ ArgInfo.Name = Tok.getIdentifierInfo();
+ ArgInfo.NameLoc = Tok.getLocation();
ConsumeToken(); // Eat the identifier.
+ ArgInfos.push_back(ArgInfo);
+ KeyIdents.push_back(SelIdent);
+
// Check for another keyword selector.
SourceLocation Loc;
SelIdent = ParseObjCSelectorPiece(Loc);
@@ -773,8 +773,7 @@ Parser::DeclPtrTy Parser::ParseObjCMethodDecl(SourceLocation mLoc,
&KeyIdents[0]);
return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(),
mType, IDecl, DSRet, ReturnType, Sel,
- &ArgTypeQuals[0], &KeyTypes[0],
- &ArgNames[0], CargNames,
+ &ArgInfos[0], CargNames,
MethodAttrs,
MethodImplKind, isVariadic);
}