Index: cfe/trunk/lib/Index/IndexDecl.cpp =================================================================== --- cfe/trunk/lib/Index/IndexDecl.cpp +++ cfe/trunk/lib/Index/IndexDecl.cpp @@ -324,6 +324,7 @@ } bool VisitMSPropertyDecl(const MSPropertyDecl *D) { + TRY_DECL(D, IndexCtx.handleDecl(D)); handleDeclarator(D); return true; } Index: cfe/trunk/lib/Index/IndexSymbol.cpp =================================================================== --- cfe/trunk/lib/Index/IndexSymbol.cpp +++ cfe/trunk/lib/Index/IndexSymbol.cpp @@ -324,6 +324,14 @@ Info.Kind = SymbolKind::Variable; Info.Lang = SymbolLanguage::CXX; break; + case Decl::MSProperty: + Info.Kind = SymbolKind::InstanceProperty; + if (const CXXRecordDecl *CXXRec = + dyn_cast(D->getDeclContext())) { + if (!CXXRec->isCLike()) + Info.Lang = SymbolLanguage::CXX; + } + break; default: break; } Index: cfe/trunk/test/Index/ms-property.cpp =================================================================== --- cfe/trunk/test/Index/ms-property.cpp +++ cfe/trunk/test/Index/ms-property.cpp @@ -0,0 +1,32 @@ +// RUN: c-index-test core -print-source-symbols -- -fms-extensions -fno-ms-compatibility %s | FileCheck %s + +// CHECK: [[@LINE+1]]:8 | struct/C++ | Simple | [[Simple_USR:.*]] | | Def | rel: 0 +struct Simple { + int GetX() const; + // CHECK: [[@LINE-1]]:7 | instance-method/C++ | GetX | [[GetX_USR:.*]] | __ZNK6Simple4GetXEv | Decl,RelChild | rel: 1 + // CHECK-NEXT: RelChild | Simple | [[Simple_USR]] + + void PutX(int i); + // CHECK: [[@LINE-1]]:8 | instance-method/C++ | PutX | [[PutX_USR:.*]] | __ZN6Simple4PutXEi | Decl,RelChild | rel: 1 + // CHECK-NEXT: RelChild | Simple | [[Simple_USR]] + + __declspec(property(get=GetX, put=PutX)) int propX; + // CHECK: [[@LINE-1]]:48 | instance-property/C++ | propX | [[propX_USR:.*]] | | Def,RelChild | rel: 1 + // CHECK-NEXT: RelChild | Simple | [[Simple_USR]] +}; + +// CHECK: [[@LINE+1]]:5 | function/C | test | [[test_USR:.*]] | __Z4testv | Def | rel: 0 +int test() { + Simple s; + s.propX = 5; + // CHECK: [[@LINE-1]]:5 | instance-property/C++ | propX | [[propX_USR]] | | Ref,RelCont | rel: 1 + // CHECK-NEXT: RelCont | test | [[test_USR]] + // CHECK: [[@LINE-3]]:5 | instance-method/C++ | PutX | [[PutX_USR]] | __ZN6Simple4PutXEi | Ref,Call,RelCall,RelCont | rel: 1 + // CHECK-NEXT: RelCall,RelCont | test | [[test_USR]] + + return s.propX; + // CHECK: [[@LINE-1]]:12 | instance-property/C++ | propX | [[propX_USR]] | | Ref,RelCont | rel: 1 + // CHECK-NEXT: RelCont | test | [[test_USR]] + // CHECK: [[@LINE-3]]:12 | instance-method/C++ | GetX | [[GetX_USR]] | __ZNK6Simple4GetXEv | Ref,Call,RelCall,RelCont | rel: 1 + // CHECK-NEXT: RelCall,RelCont | test | [[test_USR]] +}