void (@NotNull PsiTreeChangeEventImpl event) { boolean isRealTreeChange = event.getCode() != PsiTreeChangeEventImpl.PsiEventType.PROPERTY_CHANGED && event.getCode() != PsiTreeChangeEventImpl.PsiEventType.BEFORE_PROPERTY_CHANGE; PsiFile file = event.getFile(); if (file == null || file.isPhysical()) { ApplicationManager.getApplication().assertWriteAccessAllowed(); } if (isRealTreeChange) { LOG.assertTrue(!myTreeChangeEventIsFiring, "Changes to PSI are not allowed inside event processing"); myTreeChangeEventIsFiring = true; } try { for (PsiTreeChangePreprocessor preprocessor : myTreeChangePreprocessors) { preprocessor.treeChanged(event); } for (PsiTreeChangePreprocessor preprocessor : PsiTreeChangePreprocessor.EP.getExtensions(myProject)) { try { preprocessor.treeChanged(event); } catch (Throwable e) { LOG.error(e); } } for (PsiTreeChangeListener listener : myTreeChangeListeners) { notifyPsiTreeChangeListener(event, listener); } for (PsiTreeChangeListener listener : PsiTreeChangeListener.EP.getExtensions(myProject)) { notifyPsiTreeChangeListener(event, listener); } } finally { if (isRealTreeChange) { myTreeChangeEventIsFiring = false; } } }