reducing Java dependencies on JSP (work in progress)

This commit is contained in:
Dmitry Jemerov
2011-09-16 13:55:28 +02:00
parent f398359a1a
commit a7e32026cc
7 changed files with 59 additions and 22 deletions

View File

@@ -23,6 +23,7 @@ import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.impl.ElementPresentationUtil;
import com.intellij.psi.impl.source.jsp.jspJava.JspClass;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
@@ -118,7 +119,7 @@ public class ClassTreeNode extends BasePsiMemberNode<PsiClass>{
return 0;
}
try {
int pos = ElementPresentationUtil.getClassKind(aClass);
int pos = aClass instanceof JspClass ? ElementPresentationUtil.CLASS_KIND_JSP : ElementPresentationUtil.getClassKind(aClass);
//abstract class before concrete
if (pos == ElementPresentationUtil.CLASS_KIND_CLASS || pos == ElementPresentationUtil.CLASS_KIND_EXCEPTION) {
boolean isAbstract = aClass.hasModifierProperty(PsiModifier.ABSTRACT) && !aClass.isInterface();

View File

@@ -27,7 +27,6 @@ import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.jsp.jspJava.JspClass;
import com.intellij.psi.util.*;
import com.intellij.ui.RowIcon;
import com.intellij.util.PlatformIcons;
@@ -79,7 +78,7 @@ public class ElementPresentationUtil implements PlatformIcons {
private static final int CLASS_KIND_ANONYMOUS = 40;
private static final int CLASS_KIND_ENUM = 50;
private static final int CLASS_KIND_ASPECT = 60;
private static final int CLASS_KIND_JSP = 70;
public static final int CLASS_KIND_JSP = 70;
public static final int CLASS_KIND_EXCEPTION = 80;
private static final int CLASS_KIND_JUNIT_TEST = 90;
private static final int CLASS_KIND_RUNNABLE = 100;
@@ -105,7 +104,6 @@ public class ElementPresentationUtil implements PlatformIcons {
if (aClass.isAnnotationType()) return CLASS_KIND_ANNOTATION;
if (aClass.isEnum()) return CLASS_KIND_ENUM;
if (aClass.isInterface()) return CLASS_KIND_INTERFACE;
if (aClass instanceof JspClass) return CLASS_KIND_JSP;
if (aClass instanceof PsiAnonymousClass) return CLASS_KIND_ANONYMOUS;
return CLASS_KIND_CLASS;
@@ -141,9 +139,6 @@ public class ElementPresentationUtil implements PlatformIcons {
if (aClass.isInterface()) {
return CLASS_KIND_INTERFACE;
}
if (aClass instanceof JspClass) {
return CLASS_KIND_JSP;
}
if (aClass instanceof PsiAnonymousClass) {
return CLASS_KIND_ANONYMOUS;
}
@@ -183,8 +178,6 @@ public class ElementPresentationUtil implements PlatformIcons {
BASE_ICON.put(CLASS_KIND_EXCEPTION | FLAGS_ABSTRACT, ABSTRACT_EXCEPTION_CLASS_ICON);
BASE_ICON.put(CLASS_KIND_INTERFACE, INTERFACE_ICON);
BASE_ICON.put(CLASS_KIND_INTERFACE | FLAGS_ABSTRACT, INTERFACE_ICON);
BASE_ICON.put(CLASS_KIND_JSP, JSP_ICON);
BASE_ICON.put(CLASS_KIND_JSP | FLAGS_ABSTRACT, JSP_ICON);
BASE_ICON.put(CLASS_KIND_JUNIT_TEST, CLASS_ICON);
BASE_ICON.put(CLASS_KIND_JUNIT_TEST | FLAGS_ABSTRACT, ABSTRACT_CLASS_ICON);
BASE_ICON.put(CLASS_KIND_RUNNABLE, CLASS_ICON);

View File

@@ -255,12 +255,14 @@ public class PsiClassImplUtil {
}
private static class ClassIconRequest {
public PsiClass psiClass;
public int flags;
public final PsiClass psiClass;
public final int flags;
public final Icon symbolIcon;
private ClassIconRequest(PsiClass psiClass, int flags) {
private ClassIconRequest(PsiClass psiClass, int flags, Icon symbolIcon) {
this.psiClass = psiClass;
this.flags = flags;
this.symbolIcon = symbolIcon;
}
@Override
@@ -289,21 +291,29 @@ public class PsiClassImplUtil {
if (!r.psiClass.isValid() || r.psiClass.getProject().isDisposed()) return null;
final boolean isLocked = (r.flags & Iconable.ICON_FLAG_READ_STATUS) != 0 && !r.psiClass.isWritable();
Icon symbolIcon = ElementPresentationUtil.getClassIconOfKind(r.psiClass, ElementPresentationUtil.getClassKind(r.psiClass));
Icon symbolIcon = r.symbolIcon != null
? r.symbolIcon
: ElementPresentationUtil.getClassIconOfKind(r.psiClass, ElementPresentationUtil.getClassKind(r.psiClass));
RowIcon baseIcon = ElementBase.createLayeredIcon(symbolIcon, ElementPresentationUtil.getFlags(r.psiClass, isLocked));
return ElementPresentationUtil.addVisibilityIcon(r.psiClass, r.flags, baseIcon);
}
};
public static Icon getClassIcon(final int flags, final PsiClass aClass) {
return getClassIcon(flags, aClass, null);
}
public static Icon getClassIcon(int flags, PsiClass aClass, @Nullable Icon symbolIcon) {
Icon base = Iconable.LastComputedIcon.get(aClass, flags);
if (base == null) {
Icon symbolIcon = ElementPresentationUtil.getClassIconOfKind(aClass, ElementPresentationUtil.getBasicClassKind(aClass));
if (symbolIcon == null) {
symbolIcon = ElementPresentationUtil.getClassIconOfKind(aClass, ElementPresentationUtil.getBasicClassKind(aClass));
}
RowIcon baseIcon = ElementBase.createLayeredIcon(symbolIcon, 0);
base = ElementPresentationUtil.addVisibilityIcon(aClass, flags, baseIcon);
}
return IconDeferrer.getInstance().defer(base, new ClassIconRequest(aClass, flags), FULL_ICON_EVALUATOR);
return IconDeferrer.getInstance().defer(base, new ClassIconRequest(aClass, flags, symbolIcon), FULL_ICON_EVALUATOR);
}
public static SearchScope getClassUseScope(final PsiClass aClass) {

View File

@@ -22,7 +22,6 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.impl.file.impl.ResolveScopeManagerImpl;
import com.intellij.psi.impl.light.LightClassReference;
import com.intellij.psi.impl.source.PsiClassReferenceType;
import com.intellij.psi.impl.source.PsiImmediateClassType;
@@ -40,6 +39,7 @@ import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.PairFunction;
import com.intellij.util.Processor;
@@ -351,9 +351,9 @@ public class PsiImplUtil {
@NotNull
public static SearchScope getMemberUseScope(@NotNull PsiMember member) {
final GlobalSearchScope maximalUseScope = ResolveScopeManagerImpl.getElementUseScope(member);
final GlobalSearchScope maximalUseScope = ResolveScopeManager.getElementUseScope(member);
PsiFile file = member.getContainingFile();
if (JspPsiUtil.isInJspFile(file)) return maximalUseScope;
if (isInServerPage(file)) return maximalUseScope;
PsiClass aClass = member.getContainingClass();
if (aClass instanceof PsiAnonymousClass) {
@@ -386,6 +386,15 @@ public class PsiImplUtil {
}
}
public static boolean isInServerPage(@Nullable final PsiElement element) {
return getServerPageFile(element) != null;
}
public static ServerPageFile getServerPageFile(final PsiElement element) {
final PsiFile psiFile = PsiUtilCore.getTemplateLanguageFile(element);
return psiFile instanceof ServerPageFile ? (ServerPageFile)psiFile : null;
}
public static PsiElement setName(@NotNull PsiElement element, @NotNull String name) throws IncorrectOperationException {
PsiManager manager = element.getManager();
PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();

View File

@@ -20,6 +20,7 @@
package com.intellij.psi.impl.source.resolve;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.InheritanceUtil;
@@ -73,7 +74,7 @@ public class JavaResolveUtil {
if (visibility == JavaCodeFragment.VisibilityChecker.Visibility.NOT_VISIBLE) return false;
}
}
else if (placeFile instanceof XmlFile && !JspPsiUtil.isInJspFile(placeFile)) return true;
else if (placeFile instanceof XmlFile && !PsiImplUtil.isInServerPage(placeFile)) return true;
// We don't care about access rights in javadoc
if (isInJavaDoc(place)) return true;
@@ -84,8 +85,8 @@ public class JavaResolveUtil {
int effectiveAccessLevel = PsiUtil.getAccessLevel(modifierList);
PsiFile file = placeFile == null ? null : FileContextUtil.getContextFile(placeFile); //TODO: implementation method!!!!
if (JspPsiUtil.isInJspFile(file) && JspPsiUtil.isInJspFile(member.getContainingFile())) return true;
if (file instanceof XmlFile && !JspPsiUtil.isInJspFile(file)) return true;
if (PsiImplUtil.isInServerPage(file) && PsiImplUtil.isInServerPage(member.getContainingFile())) return true;
if (file instanceof XmlFile && !PsiImplUtil.isInServerPage(file)) return true;
if (effectiveAccessLevel == PsiUtil.ACCESS_LEVEL_PUBLIC) {
return true;
}

View File

@@ -16,9 +16,10 @@
package com.intellij.psi.jsp;
import com.intellij.psi.PsiClass;
import com.intellij.psi.ServerPageFile;
import com.intellij.psi.xml.XmlTag;
public interface JspFile extends BaseJspFile {
public interface JspFile extends BaseJspFile, ServerPageFile {
JspFile[] EMPTY_ARRAY = new JspFile[0];
XmlTag[] getDirectiveTagsInContext(JspDirectiveKind directiveKind);

View File

@@ -0,0 +1,22 @@
/*
* 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;
/**
* @author yole
*/
public interface ServerPageFile extends PsiFile {
}