summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/DeclObjC.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/DeclObjC.cpp')
-rw-r--r--clang/lib/AST/DeclObjC.cpp32
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() &&
OpenPOWER on IntegriCloud