33import asyncio
44import os
55import re
6+ from pathlib import Path
67from typing import (
78 TYPE_CHECKING ,
89 Any ,
@@ -119,7 +120,7 @@ async def _file_watcher(self, sender: Any, changes: List[FileEvent]) -> None:
119120 loop = self .parent .loop ,
120121 )
121122
122- async def read_document_text (self , uri : Uri , language_id : Union [str , Callable [[Any ], bool ]]) -> str :
123+ async def read_document_text (self , uri : Uri , language_id : Union [str , Callable [[Any ], bool ], None ]) -> str :
123124 for e in await self .on_read_document_text (
124125 self , uri , callback_filter = language_id_filter (language_id ) if isinstance (language_id , str ) else language_id
125126 ):
@@ -128,9 +129,18 @@ async def read_document_text(self, uri: Uri, language_id: Union[str, Callable[[A
128129
129130 raise FileNotFoundError (str (uri ))
130131
132+ def detect_language_id (self , path_or_uri : Union [str , os .PathLike [Any ], Uri ]) -> str :
133+ path = path_or_uri .to_path () if isinstance (path_or_uri , Uri ) else Path (path_or_uri )
134+
135+ for lang in self .parent .languages :
136+ if path .suffix in lang .extensions :
137+ return lang .id
138+
139+ return "unknown"
140+
131141 @_logger .call
132142 async def get_or_open_document (
133- self , path : Union [str , os .PathLike [Any ]], language_id : str , version : Optional [int ] = None
143+ self , path : Union [str , os .PathLike [Any ]], language_id : Optional [ str ] = None , version : Optional [int ] = None
134144 ) -> TextDocument :
135145 uri = Uri .from_path (path ).normalized ()
136146
@@ -141,7 +151,7 @@ async def get_or_open_document(
141151 try :
142152 return await self .parent .documents .append_document (
143153 document_uri = DocumentUri (uri ),
144- language_id = language_id ,
154+ language_id = language_id or self . detect_language_id ( path ) ,
145155 text = await self .read_document_text (uri , language_id ),
146156 version = version ,
147157 )
0 commit comments