From 83d19905d0ef451073b4d9eb8f7356499f58c4da Mon Sep 17 00:00:00 2001 From: TiM Date: Mon, 29 Jun 2026 00:48:55 +1200 Subject: [PATCH] solidlsp: recognize Arduino .ino files as C++ (#1534) --- src/solidlsp/ls_config.py | 7 +++++++ test/solidlsp/cpp/test_cpp_basic.py | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/solidlsp/ls_config.py b/src/solidlsp/ls_config.py index 9d36b453..8bda4dc9 100644 --- a/src/solidlsp/ls_config.py +++ b/src/solidlsp/ls_config.py @@ -361,6 +361,11 @@ class Language(str, Enum): # OpenCL ".cl", ".clcpp", + # Arduino sketch: not in clang's extension table, but it is C++. + # Routing it here lets clangd serve symbols; the project must + # tell clangd it is C++ (a .clangd with CompileFlags Add: [-xc++], + # or a compile DB), since the clang driver can't infer a job from .ino. + ".ino", case_sensitive=False, ) case self.CPP_CCLS: @@ -386,6 +391,8 @@ class Language(str, Enum): # Objective-C ".m", ".mm", + # Arduino sketch (C++); see note in the CPP case above. + ".ino", case_sensitive=False, ) case self.KOTLIN: diff --git a/test/solidlsp/cpp/test_cpp_basic.py b/test/solidlsp/cpp/test_cpp_basic.py index 21b90452..749efcac 100644 --- a/test/solidlsp/cpp/test_cpp_basic.py +++ b/test/solidlsp/cpp/test_cpp_basic.py @@ -24,6 +24,20 @@ if language_tests_enabled(Language.CPP_CCLS): _cpp_servers.append(Language.CPP_CCLS) +@pytest.mark.parametrize("language", [Language.CPP, Language.CPP_CCLS]) +def test_source_fn_matcher_includes_ino(language: Language) -> None: + """Arduino .ino sketches are C++ and must route to the C++ language server. + + This is a pure matcher check; it needs no running language server. + """ + matcher = language.get_source_fn_matcher() + assert matcher.is_relevant_filename("sketch.ino") + assert matcher.is_relevant_filename("BLINK.INO") # case-insensitive + assert matcher.is_relevant_filename("/path/to/s3_camera.ino") + assert matcher.is_relevant_filename("main.cpp") # regression: ordinary C++ still matches + assert not matcher.is_relevant_filename("notes.md") + + @pytest.mark.cpp @pytest.mark.skipif(not _cpp_servers, reason="No C++ language server (clangd or ccls) available") class TestCppLanguageServer: