From 30cdbbf170c0d91859592ff3d6458107a96e3f90 Mon Sep 17 00:00:00 2001 From: doe300 Date: Sat, 23 Aug 2025 09:41:04 +0200 Subject: [PATCH 1/2] Add detection of .mm files as Objective-C This is a common file extension for Objective-C++ files. --- src/source.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/source.cpp b/src/source.cpp index 9965573..98b4ea1 100644 --- a/src/source.cpp +++ b/src/source.cpp @@ -83,6 +83,8 @@ Glib::RefPtr Source::guess_language(const boost::filesystem::path language = language_manager->get_language("glsl"); else if(extension == ".in" || extension == ".bak") return guess_language(boost::filesystem::path(file_path).replace_extension()); + else if(extension == ".mm") + language = language_manager->get_language("objc"); else if(!file_path.has_extension() && std::any_of(file_path.begin(), file_path.end(), [](const boost::filesystem::path &path) { return path == "include"; })) language = language_manager->get_language("cpphdr"); From 598fdee582572d9ccf25e7ba09457ff7aeae2133 Mon Sep 17 00:00:00 2001 From: doe300 Date: Sat, 23 Aug 2025 09:42:26 +0200 Subject: [PATCH 2/2] Try to detect .m files as Objective-C They are detected as Octave, but *.m is also used for Objective-C. --- src/source.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/source.cpp b/src/source.cpp index 98b4ea1..9b7c5cc 100644 --- a/src/source.cpp +++ b/src/source.cpp @@ -103,6 +103,19 @@ Glib::RefPtr Source::guess_language(const boost::filesystem::path } else if(language->get_id() == "opencl") language = language_manager->get_language("cpp"); + else if(language->get_id() == "octave" && extension == ".m") { + // .m is used for both Octave and Objective-C, so try to differentiate + std::ifstream input(file_path.string(), std::ios::binary); + std::string buffer(256, '\0'); + input.read(&buffer[0], static_cast(buffer.size())); + buffer.resize(static_cast(input.gcount())); + if(input && (buffer.find("#import ") != std::string::npos || + buffer.find("@interface ") != std::string::npos || + buffer.find("/*") != std::string::npos || + buffer.find("//") != std::string::npos)) { + language = language_manager->get_language("objc"); + } + } return language; }