void (@NotNull VFilePropertyChangeEvent event) { String propertyName = event.getPropertyName(); VirtualFile vFile = event.getFile(); FileViewProvider oldFileViewProvider = myFileManager.findCachedViewProvider(vFile); PsiFile oldPsiFile = myFileManager.getCachedPsiFile(vFile); VirtualFile parent = vFile.getParent(); PsiDirectory parentDir = oldPsiFile != null && parent != null ? myFileManager.findDirectory(parent) : getCachedDirectory(parent); if (oldFileViewProvider != null && FileContentUtilCore.FORCE_RELOAD_REQUESTOR.equals(event.getRequestor())) { // there is no need to rebuild if there were no PSI in the first place myFileManager.forceReload(vFile); return; } // do not suppress reparse request for light files if (parentDir == null) { boolean fire = VirtualFile.PROP_NAME.equals(propertyName) && vFile.isDirectory(); if (fire) { PsiDirectory psiDir = myFileManager.getCachedDirectory(vFile); fire = psiDir != null; } if (!fire && !VirtualFile.PROP_WRITABLE.equals(propertyName)) { handleVfsChangeWithoutPsi(vFile); return; } } FileTypeManager fileTypeManager = FileTypeManager.getInstance(); ApplicationManager.getApplication().runWriteAction((ExternalChangeAction)() -> { PsiTreeChangeEventImpl treeEvent = new PsiTreeChangeEventImpl(myManager); treeEvent.setParent(parentDir); switch (propertyName) { case VirtualFile.PROP_NAME -> { if (vFile.isDirectory()) { PsiDirectory psiDir = myFileManager.getCachedDirectory(vFile); if (psiDir != null) { if (fileTypeManager.isFileIgnored(vFile)) { myFileManager.removeFilesAndDirsRecursively(vFile); treeEvent.setChild(psiDir); myManager.childRemoved(treeEvent); } else { treeEvent.setElement(psiDir); treeEvent.setPropertyName(PsiTreeChangeEvent.PROP_DIRECTORY_NAME); treeEvent.setOldValue(event.getOldValue()); treeEvent.setNewValue(event.getNewValue()); myManager.propertyChanged(treeEvent); } } else { PsiDirectory psiDir1 = myFileManager.findDirectory(vFile); if (psiDir1 != null) { treeEvent.setChild(psiDir1); myManager.childAdded(treeEvent); } } } else { FileViewProvider fileViewProvider = myFileManager.createFileViewProvider(vFile, true); PsiFile newPsiFile = fileViewProvider.getPsi(fileViewProvider.getBaseLanguage()); if (oldPsiFile != null) { if (newPsiFile == null) { clearViewProvider(vFile, "PSI renamed"); treeEvent.setChild(oldPsiFile); myManager.childRemoved(treeEvent); } else if (!FileManagerImpl.areViewProvidersEquivalent(fileViewProvider, oldFileViewProvider)) { myFileManager.setViewProvider(vFile, fileViewProvider); treeEvent.setOldChild(oldPsiFile); treeEvent.setNewChild(newPsiFile); myManager.childReplaced(treeEvent); } else { FileManagerImpl.clearPsiCaches(oldFileViewProvider); treeEvent.setElement(oldPsiFile); treeEvent.setPropertyName(PsiTreeChangeEvent.PROP_FILE_NAME); treeEvent.setOldValue(event.getOldValue()); treeEvent.setNewValue(event.getNewValue()); myManager.propertyChanged(treeEvent); } } else if (newPsiFile != null) { myFileManager.setViewProvider(vFile, fileViewProvider); if (parentDir != null) { treeEvent.setChild(newPsiFile); myManager.childAdded(treeEvent); } } } } case VirtualFile.PROP_WRITABLE -> { if (oldPsiFile == null) return; treeEvent.setElement(oldPsiFile); treeEvent.setPropertyName(PsiTreeChangeEvent.PROP_WRITABLE); treeEvent.setOldValue(event.getOldValue()); treeEvent.setNewValue(event.getNewValue()); myManager.propertyChanged(treeEvent); } case VirtualFile.PROP_ENCODING -> { if (oldPsiFile == null) return; treeEvent.setElement(oldPsiFile); treeEvent.setPropertyName(VirtualFile.PROP_ENCODING); treeEvent.setOldValue(event.getOldValue()); treeEvent.setNewValue(event.getNewValue()); myManager.propertyChanged(treeEvent); } } }); }