diff --git a/src/serena/agent.py b/src/serena/agent.py index 53ed791b..14ec2d0a 100644 --- a/src/serena/agent.py +++ b/src/serena/agent.py @@ -540,15 +540,22 @@ class SerenaAgent: ls_specific_settings=self.serena_config.ls_specific_settings, ) - def add_language(self, language: Language) -> None: + def add_language(self, language: Language, wait_for_ls_startup: bool = False) -> None: """ Adds a new language to the active project, spawning the respective language server and updating the project configuration. The addition is scheduled via the agent's task executor and executed synchronously, i.e. the method returns when the addition is complete. :param language: the language to add + :param wait_for_ls_startup: whether to wait for the language server to start up before returning (synchronous execution) + or to just issue the addition task and return immediately (asynchronous execution) """ - self.execute_task(lambda: self.get_active_project_or_raise().add_language(language), name=f"AddLanguage:{language.value}") + task = lambda: self.get_active_project_or_raise().add_language(language) + task_name = f"AddLanguage:{language.value}" + if wait_for_ls_startup: + self.execute_task(task, name=task_name) + else: + self.issue_task(task, name=task_name) def get_tool(self, tool_class: type[TTool]) -> TTool: return self._all_tools[tool_class] # type: ignore diff --git a/src/serena/project.py b/src/serena/project.py index 758b7bf7..75b0d8e6 100644 --- a/src/serena/project.py +++ b/src/serena/project.py @@ -405,6 +405,9 @@ class Project(ToStringMixin): if language in self.project_config.languages: log.info(f"Language {language.value} is already present in the project configuration.") return + # update the project configuration + self.project_config.languages.append(language) + self.save_config() # start the language server (if the LS manager is active) if self.language_server_manager is None: @@ -413,10 +416,6 @@ class Project(ToStringMixin): log.info("Adding and starting the language server for new language %s ...", language.value) self.language_server_manager.add_language_server(language) - # update the project configuration - self.project_config.languages.append(language) - self.save_config() - def shutdown(self) -> None: if self.language_server_manager is not None: self.language_server_manager.stop_all(save_cache=True)