From 7a3187976a47df50704343aedee4bd00fc720d60 Mon Sep 17 00:00:00 2001 From: Randy Eckman Date: Sat, 20 Jan 2024 22:47:00 -0600 Subject: [PATCH] allow dollar in symbol names --- fortls/parsers/internal/parser.py | 8 ++++---- fortls/regex_patterns.py | 4 ++-- test/test_server_hover.py | 11 +++++++++++ test/test_source/hover/parameters.f90 | 1 + 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/fortls/parsers/internal/parser.py b/fortls/parsers/internal/parser.py index ae5cfa1e..9c4c4558 100644 --- a/fortls/parsers/internal/parser.py +++ b/fortls/parsers/internal/parser.py @@ -2045,9 +2045,9 @@ def replace_defined(line: str): out_line = "" for match in FRegex.DEFINED.finditer(line): if match.group(1) in defs: - out_line += line[i0 : match.start(0)] + "($@)" + out_line += line[i0 : match.start(0)] + "(@$@)" else: - out_line += line[i0 : match.start(0)] + "($%)" + out_line += line[i0 : match.start(0)] + "(%$%)" i0 = match.end(0) if i0 < len(line): out_line += line[i0:] @@ -2064,8 +2064,8 @@ def replace_vars(line: str): i0 = match.end(0) if i0 < len(line): out_line += line[i0:] - out_line = out_line.replace("$@", "True") - out_line = out_line.replace("$%", "False") + out_line = out_line.replace("@$@", "True") + out_line = out_line.replace("%$%", "False") return out_line if defs is None: diff --git a/fortls/regex_patterns.py b/fortls/regex_patterns.py index 6f590402..69c10f48 100644 --- a/fortls/regex_patterns.py +++ b/fortls/regex_patterns.py @@ -98,7 +98,7 @@ class FortranRegularExpressions: r"[ ]*,[ ]*(PUBLIC|PRIVATE|ABSTRACT|EXTENDS\(\w*\))", I ) VIS: Pattern = compile(r"[ ]*\b(PUBLIC|PRIVATE)\b", I) - WORD: Pattern = compile(r"[a-z_]\w*", I) + WORD: Pattern = compile(r"[a-z_][\w\$]*", I) NUMBER: Pattern = compile( r"[\+\-]?(\b\d+\.?\d*|\.\d+)(_\w+|d[\+\-]?\d+|e[\+\-]?\d+(_\w+)?)?(?!\w)", I, @@ -146,7 +146,7 @@ class FortranRegularExpressions: # Object regex patterns CLASS_VAR: Pattern = compile(r"(TYPE|CLASS)[ ]*\(", I) DEF_KIND: Pattern = compile(r"(\w*)[ ]*\((?:KIND|LEN)?[ =]*(\w*)", I) - OBJBREAK: Pattern = compile(r"[\/\-(.,+*<>=$: ]", I) + OBJBREAK: Pattern = compile(r"[\/\-(.,+*<>=: ]", I) # TODO: use this in the main code diff --git a/test/test_server_hover.py b/test/test_server_hover.py index c995e127..172b76b8 100644 --- a/test/test_server_hover.py +++ b/test/test_server_hover.py @@ -70,6 +70,17 @@ def test_hover_parameter(): validate_hover(results, ref_results) +def test_hover_parameter_dollar(): + """Test that hover parameters with dollar in name are recognized correctly""" + string = write_rpc_request(1, "initialize", {"rootPath": str(test_dir)}) + file_path = test_dir / "hover" / "parameters.f90" + string += hover_req(file_path, 20, 31) + errcode, results = run_request(string, fortls_args=["--sort_keywords"]) + assert errcode == 0 + ref_results = ["```fortran90\nINTEGER(4), PARAMETER :: SIG$ERR = -1\n```"] + validate_hover(results, ref_results) + + def test_hover_parameter_eqnospace(): """Test that hover parameters display value correctly""" string = write_rpc_request(1, "initialize", {"rootPath": str(test_dir)}) diff --git a/test/test_source/hover/parameters.f90 b/test/test_source/hover/parameters.f90 index c0189055..e40cdbe5 100644 --- a/test/test_source/hover/parameters.f90 +++ b/test/test_source/hover/parameters.f90 @@ -18,4 +18,5 @@ program params INTEGER, PARAMETER :: var_multi2 = 1 * & 23 + & 2 /1 ! comment + INTEGER(4), PARAMETER :: SIG$ERR = -1 end program params