Remaining work to collect objective-c's type qualifiers and use them to encode

method types.

llvm-svn: 43617
This commit is contained in:
Fariborz Jahanian 2007-11-01 17:18:37 +00:00
parent 63006473d5
commit ac73ff8868
6 changed files with 64 additions and 2 deletions

View File

@ -915,7 +915,8 @@ int ASTContext::getObjcEncodingTypeSize(QualType type) {
void ASTContext::getObjcEncodingForMethodDecl(ObjcMethodDecl *Decl,
std::string& S)
{
// TODO: First encode type qualifer, 'in', 'inout', etc. for the return type.
// Encode type qualifer, 'in', 'inout', etc. for the return type.
getObjcEncodingForTypeQualifier(Decl->getObjcDeclQualifier(), S);
// Encode result type.
getObjcEncodingForType(Decl->getResultType(), S);
// Compute size of all parameters.
@ -941,8 +942,10 @@ void ASTContext::getObjcEncodingForMethodDecl(ObjcMethodDecl *Decl,
ParmOffset = 2 * PtrSize;
for (int i = 0; i < NumOfParams; i++) {
QualType PType = Decl->getParamDecl(i)->getType();
// TODO: Process argument qualifiers for user supplied arguments; such as,
// Process argument qualifiers for user supplied arguments; such as,
// 'in', 'inout', etc.
getObjcEncodingForTypeQualifier(
Decl->getParamDecl(i)->getObjcDeclQualifier(), S);
getObjcEncodingForType(PType, S);
S += llvm::utostr(ParmOffset);
ParmOffset += getObjcEncodingTypeSize(PType);
@ -1054,6 +1057,22 @@ void ASTContext::getObjcEncodingForType(QualType T, std::string& S) const
assert(0 && "@encode for type not implemented!");
}
void ASTContext::getObjcEncodingForTypeQualifier(Decl::ObjcDeclQualifier QT,
std::string& S) const {
if (QT & Decl::OBJC_TQ_In)
S += 'n';
if (QT & Decl::OBJC_TQ_Inout)
S += 'N';
if (QT & Decl::OBJC_TQ_Out)
S += 'o';
if (QT & Decl::OBJC_TQ_Bycopy)
S += 'O';
if (QT & Decl::OBJC_TQ_Byref)
S += 'R';
if (QT & Decl::OBJC_TQ_Oneway)
S += 'V';
}
void ASTContext::setBuiltinVaListType(QualType T)
{
assert(BuiltinVaListType.isNull() && "__builtin_va_list type already set!");

View File

@ -1968,6 +1968,27 @@ void Sema::ActOnAddMethodsToObjcDecl(Scope* S, DeclTy *classDecl,
}
}
/// CvtQTToAstBitMask - utility routine to produce an AST bitmask for
/// objective-c's type qualifier from the parser version of the same info.
static Decl::ObjcDeclQualifier
CvtQTToAstBitMask(ObjcDeclSpec::ObjcDeclQualifier PQTVal) {
Decl::ObjcDeclQualifier ret = Decl::OBJC_TQ_None;
if (PQTVal & ObjcDeclSpec::DQ_In)
ret = (Decl::ObjcDeclQualifier)(ret | Decl::OBJC_TQ_In);
if (PQTVal & ObjcDeclSpec::DQ_Inout)
ret = (Decl::ObjcDeclQualifier)(ret | Decl::OBJC_TQ_Inout);
if (PQTVal & ObjcDeclSpec::DQ_Out)
ret = (Decl::ObjcDeclQualifier)(ret | Decl::OBJC_TQ_Out);
if (PQTVal & ObjcDeclSpec::DQ_Bycopy)
ret = (Decl::ObjcDeclQualifier)(ret | Decl::OBJC_TQ_Bycopy);
if (PQTVal & ObjcDeclSpec::DQ_Byref)
ret = (Decl::ObjcDeclQualifier)(ret | Decl::OBJC_TQ_Byref);
if (PQTVal & ObjcDeclSpec::DQ_Oneway)
ret = (Decl::ObjcDeclQualifier)(ret | Decl::OBJC_TQ_Oneway);
return ret;
}
Sema::DeclTy *Sema::ActOnMethodDeclaration(
SourceLocation MethodLoc, SourceLocation EndLoc,
tok::TokenKind MethodType, ObjcDeclSpec &ReturnQT, TypeTy *ReturnType,
@ -1988,6 +2009,8 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration(
argType = Context.getObjcIdType();
ParmVarDecl* Param = new ParmVarDecl(SourceLocation(/*FIXME*/), ArgNames[i],
argType, VarDecl::None, 0);
Param->setObjcDeclQualifier(
CvtQTToAstBitMask(ArgQT[i].getObjcDeclQualifier()));
Params.push_back(Param);
}
QualType resultDeclType;
@ -2004,6 +2027,8 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration(
ObjcMethodDecl::Optional :
ObjcMethodDecl::Required);
ObjcMethod->setMethodParams(&Params[0], Sel.getNumArgs());
ObjcMethod->setObjcDeclQualifier(
CvtQTToAstBitMask(ReturnQT.getObjcDeclQualifier()));
return ObjcMethod;
}

View File

@ -185,6 +185,10 @@ public:
// Return the ObjC type encoding for a given type.
void getObjcEncodingForType(QualType t, std::string &S) const;
// Put the string version of type qualifiers into S.
void getObjcEncodingForTypeQualifier(Decl::ObjcDeclQualifier QT,
std::string &S) const;
/// getObjcEncodingForMethodDecl - Return the encoded type for this method
/// declaration.
void getObjcEncodingForMethodDecl(ObjcMethodDecl *Decl, std::string &S);

View File

@ -294,6 +294,8 @@ public:
bool hasGlobalStorage() const { return !hasAutoStorage(); }
ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; }
void setObjcDeclQualifier(ObjcDeclQualifier QTVal)
{ objcDeclQualifier = QTVal; }
// Implement isa/cast/dyncast/etc.
static bool classof(const Decl *D) {

View File

@ -253,6 +253,7 @@ public:
virtual ~ObjcMethodDecl();
ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; }
void setObjcDeclQualifier(ObjcDeclQualifier QV) { objcDeclQualifier = QV; }
// Location information, modeled after the Stmt API.
SourceLocation getLocStart() const { return getLocation(); }

View File

@ -0,0 +1,11 @@
// RUN: clang -rewrite-test %s
@interface Intf
- (in out bycopy id) address:(byref inout void *)location with:(out oneway unsigned **)arg2;
- (id) another:(void *)location with:(unsigned **)arg2;
@end
@implementation Intf
- (in out bycopy id) address:(byref inout void *)location with:(out oneway unsigned **)arg2{}
- (id) another:(void *)location with:(unsigned **)arg2 {}
@end