Skip to content

Commit fc9f5f8

Browse files
committed
check valid virtual file
1 parent d514560 commit fc9f5f8

File tree

11 files changed

+119
-130
lines changed

11 files changed

+119
-130
lines changed

ide-common/src/main/kotlin/org/digma/intellij/plugin/document/DocumentInfoStorage.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,16 @@ class DocumentInfoStorage(private val project: Project) {
4242
//initially I wanted to keep putDocumentInfo internal because there is no reason to put a documentInfo from other classes
4343
// other than EditorDocumentService. but this is a solution for the Rider issue. see comment in call site.
4444
fun updateDocumentInfoForRider(file: VirtualFile, documentInfo: DocumentInfo) {
45-
if (logger.isTraceEnabled) {
46-
Log.log(logger::trace, "updateDocumentInfoForRider: {} , DocumentInfo:[{}]", file, documentInfo)
47-
}
45+
Log.trace(logger, project, "updateDocumentInfoForRider: {} , DocumentInfo:[{}]", file, documentInfo)
4846
putDocumentInfo(file, documentInfo)
4947
}
5048

5149
internal fun putDocumentInfo(file: VirtualFile, documentInfo: DocumentInfo) {
5250

5351
if (logger.isTraceEnabled) {
54-
Log.log(logger::trace, "putDocumentInfo: {} , DocumentInfo:[{}]", file, documentInfo)
52+
Log.trace(logger, project, "putDocumentInfo: {} , DocumentInfo:[{}]", file, documentInfo)
5553
if (containsDocumentInfo(file)) {
56-
Log.log(logger::trace, "putDocumentInfo: file already exists , assuming update. {}", file)
54+
Log.trace(logger, project, "putDocumentInfo: file already exists , assuming update. {}", file)
5755
}
5856
}
5957

@@ -79,17 +77,15 @@ class DocumentInfoStorage(private val project: Project) {
7977
file: VirtualFile,
8078
documentInfo: DocumentInfo
8179
) {
82-
if (logger.isTraceEnabled) {
83-
Log.log(logger::trace, "fireDocumentInfoChanged: for {}", file)
84-
}
80+
Log.trace(logger, project, "fireDocumentInfoChanged: for {}", file)
8581
project.messageBus.syncPublisher(DocumentInfoChanged.DOCUMENT_INFO_CHANGED_TOPIC).documentInfoChanged(file, documentInfo)
8682
}
8783

8884

8985
internal fun removeDocumentInfo(file: VirtualFile) {
9086
documentInfos.remove(file)
9187
if (logger.isTraceEnabled) {
92-
Log.log(logger::trace, "removeDocumentInfo: file:{}", file)
88+
Log.trace(logger, project, "removeDocumentInfo: file:{}", file)
9389
Log.log(
9490
logger::trace,
9591
"currently have {} documents in storage: {}",
@@ -101,9 +97,7 @@ class DocumentInfoStorage(private val project: Project) {
10197
}
10298

10399
private fun fireDocumentInfoRemoved(file: VirtualFile) {
104-
if (logger.isTraceEnabled) {
105-
Log.log(logger::trace, "fireDocumentInfoRemoved: for {}", file)
106-
}
100+
Log.trace(logger, project, "fireDocumentInfoRemoved: for {}", file)
107101
project.messageBus.syncPublisher(DocumentInfoChanged.DOCUMENT_INFO_CHANGED_TOPIC).documentInfoRemoved(file)
108102
}
109103

ide-common/src/main/kotlin/org/digma/intellij/plugin/document/EditorDocumentService.kt

Lines changed: 20 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
9797
try {
9898
doOnFileOpened(file)
9999
} catch (e: Throwable) {
100-
Log.warnWithException(logger, e, "Exception in fileOpened {}", e)
100+
Log.warnWithException(logger, project, e, "Exception in fileOpened {}", e)
101101
ErrorReporter.getInstance().reportError(project, "EditorDocumentService.fileOpened", e)
102102
}
103103
}
@@ -114,10 +114,7 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
114114
//Note: I tried to use EditorFactory.getInstance().eventMulticaster but it will fire hundreds of events for every file open file also for non-writable
115115
// files. Don't use it!
116116
if (isRelevantLanguageFileNoSlowOperations(file)) {
117-
118-
if (logger.isTraceEnabled) {
119-
Log.log(logger::trace, "fileOpened: processing {}", file)
120-
}
117+
Log.trace(logger, project, "fileOpened: processing {}", file)
121118

122119
//this is protection against dev error, it should never happen. we should catch it in development.
123120
if (documentChangeListenerDisposables.contains(file)) {
@@ -127,20 +124,14 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
127124

128125
val document = FileDocumentManager.getInstance().getDocument(file)
129126
if (document != null) {
130-
if (logger.isTraceEnabled) {
131-
Log.log(logger::trace, "fileOpened: adding document listener for {}", file)
132-
}
127+
Log.trace(logger, project, "fileOpened: adding document listener for {}", file)
133128
val disposable = Disposer.newDisposable()
134129
document.addDocumentListener(myDocumentListener, disposable)
135130
documentChangeListenerDisposables[file] = disposable
136-
if (logger.isTraceEnabled) {
137-
Log.log(logger::trace, "fileOpened: starting build document info job for {}", file)
138-
}
131+
Log.trace(logger, project, "fileOpened: starting build document info job for {}", file)
139132
launchBuildDocumentInfoJob(file)
140133
} else {
141-
if (logger.isTraceEnabled) {
142-
Log.log(logger::warn, "fileOpened: file is relevant but document is null for {}", file)
143-
}
134+
Log.warn(logger, project, "fileOpened: file is relevant but document is null for {}", file)
144135
}
145136
}
146137
}
@@ -150,7 +141,7 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
150141
try {
151142
doOnFileClosed(file)
152143
} catch (e: Throwable) {
153-
Log.warnWithException(logger, e, "Exception in fileClosed {}", e)
144+
Log.warnWithException(logger, project, e, "Exception in fileClosed {}", e)
154145
ErrorReporter.getInstance().reportError(project, "EditorDocumentService.fileClosed", e)
155146
}
156147
}
@@ -168,15 +159,11 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
168159
return
169160
}
170161

171-
if (logger.isTraceEnabled) {
172-
Log.log(logger::trace, "fileClosed: processing {}", file)
173-
}
162+
Log.trace(logger, project, "fileClosed: processing {}", file)
174163

175164
val disposable = documentChangeListenerDisposables.remove(file)
176165
disposable?.let {
177-
if (logger.isTraceEnabled) {
178-
Log.log(logger::trace, "fileClosed: removing document listener for {}", file)
179-
}
166+
Log.trace(logger, project, "fileClosed: removing document listener for {}", file)
180167
Disposer.dispose(it)
181168
}
182169

@@ -186,7 +173,7 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
186173
removeDocumentFromChangedDocuments(file)
187174
filesToUpdate.remove(file)
188175
runningJobs[file]?.cancel(CancellationException("File was closed"))
189-
}finally {
176+
} finally {
190177
putRemoveLock.withLock {
191178
DocumentInfoStorage.getInstance(project).removeDocumentInfo(file)
192179
}
@@ -220,8 +207,8 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
220207
while (document != null) {
221208
if (document.isWritable) {
222209
val file = FileDocumentManager.getInstance().getFile(document)
223-
file?.let {
224-
filesToUpdate.add(file)
210+
file?.takeIf { isValidVirtualFile(it) }?.let {
211+
filesToUpdate.add(it)
225212
}
226213
}
227214
document = changedDocuments.poll()
@@ -241,20 +228,15 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
241228
//This method is invoked after the quite period has passed.
242229
//While waiting for quite period we didn't run anything on EDT or read access.
243230
private fun updateDocumentInfo(virtualFile: VirtualFile) {
244-
if (logger.isTraceEnabled) {
245-
Log.log(logger::trace, "updateDocumentInfo: {}", virtualFile)
246-
}
247-
231+
Log.trace(logger, project, "updateDocumentInfo: {}", virtualFile)
248232
launchBuildDocumentInfoJob(virtualFile)
249233
}
250234

251235

252236
//this method will be called on EDT from fileOpened, and in a coroutine for updates, it should run fast and not take read access.
253237
private fun launchBuildDocumentInfoJob(file: VirtualFile) {
254238

255-
if (logger.isTraceEnabled) {
256-
Log.log(logger::trace, "starting buildDocumentInfo job for {}", file)
257-
}
239+
Log.trace(logger, project, "starting buildDocumentInfo job for {}", file)
258240

259241
runningJobs[file]?.cancel(CancellationException("New job started"))
260242
val job = cs.launchWithErrorReporting("EditorDocumentService.launchBuildDocumentInfoJob", logger) {
@@ -275,40 +257,40 @@ class EditorDocumentService(private val project: Project, private val cs: Corout
275257
// building DocumentInfo finished and just before putting it in the storage, that is handled by putRemoveLock.
276258
//Exceptions are caught in the coroutine exception handler and reported in invokeOnCompletion.
277259

278-
Log.log(logger::trace, "buildDocumentInfo: {}", file)
260+
Log.trace(logger, project, "buildDocumentInfo: {}", file)
279261

280262
val isRelevant = readAction {
281263
isRelevantFile(file)
282264
}
283265
coroutineContext.ensureActive()
284266
if (!isRelevant) {
285-
Log.log(logger::trace, "buildDocumentInfo: file is not relevant {}", file)
267+
Log.trace(logger, project, "buildDocumentInfo: file is not relevant {}", file)
286268
return
287269
}
288270

289271
if (!isSupportedLanguageFile(project, file)) {
290-
Log.log(logger::trace, "buildDocumentInfo: file is not a supported language {}", file)
272+
Log.trace(logger, project, "buildDocumentInfo: file is not a supported language {}", file)
291273
return
292274
}
293275
coroutineContext.ensureActive()
294276

295277
val languageService = LanguageServiceProvider.getInstance(project).getLanguageService(file)
296278
if (languageService == null) {
297-
Log.log(logger::warn, "buildDocumentInfo: could not find language service for {}", file)
279+
Log.warn(logger, project, "buildDocumentInfo: could not find language service for {}", file)
298280
return
299281
}
300282

301283
if (!languageService.isSupportedFile(file)) {
302-
Log.log(logger::trace, "buildDocumentInfo: file is not supported by language service {}", file)
284+
Log.trace(logger, project, "buildDocumentInfo: file is not supported by language service {}", file)
303285
return
304286
}
305287

306288
coroutineContext.ensureActive()
307289
val documentInfo = languageService.buildDocumentInfo(file)
308290
if (documentInfo == null) {
309-
Log.log(logger::warn, "buildDocumentInfo: could not build document info for {}", file)
291+
Log.warn(logger, project, "buildDocumentInfo: could not build document info for {}", file)
310292
} else {
311-
Log.log(logger::trace, "buildDocumentInfo: done building document info for {}", file)
293+
Log.trace(logger, project, "buildDocumentInfo: done building document info for {}", file)
312294
coroutineContext.ensureActive()
313295
putRemoveLock.withLock {
314296
coroutineContext.ensureActive()

ide-common/src/main/kotlin/org/digma/intellij/plugin/document/EditorEventsHandler.kt

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.digma.intellij.plugin.document
22

3-
import com.intellij.openapi.diagnostic.Logger
3+
import com.intellij.openapi.diagnostic.thisLogger
44
import com.intellij.openapi.fileEditor.FileEditorManager
55
import com.intellij.openapi.fileEditor.FileEditorManagerListener
66
import com.intellij.openapi.project.Project
@@ -11,14 +11,11 @@ import org.digma.intellij.plugin.log.Log
1111

1212
class EditorEventsHandler(private val project: Project) : FileEditorManagerListener {
1313

14-
private val logger = Logger.getInstance(this::class.java)
15-
14+
private val logger = thisLogger()
1615

1716
override fun fileOpened(source: FileEditorManager, file: VirtualFile) {
1817
try {
19-
if (logger.isTraceEnabled) {
20-
Log.log(logger::trace, "fileOpened: {}", file)
21-
}
18+
Log.trace(logger, project, "fileOpened: {}", file)
2219

2320
if (!isProjectValid(project)) {
2421
return
@@ -27,17 +24,15 @@ class EditorEventsHandler(private val project: Project) : FileEditorManagerListe
2724
EditorDocumentService.getInstance(project).fileOpened(file)
2825

2926
} catch (e: Throwable) {
30-
Log.warnWithException(logger, e, "Exception in fileOpened {}", e)
27+
Log.warnWithException(logger, project, e, "Exception in fileOpened {}", e)
3128
ErrorReporter.getInstance().reportError(project, "EditorEventsHandler.fileOpened", e)
3229
}
3330
}
3431

3532
override fun fileClosed(source: FileEditorManager, file: VirtualFile) {
3633
try {
3734

38-
if (logger.isTraceEnabled) {
39-
Log.log(logger::trace, "fileClosed: {}", file)
40-
}
35+
Log.trace(logger, project, "fileClosed: {}", file)
4136

4237
if (!isProjectValid(project)) {
4338
return
@@ -46,7 +41,7 @@ class EditorEventsHandler(private val project: Project) : FileEditorManagerListe
4641
EditorDocumentService.getInstance(project).fileClosed(file)
4742

4843
} catch (e: Throwable) {
49-
Log.warnWithException(logger, e, "Exception in fileClosed {}", e)
44+
Log.warnWithException(logger, project, e, "Exception in fileClosed {}", e)
5045
ErrorReporter.getInstance().reportError(project, "EditorEventsHandler.fileClosed", e)
5146
}
5247
}
@@ -60,7 +55,7 @@ class EditorEventsHandler(private val project: Project) : FileEditorManagerListe
6055
// try {
6156
//
6257
// if (logger.isTraceEnabled) {
63-
// Log.log(logger::trace, "selectionChanged: new {}", event.newFile)
58+
// Log.trace(logger,project, "selectionChanged: new {}", event.newFile)
6459
// }
6560
//
6661
// if (!isProjectValid(project)) {
@@ -83,7 +78,7 @@ class EditorEventsHandler(private val project: Project) : FileEditorManagerListe
8378
// EditorDocumentService.getInstance(project).fileOpened(file, editor)
8479
//
8580
// } catch (e: Throwable) {
86-
// Log.warnWithException(logger, e, "Exception in selectionChanged {}", e)
81+
// Log.warnWithException(logger,project, e, "Exception in selectionChanged {}", e)
8782
// ErrorReporter.getInstance().reportError(project, "EditorEventsHandler.selectionChanged", e)
8883
// }
8984
// }

ide-common/src/main/kotlin/org/digma/intellij/plugin/document/EditorUtils.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ import com.intellij.openapi.fileEditor.TextEditor
66
import com.intellij.openapi.project.Project
77
import com.intellij.openapi.vfs.VirtualFile
88
import org.digma.intellij.plugin.common.EDT
9+
import org.digma.intellij.plugin.common.isValidVirtualFile
910

1011
//must be called on EDT
1112
fun getSelectedTextEditorForFile(project: Project, virtualFile: VirtualFile, fileEditorManager: FileEditorManager? = null): Editor? {
1213
EDT.assertIsDispatchThread()
14+
if(!isValidVirtualFile(virtualFile)){
15+
return null
16+
}
1317
val editorManager = fileEditorManager ?: FileEditorManager.getInstance(project)
1418
val selectedEditor = editorManager.getSelectedEditor(virtualFile)
1519
return selectedEditor?.takeIf { it is TextEditor }?.let { (it as TextEditor).editor }

0 commit comments

Comments
 (0)