From 1e8caec1c2953c547d53e7f3637df4ea28c8ac67 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 4 Feb 2011 14:39:48 +0100 Subject: [PATCH] [alefas] extensible OutOfCodeBlock modification tracking --- .../intellij/psi/impl/JavaPsiFacadeImpl.java | 17 ++++++----- .../source/tree/java/PsiCodeBlockImpl.java | 5 ++++ .../src/com/intellij/psi/PsiCodeBlock.java | 2 +- .../intellij/psi/PsiModifiableCodeBlock.java | 28 +++++++++++++++++++ 4 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 java/openapi/src/com/intellij/psi/PsiModifiableCodeBlock.java diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java b/java/java-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java index b58510caf7c5..e32806c81a66 100644 --- a/java/java-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java @@ -670,23 +670,22 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx implements Disposable { if (element instanceof PsiFileSystemItem) { return false; } - + if (element == null || element.getParent() == null) return true; - while(true){ - if (element instanceof PsiFile || element instanceof PsiDirectory || element == null){ + PsiElement parent = element; + while (true) { + if (parent instanceof PsiFile || parent instanceof PsiDirectory || parent == null) { return false; } - PsiElement pparent = element.getParent(); - if (element instanceof PsiClass) return false; // anonymous or local class - if (element instanceof PsiCodeBlock){ - if (pparent instanceof PsiMethod || pparent instanceof PsiClassInitializer){ + if (parent instanceof PsiClass) return false; // anonymous or local class + if (parent instanceof PsiModifiableCodeBlock) { + if (!((PsiModifiableCodeBlock)parent).shouldChangeModificationCount(element)) { return true; } } - element = pparent; + parent = parent.getParent(); } } - } } diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiCodeBlockImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiCodeBlockImpl.java index 0c04702abc28..c702b47277c2 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiCodeBlockImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiCodeBlockImpl.java @@ -221,4 +221,9 @@ public class PsiCodeBlockImpl extends LazyParseablePsiElement implements PsiCode } return true; } + + public boolean shouldChangeModificationCount(PsiElement place) { + PsiElement pparent = getParent(); + return !(pparent instanceof PsiMethod || pparent instanceof PsiClassInitializer); + } } diff --git a/java/openapi/src/com/intellij/psi/PsiCodeBlock.java b/java/openapi/src/com/intellij/psi/PsiCodeBlock.java index 496a91b05c54..338da097af86 100644 --- a/java/openapi/src/com/intellij/psi/PsiCodeBlock.java +++ b/java/openapi/src/com/intellij/psi/PsiCodeBlock.java @@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable; /** * Represents a Java code block, usually surrounded by curly braces. */ -public interface PsiCodeBlock extends PsiElement { +public interface PsiCodeBlock extends PsiElement, PsiModifiableCodeBlock { /** * The empty array of PSI code blocks which can be reused to avoid unnecessary allocations. */ diff --git a/java/openapi/src/com/intellij/psi/PsiModifiableCodeBlock.java b/java/openapi/src/com/intellij/psi/PsiModifiableCodeBlock.java new file mode 100644 index 000000000000..85a9555a401d --- /dev/null +++ b/java/openapi/src/com/intellij/psi/PsiModifiableCodeBlock.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2011 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.psi; + +/** + * Represents psi element, which can be modified without caches reset. + * @see com.intellij.psi.util.PsiModificationTracker#getOutOfCodeBlockModificationCount() + */ +public interface PsiModifiableCodeBlock { + /** + * @param place where change was detected + * @return false if specific caches could be saved after the change + */ + boolean shouldChangeModificationCount(PsiElement place); +}