Index: plugins/clang/duchain/builder.cpp =================================================================== --- plugins/clang/duchain/builder.cpp +++ plugins/clang/duchain/builder.cpp @@ -1204,7 +1204,7 @@ CXChildVisitResult Visitor::buildUse(CXCursor cursor) { m_uses[m_parentContext->context].push_back(cursor); - return cursor.kind == CXCursor_DeclRefExpr || cursor.kind == CXCursor_MemberRefExpr ? + return cursor.kind == CXCursor_DeclRefExpr || cursor.kind == CXCursor_MemberRefExpr || cursor.kind == CXCursor_ObjCMessageExpr? CXChildVisit_Recurse : CXChildVisit_Continue; } @@ -1223,9 +1223,9 @@ template CXChildVisitResult Visitor::buildCompoundStatement(CXCursor cursor) { - if (CK == CXCursor_LambdaExpr || m_parentContext->context->type() == DUContext::Function) + if (CK == CXCursor_LambdaExpr || CK == CXCursor_BlockExpr || m_parentContext->context->type() == DUContext::Function) { - auto context = createContext(cursor); + auto context = createContext(cursor); CurrentContext newParent(context, m_parentContext->keepAliveContexts); PushValue pushCurrent(m_parentContext, &newParent); clang_visitChildren(cursor, &visitCursor, this); @@ -1562,13 +1562,16 @@ case CXCursor_DeclRefExpr: case CXCursor_MemberRefExpr: case CXCursor_ObjCClassRef: + case CXCursor_ObjCMessageExpr: return visitor->buildUse(cursor); case CXCursor_MacroExpansion: return visitor->buildMacroExpansion(cursor); case CXCursor_CompoundStmt: return visitor->buildCompoundStatement(cursor); case CXCursor_LambdaExpr: return visitor->buildCompoundStatement(cursor); + case CXCursor_BlockExpr: + return visitor->buildCompoundStatement(cursor); case CXCursor_CXXBaseSpecifier: return visitor->buildCXXBaseSpecifier(cursor); case CXCursor_ParmDecl: Index: plugins/clang/duchain/cursorkindtraits.h =================================================================== --- plugins/clang/duchain/cursorkindtraits.h +++ plugins/clang/duchain/cursorkindtraits.h @@ -55,6 +55,19 @@ || CK == CXCursor_ObjCCategoryImplDecl; } +// TODO: somehow this is (probably) the function to call in isKDevForwardDeclaration() but +// I cannot seem to understand how to achieve that without raising a ton of +// uncomprehensible errors in builder.cpp (I can't even remove the ObjC cursor +// kinds from the isClass function above?!) +// TODO: remove this comment. +constexpr bool isClassNoObjC(CXCursorKind CK) +{ + return isClassTemplate(CK) + || CK == CXCursor_StructDecl + || CK == CXCursor_ClassDecl + || CK == CXCursor_UnionDecl; +} + constexpr bool isFunction(CXCursorKind CK) { return CK == CXCursor_FunctionDecl Index: plugins/clang/duchain/documentfinderhelpers.cpp =================================================================== --- plugins/clang/duchain/documentfinderhelpers.cpp +++ plugins/clang/duchain/documentfinderhelpers.cpp @@ -179,9 +179,11 @@ static const QStringList mimeTypes = { QStringLiteral("text/x-chdr"), QStringLiteral("text/x-c++hdr"), + QStringLiteral("text/x-objchdr"), QStringLiteral("text/x-csrc"), QStringLiteral("text/x-c++src"), - QStringLiteral("text/x-objcsrc") + QStringLiteral("text/x-objcsrc"), + QStringLiteral("text/x-objc++src") }; return mimeTypes; } Index: plugins/clang/duchain/parsesession.cpp =================================================================== --- plugins/clang/duchain/parsesession.cpp +++ plugins/clang/duchain/parsesession.cpp @@ -91,10 +91,7 @@ QVector argsForSession(const QString& path, ParseSessionData::Options options, const ParserSettings& parserSettings) { QMimeDatabase db; - if(db.mimeTypeForFile(path).name() == QStringLiteral("text/x-objcsrc")) { - return {QByteArrayLiteral("-xobjective-c++")}; - } - + QString mimeType = db.mimeTypeForFile(path).name(); // TODO: No proper mime type detection possible yet // cf. https://bugs.freedesktop.org/show_bug.cgi?id=26913 if (path.endsWith(QLatin1String(".cl"), Qt::CaseInsensitive)) { @@ -132,7 +129,15 @@ return result; } - result.append(parserSettings.isCpp() ? QByteArrayLiteral("-xc++") : QByteArrayLiteral("-xc")); + if (mimeType == QStringLiteral("text/x-objc++src")) { + result.append(QByteArrayLiteral("-xobjective-c++")); + } else if (mimeType == QStringLiteral("text/x-objcsrc")) { + result.append(QByteArrayLiteral(" -ObjC")); + } else if (parserSettings.isCpp()) { + result.append(QByteArrayLiteral("-xc++")); + } else { + result.append(QByteArrayLiteral("-xc")); + } sanitizeArguments(result); return result; Index: plugins/clang/kdevclangsupport.json =================================================================== --- plugins/clang/kdevclangsupport.json +++ plugins/clang/kdevclangsupport.json @@ -59,17 +59,20 @@ "C++", "OpenCL C", "CUDA C", - "Objective-C" + "Objective-C", + "Objective-C++" ], "X-KDevelop-LoadMode": "AlwaysOn", "X-KDevelop-Mode": "NoGUI", "X-KDevelop-SupportedMimeTypes": [ "text/x-chdr", "text/x-c++hdr", + "text/x-objchdr", "text/x-csrc", "text/x-c++src", + "text/x-objcsrc", + "text/x-objc++src", "text/x-opencl-src", - "text/vnd.nvidia.cuda.csrc", - "text/x-objcsrc" + "text/vnd.nvidia.cuda.csrc" ] }