mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
PSI events missing
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user