DocumentReference (@NotNull VirtualFile file) { assertIsWriteThread(); if (!file.isInLocalFileSystem()) { // we treat local files differently from non local because we can undo their deletion DocumentReference reference = file.getUserData(FILE_TO_STRONG_REF_KEY); if (reference == null) { file.putUserData(FILE_TO_STRONG_REF_KEY, reference = new DocumentReferenceByNonlocalVirtualFile(file)); } return reference; } assert file.isValid() : "file is invalid: " + file; DocumentReference result = SoftReference.dereference(file.getUserData(FILE_TO_REF_KEY)); if (result == null) { result = new DocumentReferenceByVirtualFile(file); file.putUserData(FILE_TO_REF_KEY, new WeakReference<>(result)); } return result; }