Skip to content

Commit 535fa3d

Browse files
committed
Cached project_file_name
1 parent ba69858 commit 535fa3d

File tree

1 file changed

+48
-40
lines changed

1 file changed

+48
-40
lines changed

SublimeCodeIntel.py

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,6 +1211,7 @@ def __init__(self):
12111211
self.user_settings_file = None
12121212
self.sublime_settings_file = None
12131213
self.sublime_auto_complete = None
1214+
self.project_file_names = {}
12141215

12151216
def loadSublimeSettings(self):
12161217
self.sublime_settings_file = sublime.load_settings('Preferences.sublime-settings')
@@ -1235,57 +1236,64 @@ def project_data(self):
12351236
data = data.replace('\t', ' ')
12361237
return json.loads(data, strict=False)
12371238

1239+
def _check_project_file_name(self, folders, session_filename):
1240+
try:
1241+
with open(session_filename) as fp:
1242+
data = json.load(fp, strict=False)
1243+
except IOError:
1244+
return
1245+
try:
1246+
projects = data['workspaces']['recent_workspaces']
1247+
except KeyError:
1248+
return
1249+
1250+
for project_file in projects:
1251+
try:
1252+
with open(project_file) as fp:
1253+
project_json = json.load(fp, strict=False)
1254+
except IOError:
1255+
pass
1256+
else:
1257+
project_path = os.path.dirname(project_file)
1258+
try:
1259+
project_folders = set(os.path.realpath(os.path.join(project_path, f['path'])) for f in project_json['folders'])
1260+
except KeyError:
1261+
pass
1262+
else:
1263+
if project_folders == folders:
1264+
return project_file
1265+
12381266
def project_file_name(self):
12391267
"""
12401268
ST2/ST3-compatible wrapper for getting the project file for a window, made possible with
12411269
titoBouzout's getProjectFile method in SideBarEnhancements (refactored to project_file_name)
12421270
"""
12431271
window = sublime.active_window()
12441272
if not window:
1245-
return None
1273+
return
12461274
if hasattr(window, 'project_file_name'):
12471275
return window.project_file_name()
1248-
if not window.folders():
1249-
return None
1250-
session_filename = os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings', 'Session.sublime_session'))
1251-
try:
1252-
data = file(session_filename, 'r').read()
1253-
except IOError:
1254-
projects = []
1255-
else:
1256-
data = data.decode('utf-8').replace('\t', ' ')
1257-
data = json.loads(data, strict=False)
1258-
projects = data['workspaces']['recent_workspaces']
1259-
autosave_filename = os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings', 'Auto Save Session.sublime_session'))
1276+
wid = window.id()
12601277
try:
1261-
data = file(autosave_filename, 'r').read()
1262-
except IOError:
1278+
return self.project_file_names[wid]
1279+
except KeyError:
12631280
pass
1264-
else:
1265-
data = data.decode('utf-8').replace('\t', ' ')
1266-
data = json.loads(data, strict=False)
1267-
if hasattr(data, 'workspaces') and hasattr(data['workspaces'], 'recent_workspaces') and data['workspaces']['recent_workspaces']:
1268-
projects += data['workspaces']['recent_workspaces']
1269-
projects = list(set(projects))
1270-
for project_file in projects:
1271-
project_file = re.sub(r'^/([^/])/', '\\1:/', project_file)
1272-
project_json = json.loads(file(project_file, 'r').read(), strict=False)
1273-
if 'folders' in project_json:
1274-
folders = project_json['folders']
1275-
found_all = True
1276-
for directory in window.folders():
1277-
found = False
1278-
for folder in folders:
1279-
folder_path = re.sub(r'^/([^/])/', '\\1:/', folder['path'])
1280-
if folder_path == directory.replace('\\', '/'):
1281-
found = True
1282-
break
1283-
if not found:
1284-
found_all = False
1285-
break
1286-
if found_all:
1287-
return project_file
1288-
return None
1281+
folders = window.folders()
1282+
if not folders:
1283+
return
1284+
settings_path = os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings'))
1285+
1286+
folders = set(os.path.realpath(f) for f in folders)
1287+
1288+
session_filename = os.path.join(settings_path, 'Session.sublime_session')
1289+
project_file_name = self._check_project_file_name(folders, session_filename)
1290+
1291+
# if not project_file_name:
1292+
# session_filename = os.path.join(settings_path, 'Auto Save Session.sublime_session')
1293+
# project_file_name = self._check_project_file_name(folders, session_filename)
1294+
1295+
self.project_file_names[wid] = project_file_name
1296+
return project_file_name
12891297

12901298
def get(self, config_key, default=None, language=None):
12911299
if language is not None:

0 commit comments

Comments
 (0)