Index: plugins/astyle/astyle_plugin.cpp =================================================================== --- plugins/astyle/astyle_plugin.cpp +++ plugins/astyle/astyle_plugin.cpp @@ -101,6 +101,9 @@ {QStringLiteral("text/x-csrc"), QStringLiteral("C")}, {QStringLiteral("text/x-java"), QStringLiteral("Java")}, {QStringLiteral("text/x-csharp"), QStringLiteral("C#")}, + {QStringLiteral("text/x-objchdr"), QStringLiteral("ObjC")}, + {QStringLiteral("text/x-objcsrc"), QStringLiteral("ObjC")}, + {QStringLiteral("text/x-objc++src"), QStringLiteral("ObjC++")}, }; } Index: plugins/clang/duchain/builder.cpp =================================================================== --- plugins/clang/duchain/builder.cpp +++ plugins/clang/duchain/builder.cpp @@ -1202,7 +1202,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; } @@ -1221,9 +1221,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); @@ -1560,13 +1560,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/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)) { @@ -107,7 +104,12 @@ return {QByteArrayLiteral("-xcuda")}; } - if (parserSettings.parserOptions.isEmpty()) { + QByteArray objcOption; + if (mimeType == QStringLiteral("text/x-objcsrc")) { + objcOption = QByteArrayLiteral(" -ObjC"); + } else if (mimeType == QStringLiteral("text/x-objc++src")) { + objcOption = QByteArrayLiteral("-xobjective-c++"); + } else if (parserSettings.parserOptions.isEmpty()) { // The parserOptions can be empty for some unit tests that use ParseSession directly auto defaultArguments = ClangSettingsManager::self()->parserSettings(path).toClangAPI(); @@ -132,7 +134,11 @@ return result; } - result.append(parserSettings.isCpp() ? QByteArrayLiteral("-xc++") : QByteArrayLiteral("-xc")); + if (!objcOption.isEmpty()) { + result.append(objcOption); + } else { + result.append(parserSettings.isCpp() ? QByteArrayLiteral("-xc++") : QByteArrayLiteral("-xc")); + } sanitizeArguments(result); return result; Index: plugins/clang/kdevclangsupport.json =================================================================== --- plugins/clang/kdevclangsupport.json +++ plugins/clang/kdevclangsupport.json @@ -70,6 +70,9 @@ "text/x-c++src", "text/x-opencl-src", "text/vnd.nvidia.cuda.csrc", - "text/x-objcsrc" + "text/x-objcsrc", + "text/x-objchdr", + "text/x-objcsrc", + "text/x-objc++src" ] }