From ff07a643626556bd082a8fb9f19609018555df71 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 3 Feb 2010 20:24:34 +0300 Subject: [PATCH] Uml diff provider. First attempt --- .../src/com/intellij/psi/util/PsiFilter.java} | 11 ++++--- .../openapi/vcs/changes/PsiChangeTracker.java | 31 +++++++++++++------ 2 files changed, 27 insertions(+), 15 deletions(-) rename platform/{lang-impl/src/com/intellij/openapi/vcs/changes/PsiElementFilter.java => lang-api/src/com/intellij/psi/util/PsiFilter.java} (75%) diff --git a/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiElementFilter.java b/platform/lang-api/src/com/intellij/psi/util/PsiFilter.java similarity index 75% rename from platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiElementFilter.java rename to platform/lang-api/src/com/intellij/psi/util/PsiFilter.java index a9498ccff14d..99a9e6a83157 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiElementFilter.java +++ b/platform/lang-api/src/com/intellij/psi/util/PsiFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,17 +14,18 @@ * limitations under the License. */ -package com.intellij.openapi.vcs.changes; +package com.intellij.psi.util; import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; /** * @author Konstantin Bulenkov */ -public class PsiElementFilter { +public class PsiFilter { private final Class filter; - public PsiElementFilter(Class filter) { + public PsiFilter(@NotNull Class filter) { this.filter = filter; } @@ -32,7 +33,7 @@ public class PsiElementFilter { return true; } - public final Class getClassFilter() { + public final Class getParentClass() { return filter; } } diff --git a/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiChangeTracker.java b/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiChangeTracker.java index d3d765152358..58a53577d841 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiChangeTracker.java +++ b/platform/lang-impl/src/com/intellij/openapi/vcs/changes/PsiChangeTracker.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.impl.LoadTextUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; +import com.intellij.psi.util.PsiFilter; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.FileStatus; import com.intellij.openapi.vcs.FileStatusManager; @@ -42,7 +43,7 @@ public class PsiChangeTracker { private PsiChangeTracker() { } - public static Map getElementsChanged(PsiFile file, final PsiElementFilter filter) { + public static Map getElementsChanged(PsiFile file, final PsiFilter filter) { final Project project = file.getProject(); final VirtualFile vf = file.getVirtualFile(); @@ -57,15 +58,25 @@ public class PsiChangeTracker { return getElementsChanged(file, oldFile, filter); } - public static Map getElementsChanged(PsiFile file, PsiFile oldFile, final PsiElementFilter filter) { - final Project project = file.getProject(); - final List elements = new ArrayList(); + public static Map getElementsChanged(PsiFile file, PsiFile oldFile, final PsiFilter filter) { + final HashMap result = new HashMap(); final List oldElements = new ArrayList(); + final List elements = new ArrayList(); + + if (file == null) { + oldFile.accept(new MyVisitor(filter, oldElements)); + calculateStatuses(elements, oldElements, result); + return result; + } + + final Project project = file.getProject(); file.accept(new MyVisitor(filter, elements)); final VirtualFile vf = file.getVirtualFile(); - final FileStatus status = vf == null ? null : FileStatusManager.getInstance(project).getStatus(vf); - final HashMap result = new HashMap(); + FileStatus status = vf == null ? null : FileStatusManager.getInstance(project).getStatus(vf); + if (status == null && oldFile == null) { + status = FileStatus.ADDED; + } if (status == FileStatus.ADDED || status == FileStatus.DELETED || status == FileStatus.DELETED_FROM_FS || @@ -146,17 +157,17 @@ public class PsiChangeTracker { } static class MyVisitor extends PsiRecursiveElementVisitor { - private final PsiElementFilter filter; + private final PsiFilter filter; private final List elements; - protected MyVisitor(final PsiElementFilter filter, final List elements) { + protected MyVisitor(final PsiFilter filter, final List elements) { this.filter = filter; this.elements = elements; } @Override public void visitElement(PsiElement element) { - if (filter.getClassFilter().isAssignableFrom(element.getClass())) { + if (filter.getParentClass().isAssignableFrom(element.getClass())) { final T e = (T)element; if (filter.accept(e)) { elements.add(e);