From 5e72fda3db488bde55d2b156df5dcdbc7c4c1730 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 23 Jun 2011 13:08:12 +0400 Subject: [PATCH] PSI events missing --- .../src/com/intellij/mock/MockPsiManager.java | 4 ++ .../intellij/pom/core/impl/PomModelImpl.java | 2 +- .../tree/events/impl/TreeChangeEventImpl.java | 23 ++++++-- .../com/intellij/psi/impl/PsiManagerEx.java | 2 + .../com/intellij/psi/impl/PsiManagerImpl.java | 21 +++---- .../psi/impl/PsiTreeChangeEventImpl.java | 12 ++-- .../impl/source/text/BlockSupportImpl.java | 4 +- .../psi/impl/source/text/DiffLog.java | 58 +++++++++++-------- 8 files changed, 78 insertions(+), 48 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/mock/MockPsiManager.java b/platform/lang-impl/src/com/intellij/mock/MockPsiManager.java index cec66b954e41..56668b6621a8 100644 --- a/platform/lang-impl/src/com/intellij/mock/MockPsiManager.java +++ b/platform/lang-impl/src/com/intellij/mock/MockPsiManager.java @@ -251,6 +251,10 @@ public class MockPsiManager extends PsiManagerEx { public void beforeChildReplacement(@NotNull final PsiTreeChangeEventImpl event) { } + @Override + public void beforeChildAddition(@NotNull PsiTreeChangeEventImpl event) { + } + @NotNull public CacheManager getCacheManager() { return myCompositeCacheManager; diff --git a/platform/lang-impl/src/com/intellij/pom/core/impl/PomModelImpl.java b/platform/lang-impl/src/com/intellij/pom/core/impl/PomModelImpl.java index 64b50d1018e8..3de873048cd4 100644 --- a/platform/lang-impl/src/com/intellij/pom/core/impl/PomModelImpl.java +++ b/platform/lang-impl/src/com/intellij/pom/core/impl/PomModelImpl.java @@ -231,7 +231,7 @@ public class PomModelImpl extends UserDataHolderBase implements PomModel { final PsiDocumentManagerImpl manager = (PsiDocumentManagerImpl)PsiDocumentManager.getInstance(myProject); final PsiToDocumentSynchronizer synchronizer = manager.getSynchronizer(); final PsiElement changeScope = transaction.getChangeScope(); - BlockSupportImpl.sendPsiBeforeEvent(transaction.getChangeScope()); + BlockSupportImpl.sendBeforeChildrenChangeEvent(transaction.getChangeScope()); LOG.assertTrue(changeScope != null); final PsiFile containingFileByTree = getContainingFileByTree(changeScope); diff --git a/platform/lang-impl/src/com/intellij/pom/tree/events/impl/TreeChangeEventImpl.java b/platform/lang-impl/src/com/intellij/pom/tree/events/impl/TreeChangeEventImpl.java index da354fc0dc8c..f3a8398f6ca6 100644 --- a/platform/lang-impl/src/com/intellij/pom/tree/events/impl/TreeChangeEventImpl.java +++ b/platform/lang-impl/src/com/intellij/pom/tree/events/impl/TreeChangeEventImpl.java @@ -16,8 +16,8 @@ package com.intellij.pom.tree.events.impl; -import com.intellij.idea.LoggerFactory; import com.intellij.lang.ASTNode; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.pom.PomModelAspect; import com.intellij.pom.event.PomChangeSet; import com.intellij.pom.tree.events.ChangeInfo; @@ -37,6 +37,7 @@ import java.util.*; * @author ik */ public class TreeChangeEventImpl implements TreeChangeEvent{ + private static final Logger LOG = Logger.getInstance("#com.intellij.pom.tree.events.impl.TreeChangeEventImpl"); private final Map myChangedElements = new THashMap(); private final List myChangedInOrder = new ArrayList(); private List myChangedInOrderNew; @@ -77,12 +78,13 @@ public class TreeChangeEventImpl implements TreeChangeEvent{ if (size == myChangedInOrder.size()) { for(int i = 0; i < size; ++i) { if (myChangedInOrderNew.get(i) != myChangedInOrder.get(i)) { - LoggerFactory.getInstance().getLoggerInstance(getClass().getName()).error("Unexpected changed elements difference"); + LOG.error("Unexpected changed elements difference"); return myChangedInOrder.toArray(new ASTNode[myChangedInOrder.size()]); } } - } else { - LoggerFactory.getInstance().getLoggerInstance(getClass().getName()).error("Unexpected changed elements difference"); + } + else { + LOG.error("Unexpected changed elements difference"); return myChangedInOrder.toArray(new ASTNode[myChangedInOrder.size()]); } } @@ -91,10 +93,19 @@ public class TreeChangeEventImpl implements TreeChangeEvent{ } public TreeChange getChangesByElement(@NotNull ASTNode element) { + LOG.assertTrue(isAncestor(element, myFileElement), element); return myChangedElements.get(element); } + private static boolean isAncestor(ASTNode thisElement, FileElement fileElement) { + TreeElement element; + for (element = (TreeElement)thisElement; element.getTreeParent() != null; element = element.getTreeParent()) { + } + return element == fileElement; + } + public void addElementaryChange(@NotNull ASTNode element, @NotNull ChangeInfo change) { + LOG.assertTrue(isAncestor(element, myFileElement), element); final ASTNode parent = element.getTreeParent(); if (parent == null) return; ASTNode currentParent = parent; @@ -310,6 +321,8 @@ public class TreeChangeEventImpl implements TreeChangeEvent{ while (iterator.hasNext()) { final Map.Entry entry = iterator.next(); final ASTNode changed = entry.getKey(); + LOG.assertTrue(isAncestor(changed, myFileElement), changed); + final TreeChange treeChange = myChangedElements.get(changed); if(treeChange != null){ iterator.remove(); @@ -356,7 +369,7 @@ public class TreeChangeEventImpl implements TreeChangeEvent{ } public String toString(){ - final StringBuffer buffer = new StringBuffer(); + final StringBuilder buffer = new StringBuilder(); for (final Map.Entry entry : myChangedElements.entrySet()) { buffer.append(entry.getKey().getElementType().toString()); buffer.append(": "); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/PsiManagerEx.java b/platform/lang-impl/src/com/intellij/psi/impl/PsiManagerEx.java index 913dd949d81f..ab14ad83e85a 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/PsiManagerEx.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/PsiManagerEx.java @@ -58,6 +58,8 @@ public abstract class PsiManagerEx extends PsiManager { public abstract void invalidateFile(@NotNull PsiFile file); + public abstract void beforeChildAddition(@NotNull PsiTreeChangeEventImpl event); + public abstract void beforeChildRemoval(@NotNull PsiTreeChangeEventImpl event); public abstract void beforeChildReplacement(@NotNull PsiTreeChangeEventImpl event); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/PsiManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/PsiManagerImpl.java index c4727dbf34e2..6e7e6b8a8414 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/PsiManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/PsiManagerImpl.java @@ -423,7 +423,9 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { myTreeChangeListeners.remove(listener); } - public void beforeChildAddition(PsiTreeChangeEventImpl event) { + @Override + public void beforeChildAddition(@NotNull PsiTreeChangeEventImpl event) { + beforeAnyChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.BEFORE_CHILD_ADDITION); if (LOG.isDebugEnabled()) { LOG.debug( @@ -434,6 +436,7 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void beforeChildRemoval(@NotNull PsiTreeChangeEventImpl event) { + beforeAnyChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.BEFORE_CHILD_REMOVAL); if (LOG.isDebugEnabled()) { LOG.debug( @@ -445,6 +448,7 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void beforeChildReplacement(@NotNull PsiTreeChangeEventImpl event) { + beforeAnyChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.BEFORE_CHILD_REPLACEMENT); if (LOG.isDebugEnabled()) { LOG.debug( @@ -456,6 +460,7 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void beforeChildrenChange(PsiTreeChangeEventImpl event) { + beforeAnyChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.BEFORE_CHILDREN_CHANGE); if (LOG.isDebugEnabled()) { LOG.debug("beforeChildrenChange: parent = " + event.getParent()); @@ -464,6 +469,7 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void beforeChildMovement(PsiTreeChangeEventImpl event) { + beforeAnyChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.BEFORE_CHILD_MOVEMENT); if (LOG.isDebugEnabled()) { LOG.debug( @@ -476,6 +482,7 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void beforePropertyChange(PsiTreeChangeEventImpl event) { + beforeAnyChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.BEFORE_PROPERTY_CHANGE); if (LOG.isDebugEnabled()) { LOG.debug( @@ -488,7 +495,6 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void childAdded(PsiTreeChangeEventImpl event) { - beforeChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.CHILD_ADDED); if (LOG.isDebugEnabled()) { LOG.debug( @@ -501,7 +507,6 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void childRemoved(PsiTreeChangeEventImpl event) { - beforeChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.CHILD_REMOVED); if (LOG.isDebugEnabled()) { LOG.debug( @@ -513,7 +518,6 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void childReplaced(PsiTreeChangeEventImpl event) { - beforeChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.CHILD_REPLACED); if (LOG.isDebugEnabled()) { LOG.debug( @@ -527,7 +531,6 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void childMoved(PsiTreeChangeEventImpl event) { - beforeChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.CHILD_MOVED); if (LOG.isDebugEnabled()) { LOG.debug( @@ -541,7 +544,6 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void childrenChanged(PsiTreeChangeEventImpl event) { - beforeChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.CHILDREN_CHANGED); if (LOG.isDebugEnabled()) { LOG.debug( @@ -553,7 +555,6 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void propertyChanged(PsiTreeChangeEventImpl event) { - beforeChange(true); event.setCode(PsiTreeChangeEventImpl.PsiEventType.PROPERTY_CHANGED); if (LOG.isDebugEnabled()) { LOG.debug( @@ -692,14 +693,14 @@ public class PsiManagerImpl extends PsiManagerEx implements ProjectComponent { } public void nonPhysicalChange() { - beforeChange(false); + beforeAnyChange(false); } public void physicalChange() { - beforeChange(true); + beforeAnyChange(true); } - private void beforeChange(boolean isPhysical) { + private void beforeAnyChange(boolean isPhysical) { myMessageBus.syncPublisher(ANY_PSI_CHANGE_TOPIC).beforePsiChanged(isPhysical); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/PsiTreeChangeEventImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/PsiTreeChangeEventImpl.java index 6f7ff02158c9..9215698a4529 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/PsiTreeChangeEventImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/PsiTreeChangeEventImpl.java @@ -24,16 +24,16 @@ import com.intellij.psi.PsiTreeChangeEvent; public class PsiTreeChangeEventImpl extends PsiTreeChangeEvent{ public enum PsiEventType { BEFORE_CHILD_ADDITION, - BEFORE_CHILD_REMOVAL, - BEFORE_CHILD_REPLACEMENT, - BEFORE_CHILD_MOVEMENT, - BEFORE_CHILDREN_CHANGE, - BEFORE_PROPERTY_CHANGE, CHILD_ADDED, + BEFORE_CHILD_REMOVAL, CHILD_REMOVED, + BEFORE_CHILD_REPLACEMENT, CHILD_REPLACED, + BEFORE_CHILD_MOVEMENT, CHILD_MOVED, + BEFORE_CHILDREN_CHANGE, CHILDREN_CHANGED, + BEFORE_PROPERTY_CHANGE, PROPERTY_CHANGED } @@ -110,4 +110,4 @@ public class PsiTreeChangeEventImpl extends PsiTreeChangeEvent{ public int getOldLength() { return myOldLength; } -} \ No newline at end of file +} diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java index de74bbc78ef9..f80b4bc63386 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java @@ -283,7 +283,7 @@ public class BlockSupportImpl extends BlockSupport { return childTooDeep; } - public static void sendPsiBeforeEvent(final PsiElement scope) { + public static void sendBeforeChildrenChangeEvent(final PsiElement scope) { if(!scope.isPhysical()) return; final PsiManagerImpl manager = (PsiManagerImpl)scope.getManager(); PsiTreeChangeEventImpl event = new PsiTreeChangeEventImpl(manager); @@ -294,7 +294,7 @@ public class BlockSupportImpl extends BlockSupport { manager.beforeChildrenChange(event); } - public static void sendPsiAfterFileEvent(final PsiFileImpl scope, int oldLength) { + public static void sendAfterChildrenChangedEvent(final PsiFileImpl scope, int oldLength) { if (!scope.isPhysical()) return; final PsiManagerImpl manager = (PsiManagerImpl)scope.getManager(); PsiTreeChangeEventImpl event = new PsiTreeChangeEventImpl(manager); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/text/DiffLog.java b/platform/lang-impl/src/com/intellij/psi/impl/source/text/DiffLog.java index dafa7a69fe7e..6d0f1f0a92e0 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/text/DiffLog.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/text/DiffLog.java @@ -58,33 +58,30 @@ public class DiffLog implements DiffTreeChangeBuilder { private final List myEntries = new ArrayList(); - public void doActualPsiChange(final PsiFile file){ + public void doActualPsiChange(@NotNull final PsiFile file){ try { - - final Document document = file.getViewProvider().getDocument(); - PsiToDocumentSynchronizer.DocumentChangeTransaction transaction = - ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(file.getProject())).getSynchronizer().getTransaction(document); + PsiDocumentManagerImpl documentManager = (PsiDocumentManagerImpl)PsiDocumentManager.getInstance(file.getProject()); + PsiToDocumentSynchronizer.DocumentChangeTransaction transaction = documentManager.getSynchronizer().getTransaction(document); final PsiFileImpl fileImpl = (PsiFileImpl)file; final ASTDiffBuilder astDiffBuilder = new ASTDiffBuilder(fileImpl); if (transaction == null) { - final PomModel model = PomManager.getModel(fileImpl.getProject()); + final PomModel model = PomManager.getModel(fileImpl.getProject()); - model.runTransaction(new PomTransactionBase(fileImpl, model.getModelAspect(TreeAspect.class)) { - public PomModelEvent runInner() { - for (LogEntry entry : myEntries) { - entry.doActualPsiChange(file, astDiffBuilder); + model.runTransaction(new PomTransactionBase(fileImpl, model.getModelAspect(TreeAspect.class)) { + public PomModelEvent runInner() { + for (LogEntry entry : myEntries) { + entry.doActualPsiChange(file, astDiffBuilder); + } + fileImpl.subtreeChanged(); + + final PomModel model = PomManager.getModel(fileImpl.getProject()); + return new TreeAspectEvent(model, astDiffBuilder.getEvent()); } - fileImpl.subtreeChanged(); - - final PomModel model = PomManager.getModel(fileImpl.getProject()); - TreeAspectEvent treeAspectEvent = new TreeAspectEvent(model, astDiffBuilder.getEvent()); - return treeAspectEvent; - } - }); + }); } else { for (LogEntry entry : myEntries) { @@ -146,19 +143,21 @@ public class DiffLog implements DiffTreeChangeBuilder { assert parent != null : "old:" + oldNode + " new:" + newNode; final PsiElement psiParent = parent.getPsi(); - final PsiElement psiChild = file.isPhysical() ? oldNode.getPsi() : null; - if (psiParent != null && psiChild != null) { + final PsiElement psiOldChild = file.isPhysical() ? oldNode.getPsi() : null; + final PsiElement psiNewChild = newNode.getPsi(); + if (psiParent != null && psiOldChild != null) { final PsiTreeChangeEventImpl event = new PsiTreeChangeEventImpl(file.getManager()); event.setParent(psiParent); - event.setChild(psiChild); + event.setFile(file); + event.setOldChild(psiOldChild); + event.setNewChild(psiNewChild); ((PsiManagerEx)file.getManager()).beforeChildReplacement(event); } ((TreeElement)newNode).rawRemove(); ((TreeElement)oldNode).rawReplaceWithList((TreeElement)newNode); - - astDiffBuilder.nodeReplaced(oldNode, newNode); + astDiffBuilder.nodeReplaced(oldNode, newNode); ///////////////// ((TreeElement)newNode).clearCaches(); @@ -192,6 +191,7 @@ public class DiffLog implements DiffTreeChangeBuilder { PsiTreeChangeEventImpl event = new PsiTreeChangeEventImpl(file.getManager()); event.setParent(psiParent); event.setChild(psiChild); + event.setFile(file); ((PsiManagerEx)file.getManager()).beforeChildRemoval(event); } @@ -224,6 +224,16 @@ public class DiffLog implements DiffTreeChangeBuilder { anchor = anchor == null ? firstChildNode : anchor.getTreeNext(); } + PsiElement psiParent = myOldParent.getPsi(); + PsiElement psiChild = file.isPhysical() ? myNewNode.getPsi() : null; + if (psiParent != null && psiChild != null) { + PsiTreeChangeEventImpl event = new PsiTreeChangeEventImpl(file.getManager()); + event.setParent(psiParent); + event.setChild(psiChild); + event.setFile(file); + ((PsiManagerEx)file.getManager()).beforeChildAddition(event); + } + ((TreeElement)myNewNode).rawRemove(); if (anchor != null) { ((TreeElement)anchor).rawInsertAfterMe((TreeElement)myNewNode); @@ -259,14 +269,14 @@ public class DiffLog implements DiffTreeChangeBuilder { void doActualPsiChange(@NotNull PsiFile file, @NotNull ASTDiffBuilder astDiffBuilder) { PsiFileImpl fileImpl = (PsiFileImpl)file; final int oldLength = myOldNode.getTextLength(); - BlockSupportImpl.sendPsiBeforeEvent(fileImpl); + BlockSupportImpl.sendBeforeChildrenChangeEvent(fileImpl); if (myOldNode.getFirstChildNode() != null) myOldNode.rawRemoveAllChildren(); final ASTNode firstChildNode = myNewNode.getFirstChildNode(); if (firstChildNode != null) myOldNode.rawAddChildren((TreeElement)firstChildNode); fileImpl.getTreeElement().setCharTable(myNewNode.getCharTable()); ((PsiManagerEx)file.getManager()).invalidateFile(fileImpl); myOldNode.subtreeChanged(); - BlockSupportImpl.sendPsiAfterFileEvent(fileImpl, oldLength); + BlockSupportImpl.sendAfterChildrenChangedEvent(fileImpl, oldLength); } }