diff --git a/fortls/langserver.py b/fortls/langserver.py index b6a1982e..c11f60c4 100644 --- a/fortls/langserver.py +++ b/fortls/langserver.py @@ -1489,7 +1489,14 @@ def workspace_init(self): pool.close() pool.join() for path, result in results.items(): - result_obj = result.get() + try: + result_obj = result.get() + except Exception as e: + result_obj = ( + "An exception has occured while initialising the workspace.\n" + f"Exception({(type(e))}): {e}\n" + + f"Traceback: {traceback.format_exc()}" + ) if isinstance(result_obj, str): self.post_message( f"Initialization failed for file {path}: {result_obj}" diff --git a/test/test_server_init.py b/test/test_server_init.py new file mode 100644 index 00000000..9573f498 --- /dev/null +++ b/test/test_server_init.py @@ -0,0 +1,32 @@ +import os +import tempfile + +import pytest +from setup_tests import Path, run_request, write_rpc_request + +from fortls.constants import Severity + + +@pytest.fixture() +def setup_tmp_file(): + levels = 2000 + fd, filename = tempfile.mkstemp(suffix=".f90") + try: + with os.fdopen(fd, "w") as tmp: + tmp.write( + "program nested_if\n" + + str("if (.true.) then\n" * levels) + + str("end if\n" * levels) + + "end program nested_if" + ) + yield filename + finally: + os.remove(filename) + + +def test_recursion_error_handling(setup_tmp_file): + root = Path(setup_tmp_file).parent + request_string = write_rpc_request(1, "initialize", {"rootPath": str(root)}) + errcode, results = run_request(request_string) + assert errcode == 0 + assert results[0]["type"] == Severity.error