{"record":{"id":"d78f023d36c38171","repo":"oraios/serena","slug":"no-language-server-for-language-language-value-p-d78f02","errorCode":null,"errorMessage":"No language server for language {language.value} present; cannot remove","messagePattern":"No language server for language (.+?) present; cannot remove","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/serena/ls_manager.py","lineNumber":221,"sourceCode":"    def add_language_server(self, ls_id: LanguageServerId) -> SolidLanguageServer:\n        \"\"\"\n        Dynamically adds a new language server for the given language.\n\n        :param ls_id: the language server to add\n        :return: the newly created language server\n        \"\"\"\n        if ls_id in self._language_servers:\n            raise ValueError(f\"Language server for language {ls_id.value} already present\")\n        return self._create_and_start_language_server(ls_id)\n\n    def remove_language_server(self, language: LanguageServerId, save_cache: bool = False) -> None:\n        \"\"\"\n        Removes the language server for the given language, stopping it if it is running.\n\n        :param language: the language\n        \"\"\"\n        if language not in self._language_servers:\n            raise ValueError(f\"No language server for language {language.value} present; cannot remove\")\n        ls = self._language_servers.pop(language)\n        self._stop_language_server(ls, save_cache=save_cache)\n\n    def get_active_language_server_ids(self) -> list[LanguageServerId]:\n        \"\"\"\n        Returns the list of languages for which language servers are currently managed.\n\n        :return: list of languages\n        \"\"\"\n        return list(self._language_servers.keys())\n\n    @staticmethod\n    def _stop_language_server(ls: SolidLanguageServer, save_cache: bool = False, timeout: float = 2.0) -> None:\n        if ls.is_running():\n            if save_cache:\n                ls.save_cache()\n            log.info(f\"Stopping language server for language {ls.ls_id} ...\")\n            ls.stop(shutdown_timeout=timeout)","sourceCodeStart":203,"sourceCodeEnd":239,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/ls_manager.py#L203-L239","documentation":"remove_language_server only removes languages currently tracked in _language_servers and raises ValueError for absent ones. After removal the server is stopped (optionally saving its cache). This error indicates the manager state doesn't match the caller's expectation.","triggerScenarios":"Calling remove_language_server for a language never added, already removed, or never started because from_languages failed for it.","commonSituations":"Teardown code unconditionally removing all configured languages; double cleanup after an exception path already stopped servers; removing a language whose startup failed in from_languages (manager never created).","solutions":["Check language in get_active_language_server_ids() before removing","Make cleanup idempotent: catch ValueError and continue","Track which languages were successfully added before tearing down"],"exampleFix":"// before\nfor lang in configured_languages:\n    manager.remove_language_server(lang)  # raises if absent\n// after\nfor lang in manager.get_active_language_server_ids():\n    manager.remove_language_server(lang)","handlingStrategy":"validation","validationCode":"active = manager.get_active_language_server_ids()\nfor lang in active:\n    manager.remove_language_server(lang)","typeGuard":null,"tryCatchPattern":"try:\n    manager.remove_language_server(language)\nexcept ValueError as e:\n    if \"cannot remove\" in str(e):\n        pass  # already gone; cleanup is idempotent\n    else:\n        raise","preventionTips":["Derive cleanup list from get_active_language_server_ids(), not config","Make shutdown routines idempotent","Track which languages were successfully added before removal","Guard against double teardown after prior exceptions"],"tags":["language-server","cleanup","state-management"],"backgroundTag":"resource-not-found","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}