Implemented parsing of objctive-c protocol conforming type used in

an identifier statement. Fixed up pretty priting to print this type 
correctly.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42866 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Fariborz Jahanian 2007-10-11 18:08:47 +00:00
Родитель 88e0052dd8
Коммит dfbcce2b55
3 изменённых файлов: 37 добавлений и 4 удалений

Просмотреть файл

@ -858,14 +858,18 @@ void ObjcInterfaceType::getAsStringInternal(std::string &InnerString) const {
void ObjcQualifiedInterfaceType::getAsStringInternal(
std::string &InnerString) const {
InnerString = getInterfaceType()->getDecl()->getName() + '<';
if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
InnerString = ' ' + InnerString;
std::string ObjcQIString = getInterfaceType()->getDecl()->getName();
ObjcQIString += '<';
int num = getNumProtocols();
for (int i = 0; i < num; i++) {
InnerString += getProtocols(i)->getName();
ObjcQIString += getProtocols(i)->getName();
if (i < num-1)
InnerString += ',';
ObjcQIString += ',';
}
InnerString += '>';
ObjcQIString += '>';
InnerString = ObjcQIString + InnerString;
}
void TagType::getAsStringInternal(std::string &InnerString) const {

Просмотреть файл

@ -235,6 +235,16 @@ Parser::StmtResult Parser::ParseIdentifierStatement(bool OnlyStatement) {
IdentTok.getLocation(), PrevSpec,
TypeRep);
assert(!isInvalid && "First declspec can't be invalid!");
if (Tok.is(tok::less)) {
llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs;
ParseObjCProtocolReferences(ProtocolRefs);
llvm::SmallVector<DeclTy *, 8> *ProtocolDecl =
new llvm::SmallVector<DeclTy *, 8>;
DS.setProtocolQualifiers(ProtocolDecl);
Actions.FindProtocolDeclaration(IdentTok.getLocation(),
&ProtocolRefs[0], ProtocolRefs.size(),
*ProtocolDecl);
}
// ParseDeclarationSpecifiers will continue from there.
ParseDeclarationSpecifiers(DS);

Просмотреть файл

@ -0,0 +1,19 @@
// RUN: clang -ast-print %s
@protocol P1 @end
@protocol P2 @end
@protocol P3 @end
@interface INTF
- (INTF<P1>*) METH;
@end
void foo()
{
INTF *pintf;
INTF<P1>* p1;
INTF<P1, P1>* p2;
INTF<P1, P3>* p3;
INTF<P1, P3, P2>* p4;
INTF<P2,P2, P3, P1>* p5;
}