in psi/src/com/intellij/r/psi/rinterop/RSourceFileManager.kt [43:81]
fun getFileById(fileId: String): VirtualFile? {
if (fileId.isEmpty()) return null
files[fileId]?.let { return it }
if (fileId.startsWith(IDE_PREFIX)) {
VirtualFileManager.getInstance().findFileByUrl(fileId.substring(IDE_PREFIX.length))?.let {
fileToId[it] = fileId
files[fileId] = it
return it
}
} else if (fileId.startsWith(R_LOCAL_PREFIX)) {
rInterop.interpreter.findFileByPathAtHost(fileId.substring(R_LOCAL_PREFIX.length))?.let {
fileToId[it] = fileId
files[fileId] = it
return it
}
}
val text = rInterop.getSourceFileText(fileId)
if (text.isEmpty()) return null
val name = rInterop.getSourceFileName(fileId)
.takeIf { it.isNotEmpty() } ?: "tmp"
val filesystem = VirtualFileManager.getInstance().getFileSystem(PROTOCOL) as MyVirtualFileSystem
val file = filesystem.createFile(name, text)
fileToId[file] = fileId
files[fileId] = file
Disposer.register(this, Disposable {
filesystem.removeFile(file.path)
runInEdt {
FileEditorManager.getInstance(rInterop.project).closeFile(file)
runWriteAction {
val breakpointManager = XDebuggerManager.getInstance(rInterop.project).breakpointManager
val breakpointType = XDebuggerUtil.getInstance().findBreakpointType(RLineBreakpointType::class.java)
breakpointManager.getBreakpoints(breakpointType)
.filter { it.fileUrl == file.url }
.forEach { breakpointManager.removeBreakpoint(it) }
}
}
})
return file
}