diff --git a/src/lsp.hh b/src/lsp.hh index b92578b8..b474fee0 100644 --- a/src/lsp.hh +++ b/src/lsp.hh @@ -261,6 +261,13 @@ struct ShowMessageParam { // Used to identify the language at a file level. The ordering is important, as // a file previously identified as `C`, will be changed to `Cpp` if it // encounters a c++ declaration. -enum class LanguageId { Unknown = -1, C = 0, Cpp = 1, ObjC = 2, ObjCpp = 3 }; +enum class LanguageId { + Unknown = -1, + C = 0, + Cpp = 1, + ObjC = 2, + ObjCpp = 3, + Cuda = 4, +}; } // namespace ccls diff --git a/src/project.cc b/src/project.cc index fca2bb83..43fedd7b 100644 --- a/src/project.cc +++ b/src/project.cc @@ -60,7 +60,8 @@ std::pair lookupExtension(std::string_view filename) { bool objc = types::isObjC(I); LanguageId ret; if (types::isCXX(I)) - ret = objc ? LanguageId::ObjCpp : LanguageId::Cpp; + ret = types::isCuda(I) ? LanguageId::Cuda + : objc ? LanguageId::ObjCpp : LanguageId::Cpp; else if (objc) ret = LanguageId::ObjC; else if (I == types::TY_C || I == types::TY_CHeader) @@ -117,6 +118,8 @@ struct ProjectProcessor { ok |= lang == LanguageId::C && header; else if (A.consume_front("%cpp ")) ok |= lang == LanguageId::Cpp; + else if (A.consume_front("%cu ")) + ok |= lang == LanguageId::Cuda; else if (A.consume_front("%hpp ")) ok |= lang == LanguageId::Cpp && header; else if (A.consume_front("%objective-c ")) @@ -128,6 +131,9 @@ struct ProjectProcessor { } if (ok) args.push_back(A.data()); + } else if (A.startswith("-M")) { + if (A == "-MF" || A == "-MT" || A == "-MQ") + i++; } else if (!ExcludesArg(A)) { args.push_back(arg); }