]> granicus.if.org Git - clang/commitdiff
Remaining work to collect objective-c's type qualifiers and use them to encode
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 1 Nov 2007 17:18:37 +0000 (17:18 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 1 Nov 2007 17:18:37 +0000 (17:18 +0000)
method types.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43617 91177308-0d34-0410-b5e6-96231b3b80d8

AST/ASTContext.cpp
Sema/SemaDecl.cpp
include/clang/AST/ASTContext.h
include/clang/AST/Decl.h
include/clang/AST/DeclObjC.h
test/Sema/method-encoding-2.m [new file with mode: 0644]

index 37b5300f1d63b6ea93c167ad17ef42ace1c0d936..acba398fb3e5321ec6cc85c57be6973a350b78a7 100644 (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!");
index ee5327f0cdd5f57d48ddbe5732a276d0363a2a2a..437ec30930c3b1c137b68e36174e0609f650ac92 100644 (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;
 }
 
index f4c5d02988dada0f8b30db7ff78510b56a51375b..d8dc9d49928d910a13145bd7f4726274f410bc45 100644 (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);
index 10d4c06cd47f344a6e110f9f781ea6f7153b942f..2e72e74fc10367d1b647e1d112a9cb59c3696fb2 100644 (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) {
index dcff5ea36efbe7835ff42789f0adeff178635fb6..8c8a1a4ecb1ec51188160d13bf25826b6e88f049 100644 (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(); }
diff --git a/test/Sema/method-encoding-2.m b/test/Sema/method-encoding-2.m
new file mode 100644 (file)
index 0000000..b7a5e73
--- /dev/null
@@ -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