diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2017-04-21 05:42:46 +0000 | 
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2017-04-21 05:42:46 +0000 | 
| commit | 6e5ca5be537b1812ffc000b44deb91dd260e40b5 (patch) | |
| tree | 4e8b044ab076a69368130ccb1ad451c7d279983b /clang | |
| parent | f932612fdf942ca90a5fdca2a9423450258fedca (diff) | |
| download | bcm5719-llvm-6e5ca5be537b1812ffc000b44deb91dd260e40b5.tar.gz bcm5719-llvm-6e5ca5be537b1812ffc000b44deb91dd260e40b5.zip  | |
[index] Take advantage of 'external_source_symbol' attribute for indexing purposes
- Ignore decls marked as 'generated_declaration'
- Include the 'defined_in' in the USR for additional namespacing
llvm-svn: 300949
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Index/USRGeneration.h | 14 | ||||
| -rw-r--r-- | clang/lib/Index/IndexDecl.cpp | 52 | ||||
| -rw-r--r-- | clang/lib/Index/IndexTypeSourceInfo.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Index/IndexingContext.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/Index/IndexingContext.h | 2 | ||||
| -rw-r--r-- | clang/lib/Index/USRGeneration.cpp | 83 | ||||
| -rw-r--r-- | clang/test/Index/Core/external-source-symbol-attr.m | 88 | 
7 files changed, 207 insertions, 45 deletions
diff --git a/clang/include/clang/Index/USRGeneration.h b/clang/include/clang/Index/USRGeneration.h index 61f2c9d1ff1..e3a46205628 100644 --- a/clang/include/clang/Index/USRGeneration.h +++ b/clang/include/clang/Index/USRGeneration.h @@ -30,10 +30,13 @@ static inline StringRef getUSRSpacePrefix() {  bool generateUSRForDecl(const Decl *D, SmallVectorImpl<char> &Buf);  /// \brief Generate a USR fragment for an Objective-C class. -void generateUSRForObjCClass(StringRef Cls, raw_ostream &OS); +void generateUSRForObjCClass(StringRef Cls, raw_ostream &OS, +                             StringRef ExtSymbolDefinedIn = "");  /// \brief Generate a USR fragment for an Objective-C class category. -void generateUSRForObjCCategory(StringRef Cls, StringRef Cat, raw_ostream &OS); +void generateUSRForObjCCategory(StringRef Cls, StringRef Cat, raw_ostream &OS, +                                StringRef ClsExtSymbolDefinedIn = "", +                                StringRef CatExtSymbolDefinedIn = "");  /// \brief Generate a USR fragment for an Objective-C instance variable.  The  /// complete USR can be created by concatenating the USR for the @@ -48,7 +51,12 @@ void generateUSRForObjCMethod(StringRef Sel, bool IsInstanceMethod,  void generateUSRForObjCProperty(StringRef Prop, bool isClassProp, raw_ostream &OS);  /// \brief Generate a USR fragment for an Objective-C protocol. -void generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS); +void generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS, +                                StringRef ExtSymbolDefinedIn = ""); + +/// Generate USR fragment for a global (non-nested) enum. +void generateUSRForGlobalEnum(StringRef EnumName, raw_ostream &OS, +                              StringRef ExtSymbolDefinedIn = "");  /// \brief Generate a USR for a macro, including the USR prefix.  /// diff --git a/clang/lib/Index/IndexDecl.cpp b/clang/lib/Index/IndexDecl.cpp index 9bf19270e8d..8028f8892f0 100644 --- a/clang/lib/Index/IndexDecl.cpp +++ b/clang/lib/Index/IndexDecl.cpp @@ -14,6 +14,13 @@  using namespace clang;  using namespace index; +#define TRY_DECL(D,CALL_EXPR)                                                  \ +  do {                                                                         \ +    if (!IndexCtx.shouldIndex(D)) return true;                                 \ +    if (!CALL_EXPR)                                                            \ +      return false;                                                            \ +  } while (0) +  #define TRY_TO(CALL_EXPR)                                                      \    do {                                                                         \      if (!CALL_EXPR)                                                            \ @@ -120,8 +127,7 @@ public:                                 D->getDeclContext(), 0);      } -    if (!IndexCtx.handleDecl(D, MethodLoc, Roles, Relations)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D, MethodLoc, Roles, Relations));      IndexCtx.indexTypeSourceInfo(D->getReturnTypeSourceInfo(), D);      bool hasIBActionAndFirst = D->hasAttr<IBActionAttr>();      for (const auto *I : D->parameters()) { @@ -153,8 +159,7 @@ public:        }      } -    if (!IndexCtx.handleDecl(D, Roles, Relations)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D, Roles, Relations));      handleDeclarator(D);      if (const CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) { @@ -189,16 +194,14 @@ public:    }    bool VisitVarDecl(const VarDecl *D) { -    if (!IndexCtx.handleDecl(D)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D));      handleDeclarator(D);      IndexCtx.indexBody(D->getInit(), D);      return true;    }    bool VisitFieldDecl(const FieldDecl *D) { -    if (!IndexCtx.handleDecl(D)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D));      handleDeclarator(D);      if (D->isBitField())        IndexCtx.indexBody(D->getBitWidth(), D); @@ -212,8 +215,7 @@ public:        // handled in VisitObjCPropertyImplDecl        return true;      } -    if (!IndexCtx.handleDecl(D)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D));      handleDeclarator(D);      return true;    } @@ -224,16 +226,14 @@ public:    }    bool VisitEnumConstantDecl(const EnumConstantDecl *D) { -    if (!IndexCtx.handleDecl(D)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D));      IndexCtx.indexBody(D->getInitExpr(), D);      return true;    }    bool VisitTypedefNameDecl(const TypedefNameDecl *D) {      if (!D->isTransparentTag()) { -      if (!IndexCtx.handleDecl(D)) -        return false; +      TRY_DECL(D, IndexCtx.handleDecl(D));        IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D);      }      return true; @@ -273,7 +273,7 @@ public:    bool VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D) {      if (D->isThisDeclarationADefinition()) { -      TRY_TO(IndexCtx.handleDecl(D)); +      TRY_DECL(D, IndexCtx.handleDecl(D));        SourceLocation SuperLoc = D->getSuperClassLoc();        if (auto *SuperD = D->getSuperClass()) {          bool hasSuperTypedef = false; @@ -304,7 +304,7 @@ public:    bool VisitObjCProtocolDecl(const ObjCProtocolDecl *D) {      if (D->isThisDeclarationADefinition()) { -      TRY_TO(IndexCtx.handleDecl(D)); +      TRY_DECL(D, IndexCtx.handleDecl(D));        TRY_TO(handleReferencedProtocols(D->getReferencedProtocols(), D,                                         /*superLoc=*/SourceLocation()));        TRY_TO(IndexCtx.indexDeclContext(D)); @@ -323,8 +323,7 @@ public:      if (Class->isImplicitInterfaceDecl())        IndexCtx.handleDecl(Class); -    if (!IndexCtx.handleDecl(D)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D));      // Visit implicit @synthesize property implementations first as their      // location is reported at the name of the @implementation block. This @@ -343,6 +342,8 @@ public:    }    bool VisitObjCCategoryDecl(const ObjCCategoryDecl *D) { +    if (!IndexCtx.shouldIndex(D)) +      return true;      const ObjCInterfaceDecl *C = D->getClassInterface();      if (!C)        return true; @@ -371,8 +372,7 @@ public:      SourceLocation CategoryLoc = D->getCategoryNameLoc();      if (!CategoryLoc.isValid())        CategoryLoc = D->getLocation(); -    if (!IndexCtx.handleDecl(D, CategoryLoc)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D, CategoryLoc));      IndexCtx.indexDeclContext(D);      return true;    } @@ -394,8 +394,7 @@ public:      if (ObjCMethodDecl *MD = D->getSetterMethodDecl())        if (MD->getLexicalDeclContext() == D->getLexicalDeclContext())          handleObjCMethod(MD, D); -    if (!IndexCtx.handleDecl(D)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D));      if (IBOutletCollectionAttr *attr = D->getAttr<IBOutletCollectionAttr>())        IndexCtx.indexTypeSourceInfo(attr->getInterfaceLoc(), D,                                     D->getLexicalDeclContext(), false, true); @@ -416,8 +415,7 @@ public:        Loc = Container->getLocation();        Roles |= (SymbolRoleSet)SymbolRole::Implicit;      } -    if (!IndexCtx.handleDecl(D, Loc, Roles, Relations)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D, Loc, Roles, Relations));      if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic)        return true; @@ -451,8 +449,7 @@ public:          } else if (D->getLocation() == IvarLoc) {            IvarRoles = (SymbolRoleSet)SymbolRole::Implicit;          } -        if(!IndexCtx.handleDecl(IvarD, IvarLoc, IvarRoles)) -          return false; +        TRY_DECL(IvarD, IndexCtx.handleDecl(IvarD, IvarLoc, IvarRoles));        } else {          IndexCtx.handleReference(IvarD, D->getPropertyIvarDeclLoc(), nullptr,                                   D->getDeclContext(), SymbolRoleSet()); @@ -462,8 +459,7 @@ public:    }    bool VisitNamespaceDecl(const NamespaceDecl *D) { -    if (!IndexCtx.handleDecl(D)) -      return false; +    TRY_DECL(D, IndexCtx.handleDecl(D));      IndexCtx.indexDeclContext(D);      return true;    } diff --git a/clang/lib/Index/IndexTypeSourceInfo.cpp b/clang/lib/Index/IndexTypeSourceInfo.cpp index a3566a9f2ae..44d1241fb93 100644 --- a/clang/lib/Index/IndexTypeSourceInfo.cpp +++ b/clang/lib/Index/IndexTypeSourceInfo.cpp @@ -210,6 +210,8 @@ void IndexingContext::indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,  void IndexingContext::indexTagDecl(const TagDecl *D,                                     ArrayRef<SymbolRelation> Relations) { +  if (!shouldIndex(D)) +    return;    if (!shouldIndexFunctionLocalSymbols() && isFunctionLocalSymbol(D))      return; diff --git a/clang/lib/Index/IndexingContext.cpp b/clang/lib/Index/IndexingContext.cpp index 85574d0a314..254abecd4e4 100644 --- a/clang/lib/Index/IndexingContext.cpp +++ b/clang/lib/Index/IndexingContext.cpp @@ -17,6 +17,17 @@  using namespace clang;  using namespace index; +static bool isGeneratedDecl(const Decl *D) { +  if (auto *attr = D->getAttr<ExternalSourceSymbolAttr>()) { +    return attr->getGeneratedDeclaration(); +  } +  return false; +} + +bool IndexingContext::shouldIndex(const Decl *D) { +  return !isGeneratedDecl(D); +} +  bool IndexingContext::shouldIndexFunctionLocalSymbols() const {    return IndexOpts.IndexFunctionLocals;  } diff --git a/clang/lib/Index/IndexingContext.h b/clang/lib/Index/IndexingContext.h index 1ebf6f9ce67..c70cb0a8272 100644 --- a/clang/lib/Index/IndexingContext.h +++ b/clang/lib/Index/IndexingContext.h @@ -48,6 +48,8 @@ public:    void setASTContext(ASTContext &ctx) { Ctx = &ctx; } +  bool shouldIndex(const Decl *D); +    bool shouldSuppressRefs() const {      return false;    } diff --git a/clang/lib/Index/USRGeneration.cpp b/clang/lib/Index/USRGeneration.cpp index 73dddd9a8b3..c373eda98d4 100644 --- a/clang/lib/Index/USRGeneration.cpp +++ b/clang/lib/Index/USRGeneration.cpp @@ -46,6 +46,15 @@ static bool printLoc(llvm::raw_ostream &OS, SourceLocation Loc,    return false;  } +static StringRef GetExternalSourceContainer(const NamedDecl *D) { +  if (!D) +    return StringRef(); +  if (auto *attr = D->getAttr<ExternalSourceSymbolAttr>()) { +    return attr->getDefinedIn(); +  } +  return StringRef(); +} +  namespace {  class USRGenerator : public ConstDeclVisitor<USRGenerator> {    SmallVectorImpl<char> &Buf; @@ -116,6 +125,8 @@ public:      return D->getParentFunctionOrMethod() != nullptr;    } +  void GenExtSymbolContainer(const NamedDecl *D); +    /// Generate the string component containing the location of the    ///  declaration.    bool GenLoc(const Decl *D, bool IncludeOffset); @@ -127,13 +138,14 @@ public:    /// itself.    /// Generate a USR for an Objective-C class. -  void GenObjCClass(StringRef cls) { -    generateUSRForObjCClass(cls, Out); +  void GenObjCClass(StringRef cls, StringRef ext) { +    generateUSRForObjCClass(cls, Out, ext);    }    /// Generate a USR for an Objective-C class category. -  void GenObjCCategory(StringRef cls, StringRef cat) { -    generateUSRForObjCCategory(cls, cat, Out); +  void GenObjCCategory(StringRef cls, StringRef cat, +                       StringRef clsExt, StringRef catExt) { +    generateUSRForObjCCategory(cls, cat, Out, clsExt, catExt);    }    /// Generate a USR fragment for an Objective-C property. @@ -142,8 +154,8 @@ public:    }    /// Generate a USR for an Objective-C protocol. -  void GenObjCProtocol(StringRef prot) { -    generateUSRForObjCProtocol(prot, Out); +  void GenObjCProtocol(StringRef prot, StringRef ext) { +    generateUSRForObjCProtocol(prot, Out, ext);    }    void VisitType(QualType T); @@ -204,7 +216,11 @@ void USRGenerator::VisitFunctionDecl(const FunctionDecl *D) {    if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D)))      return; +  const unsigned StartSize = Buf.size();    VisitDeclContext(D->getDeclContext()); +  if (Buf.size() == StartSize) +    GenExtSymbolContainer(D); +    bool IsTemplate = false;    if (FunctionTemplateDecl *FunTmpl = D->getDescribedFunctionTemplate()) {      IsTemplate = true; @@ -382,7 +398,7 @@ void USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) {        llvm_unreachable("Invalid ObjC container.");      case Decl::ObjCInterface:      case Decl::ObjCImplementation: -      GenObjCClass(D->getName()); +      GenObjCClass(D->getName(), GetExternalSourceContainer(D));        break;      case Decl::ObjCCategory: {        const ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(D); @@ -402,7 +418,9 @@ void USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) {          GenLoc(CD, /*IncludeOffset=*/true);        }        else -        GenObjCCategory(ID->getName(), CD->getName()); +        GenObjCCategory(ID->getName(), CD->getName(), +                        GetExternalSourceContainer(ID), +                        GetExternalSourceContainer(CD));        break;      } @@ -417,12 +435,16 @@ void USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) {          IgnoreResults = true;          return;        } -      GenObjCCategory(ID->getName(), CD->getName()); +      GenObjCCategory(ID->getName(), CD->getName(), +                      GetExternalSourceContainer(ID), +                      GetExternalSourceContainer(CD));        break;      } -    case Decl::ObjCProtocol: -      GenObjCProtocol(cast<ObjCProtocolDecl>(D)->getName()); +    case Decl::ObjCProtocol: { +      const ObjCProtocolDecl *PD = cast<ObjCProtocolDecl>(D); +      GenObjCProtocol(PD->getName(), GetExternalSourceContainer(PD));        break; +    }    }  } @@ -452,6 +474,8 @@ void USRGenerator::VisitTagDecl(const TagDecl *D) {        ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D)))      return; +  GenExtSymbolContainer(D); +    D = D->getCanonicalDecl();    VisitDeclContext(D->getDeclContext()); @@ -544,6 +568,12 @@ void USRGenerator::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) {    GenLoc(D, /*IncludeOffset=*/true);  } +void USRGenerator::GenExtSymbolContainer(const NamedDecl *D) { +  StringRef Container = GetExternalSourceContainer(D); +  if (!Container.empty()) +    Out << "@M@" << Container; +} +  bool USRGenerator::GenLoc(const Decl *D, bool IncludeOffset) {    if (generatedLoc)      return IgnoreResults; @@ -866,12 +896,27 @@ void USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) {  // USR generation functions.  //===----------------------------------------------------------------------===// -void clang::index::generateUSRForObjCClass(StringRef Cls, raw_ostream &OS) { +void clang::index::generateUSRForObjCClass(StringRef Cls, raw_ostream &OS, +                                           StringRef ExtSymDefinedIn) { +  if (!ExtSymDefinedIn.empty()) +    OS << "@M@" << ExtSymDefinedIn << '@';    OS << "objc(cs)" << Cls;  }  void clang::index::generateUSRForObjCCategory(StringRef Cls, StringRef Cat, -                                              raw_ostream &OS) { +                                              raw_ostream &OS, +                                              StringRef ClsSymDefinedIn, +                                              StringRef CatSymDefinedIn) { +  if (!CatSymDefinedIn.empty() || !ClsSymDefinedIn.empty()) { +    OS << "@M@"; +    if (!CatSymDefinedIn.empty() && !ClsSymDefinedIn.empty()) +      OS << CatSymDefinedIn << '-' << ClsSymDefinedIn; +    else if (!CatSymDefinedIn.empty()) +      OS << CatSymDefinedIn; +    else +      OS << ClsSymDefinedIn; +    OS << '@'; +  }    OS << "objc(cy)" << Cls << '@' << Cat;  } @@ -890,10 +935,20 @@ void clang::index::generateUSRForObjCProperty(StringRef Prop, bool isClassProp,    OS << (isClassProp ? "(cpy)" : "(py)") << Prop;  } -void clang::index::generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS) { +void clang::index::generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS, +                                              StringRef ExtSymDefinedIn) { +  if (!ExtSymDefinedIn.empty()) +    OS << "@M@" << ExtSymDefinedIn << '@';    OS << "objc(pl)" << Prot;  } +void clang::index::generateUSRForGlobalEnum(StringRef EnumName, raw_ostream &OS, +                                            StringRef ExtSymDefinedIn) { +  if (!ExtSymDefinedIn.empty()) +    OS << "@M@" << ExtSymDefinedIn; +  OS << "@E@" << EnumName; +} +  bool clang::index::generateUSRForDecl(const Decl *D,                                        SmallVectorImpl<char> &Buf) {    if (!D) diff --git a/clang/test/Index/Core/external-source-symbol-attr.m b/clang/test/Index/Core/external-source-symbol-attr.m new file mode 100644 index 00000000000..800a03e4740 --- /dev/null +++ b/clang/test/Index/Core/external-source-symbol-attr.m @@ -0,0 +1,88 @@ +// RUN: c-index-test core -print-source-symbols -- %s -target x86_64-apple-macosx10.7 | FileCheck %s + +#define EXT_DECL(mod_name) __attribute__((external_source_symbol(language="Swift", defined_in=mod_name))) +#define GEN_DECL(mod_name) __attribute__((external_source_symbol(language="Swift", defined_in=mod_name, generated_declaration))) + +// This should not be indexed. +GEN_DECL("some_module") +@interface I1 +// CHECK-NOT: [[@LINE-1]]:12 | +-(void)method; +// CHECK-NOT: [[@LINE-1]]:8 | +@end + +EXT_DECL("some_module") +@interface I2 +// CHECK: [[@LINE-1]]:12 | class/ObjC | I2 | c:@M@some_module@objc(cs)I2 | {{.*}} | Decl | rel: 0 +-(void)method; +// CHECK: [[@LINE-1]]:8 | instance-method/ObjC | method | c:@M@some_module@objc(cs)I2(im)method | -[I2 method] | Decl,Dyn,RelChild | rel: 1 +@end + +void test1(I1 *o) { +// CHECK: [[@LINE-1]]:12 | class/ObjC | I1 | c:@M@some_module@objc(cs)I1 | +  [o method]; +  // CHECK: [[@LINE-1]]:6 | instance-method/ObjC | method | c:@M@some_module@objc(cs)I1(im)method | +} + +EXT_DECL("some_module") +@protocol ExtProt +// CHECK: [[@LINE-1]]:11 | protocol/ObjC | ExtProt | c:@M@some_module@objc(pl)ExtProt | +@end + +@interface I1(cat) +// CHECK: [[@LINE-1]]:15 | extension/ObjC | cat | c:@M@some_module@objc(cy)I1@cat | +-(void)cat_method; +// CHECK: [[@LINE-1]]:8 | instance-method/ObjC | cat_method | c:@M@some_module@objc(cs)I1(im)cat_method +@end + +EXT_DECL("cat_module") +@interface I1(cat2) +// CHECK: [[@LINE-1]]:15 | extension/ObjC | cat2 | c:@M@cat_module-some_module@objc(cy)I1@cat2 | +-(void)cat_method2; +// CHECK: [[@LINE-1]]:8 | instance-method/ObjC | cat_method2 | c:@M@some_module@objc(cs)I1(im)cat_method2 +@end + +#define NS_ENUM(_name, _type) enum _name:_type _name; enum _name : _type + +#pragma clang attribute push(GEN_DECL("modname"), apply_to=any(enum, objc_interface, objc_category, objc_protocol)) + +@interface I3 +// CHECK-NOT: [[@LINE-1]]:12 | +-(void)meth; +// CHECK-NOT: [[@LINE-1]]:8 | +@end + +@interface I3(cat) +// CHECK-NOT: [[@LINE-1]]:12 | +// CHECK-NOT: [[@LINE-2]]:15 | +-(void)meth2; +// CHECK-NOT: [[@LINE-1]]:8 | +@end + +@protocol ExtProt2 +// CHECK-NOT: [[@LINE-1]]:11 | +-(void)meth; +// CHECK-NOT: [[@LINE-1]]:8 | +@end + +typedef NS_ENUM(SomeEnum, int) { +// CHECK-NOT: [[@LINE-1]]:17 | +  SomeEnumFirst = 0, +  // CHECK-NOT: [[@LINE-1]]:3 | +}; + +#pragma clang attribute pop + +void test2(I3 *i3, id<ExtProt2> prot2, SomeEnum some) { +  // CHECK: [[@LINE-1]]:12 | class/ObjC | I3 | c:@M@modname@objc(cs)I3 | +  // CHECK: [[@LINE-2]]:23 | protocol/ObjC | ExtProt2 | c:@M@modname@objc(pl)ExtProt2 | +  // CHECK: [[@LINE-3]]:40 | enum/C | SomeEnum | c:@M@modname@E@SomeEnum | +  [i3 meth]; +  // CHECK: [[@LINE-1]]:7 | instance-method/ObjC | meth | c:@M@modname@objc(cs)I3(im)meth | +  [i3 meth2]; +  // CHECK: [[@LINE-1]]:7 | instance-method/ObjC | meth2 | c:@M@modname@objc(cs)I3(im)meth2 | +  [prot2 meth]; +  // CHECK: [[@LINE-1]]:10 | instance-method/ObjC | meth | c:@M@modname@objc(pl)ExtProt2(im)meth | +  some = SomeEnumFirst; +  // CHECK: [[@LINE-1]]:10 | enumerator/C | SomeEnumFirst | c:@M@modname@E@SomeEnum@SomeEnumFirst | +}  | 

