diff --git a/src/solidlsp/language_servers/perl_language_server.py b/src/solidlsp/language_servers/perl_language_server.py index 3edb9bca..c2e40b39 100644 --- a/src/solidlsp/language_servers/perl_language_server.py +++ b/src/solidlsp/language_servers/perl_language_server.py @@ -28,6 +28,10 @@ class PerlLanguageServer(SolidLanguageServer): Provides Perl specific instantiation of the LanguageServer class using Perl::LanguageServer. """ + # Keep in sync with Language.PERL.get_source_fn_matcher() in solidlsp/ls_config.py: + # extensions missing here are invisible to Perl::LanguageServer's project index. + _FILE_FILTER: list = [".pm", ".pl", ".t"] + @staticmethod def _get_perl_version() -> str | None: """Get the installed Perl version or None if not found.""" @@ -162,7 +166,7 @@ class PerlLanguageServer(SolidLanguageServer): perl_config = { "perlInc": [self.repository_root_path, "."], - "fileFilter": [".pm", ".pl"], + "fileFilter": self._FILE_FILTER, "ignoreDirs": [".git", ".svn", "blib", "local", ".carton", "vendor", "_build", "cover_db"], } @@ -198,7 +202,7 @@ class PerlLanguageServer(SolidLanguageServer): "settings": { "perl": { "perlInc": [self.repository_root_path, "."], - "fileFilter": [".pm", ".pl"], + "fileFilter": self._FILE_FILTER, "ignoreDirs": [".git", ".svn", "blib", "local", ".carton", "vendor", "_build", "cover_db"], } } diff --git a/test/resources/repos/perl/test_repo/helper.t b/test/resources/repos/perl/test_repo/helper.t new file mode 100644 index 00000000..0887b182 --- /dev/null +++ b/test/resources/repos/perl/test_repo/helper.t @@ -0,0 +1,12 @@ +#!/usr/bin/env perl + +use lib '.'; +use strict; +use warnings; + +use Test::More tests => 1; + +require helper; + +helper_function(); +ok(1, 'helper_function callable from .t file'); diff --git a/test/solidlsp/perl/test_perl_basic.py b/test/solidlsp/perl/test_perl_basic.py index efb01d01..9ba29cfb 100644 --- a/test/solidlsp/perl/test_perl_basic.py +++ b/test/solidlsp/perl/test_perl_basic.py @@ -77,6 +77,14 @@ class TestPerlLanguageServer: assert 17 in main_pl_lines, f"Expected reference at line 18 (0-indexed 17), found: {main_pl_lines}" assert 20 in main_pl_lines, f"Expected reference at line 21 (0-indexed 20), found: {main_pl_lines}" + @pytest.mark.parametrize("language_server", [Language.PERL], indirect=True) + def test_find_references_includes_t_files(self, language_server: SolidLanguageServer) -> None: + """References to a .pm/.pl sub must surface callers in .t test files (fileFilter includes .t).""" + reference_locations = language_server.request_references("helper.pl", 4, 5) + + t_refs = [ref for ref in reference_locations if ref["uri"].endswith(".t")] + assert t_refs, f"Expected at least one reference in a .t file, got: {[r['uri'] for r in reference_locations]}" + @pytest.mark.parametrize("language_server", [Language.PERL], indirect=True) def test_bare_symbol_names(self, language_server) -> None: all_symbols = request_all_symbols(language_server)