PSI events missing

This commit is contained in:
Alexey Kudravtsev
2011-06-23 16:13:28 +04:00
parent f140f04db1
commit 5e72fda3db
8 changed files with 78 additions and 48 deletions
@@ -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;
@@ -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);
@@ -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<ASTNode, TreeChange> myChangedElements = new THashMap<ASTNode, TreeChange>();
private final List<ASTNode> myChangedInOrder = new ArrayList<ASTNode>();
private List<ASTNode> 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<ASTNode, TreeChange> 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<ASTNode, TreeChange> entry : myChangedElements.entrySet()) {
buffer.append(entry.getKey().getElementType().toString());
buffer.append(": ");
@@ -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);
@@ -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);
}
@@ -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;
}
}
}
@@ -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);
@@ -58,33 +58,30 @@ public class DiffLog implements DiffTreeChangeBuilder<ASTNode,ASTNode> {
private final List<LogEntry> myEntries = new ArrayList<LogEntry>();
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<ASTNode,ASTNode> {
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<ASTNode,ASTNode> {
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<ASTNode,ASTNode> {
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<ASTNode,ASTNode> {
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);
}
}