diff options
Diffstat (limited to 'clang/lib/AST/DeclObjC.cpp')
-rw-r--r-- | clang/lib/AST/DeclObjC.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp index 1fe262cc0c8..5f5ba52947d 100644 --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -959,6 +959,26 @@ static void collectOverriddenMethodsSlow(const ObjCMethodDecl *Method, } } +static void collectOnCategoriesAfterLocation(SourceLocation Loc, + const ObjCInterfaceDecl *Class, + SourceManager &SM, + const ObjCMethodDecl *Method, + SmallVectorImpl<const ObjCMethodDecl *> &Methods) { + if (!Class) + return; + + for (ObjCInterfaceDecl::known_categories_iterator + Cat = Class->known_categories_begin(), + CatEnd = Class->known_categories_end(); + Cat != CatEnd; ++Cat) { + if (SM.isBeforeInTranslationUnit(Loc, Cat->getLocation())) + CollectOverriddenMethodsRecurse(*Cat, Method, Methods, true); + } + + collectOnCategoriesAfterLocation(Loc, Class->getSuperClass(), SM, + Method, Methods); +} + /// \brief Faster collection that is enabled when ObjCMethodDecl::isOverriding() /// returns false. /// You'd think that in that case there are no overrides but categories can @@ -968,7 +988,7 @@ static void collectOverriddenMethodsSlow(const ObjCMethodDecl *Method, /// further in super classes. /// Methods in an implementation can overide methods in super class's category /// but not in current class's category. But, such methods -static void collectOverriddenMethodsFast(ASTContext &Ctx, +static void collectOverriddenMethodsFast(SourceManager &SM, const ObjCMethodDecl *Method, SmallVectorImpl<const ObjCMethodDecl *> &Methods) { assert(!Method->isOverriding()); @@ -981,11 +1001,8 @@ static void collectOverriddenMethodsFast(ASTContext &Ctx, if (!Class) return; - SmallVector<const ObjCCategoryDecl *, 32> Cats; - Ctx.getBaseObjCCategoriesAfterInterface(Class, Cats); - for (SmallVectorImpl<const ObjCCategoryDecl *>::iterator - I = Cats.begin(), E = Cats.end(); I != E; ++I) - CollectOverriddenMethodsRecurse(*I, Method, Methods, true); + collectOnCategoriesAfterLocation(Class->getLocation(), Class->getSuperClass(), + SM, Method, Methods); } void ObjCMethodDecl::getOverriddenMethods( @@ -998,7 +1015,8 @@ void ObjCMethodDecl::getOverriddenMethods( } if (!Method->isOverriding()) { - collectOverriddenMethodsFast(getASTContext(), Method, Overridden); + collectOverriddenMethodsFast(getASTContext().getSourceManager(), + Method, Overridden); } else { collectOverriddenMethodsSlow(Method, Overridden); assert(!Overridden.empty() && |