JSP visitor separated from Java

This commit is contained in:
Dmitry Jemerov
2009-08-31 17:46:16 +04:00
parent e52db6cf4d
commit cbf0666157
7 changed files with 83 additions and 30 deletions
@@ -8,6 +8,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.psi.*;
import com.intellij.psi.jsp.JspFile;
import com.intellij.psi.jsp.JavaJspElementVisitor;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
@@ -18,7 +19,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.*;
class ControlFlowAnalyzer extends JavaElementVisitor {
class ControlFlowAnalyzer extends JavaJspElementVisitor {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.controlFlow.ControlFlowAnalyzer");
private final PsiElement myCodeFragment;
@@ -6,6 +6,7 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.jsp.JavaJspRecursiveElementVisitor;
import com.intellij.psi.jsp.JspFile;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
@@ -13,7 +14,7 @@ import org.jetbrains.annotations.NotNull;
/**
* @author max
*/
public class BraceEnforcer extends JavaRecursiveElementVisitor {
public class BraceEnforcer extends JavaJspRecursiveElementVisitor {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.codeStyle.BraceEnforcer");
private final AbstractPostFormatProcessor myPostProcessor;
@@ -16,9 +16,6 @@
package com.intellij.psi;
import com.intellij.psi.javadoc.*;
import com.intellij.psi.jsp.JspFile;
import com.intellij.psi.jsp.JspImplicitVariable;
import com.intellij.psi.templateLanguages.OuterLanguageElement;
@SuppressWarnings({"JavaDoc"})
public abstract class JavaElementVisitor extends PsiElementVisitor {
@@ -319,18 +316,10 @@ public abstract class JavaElementVisitor extends PsiElementVisitor {
visitFile(file);
}
public void visitJspFile(JspFile file){
visitFile(file);
}
public void visitImplicitVariable(ImplicitVariable variable) {
visitLocalVariable(variable);
}
public void visitJspImplicitVariable(JspImplicitVariable variable){
visitImplicitVariable(variable);
}
public void visitDocToken(PsiDocToken token) {
visitElement(token);
}
@@ -3,7 +3,6 @@
*/
package com.intellij.psi;
import com.intellij.psi.jsp.JspFile;
import com.intellij.util.containers.Stack;
public abstract class JavaRecursiveElementVisitor extends JavaElementVisitor {
@@ -51,11 +50,4 @@ public abstract class JavaRecursiveElementVisitor extends JavaElementVisitor {
myRefExprsInVisit.pop();
}
}
//override in order to visit each root directly in visitor
@Override public void visitJspFile(JspFile file) {
super.visitJspFile(file);
visitClass(file.getJavaClass());
visitFile(file.getBaseLanguageRoot());
}
}
@@ -3,8 +3,6 @@
*/
package com.intellij.psi;
import com.intellij.psi.jsp.JspFile;
public abstract class JavaRecursiveElementWalkingVisitor extends JavaElementVisitor {
private final PsiWalkingState myWalkingState = new PsiWalkingState(this){
public void elementFinished(PsiElement element) {
@@ -27,13 +25,6 @@ public abstract class JavaRecursiveElementWalkingVisitor extends JavaElementVisi
visitReferenceElement(expression);
}
//override in order to visit each root directly in visitor
@Override public void visitJspFile(JspFile file) {
super.visitJspFile(file);
visitClass(file.getJavaClass());
visitFile(file.getBaseLanguageRoot());
}
public void stopWalking() {
myWalkingState.stopWalking();
}
@@ -0,0 +1,16 @@
package com.intellij.psi.jsp;
import com.intellij.psi.JavaElementVisitor;
/**
* @author yole
*/
public abstract class JavaJspElementVisitor extends JavaElementVisitor {
public void visitJspImplicitVariable(JspImplicitVariable variable){
visitImplicitVariable(variable);
}
public void visitJspFile(JspFile jspFile) {
visitFile(jspFile);
}
}
@@ -0,0 +1,63 @@
package com.intellij.psi.jsp;
import com.intellij.psi.PsiReferenceExpression;
import com.intellij.psi.PsiBinaryExpression;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.Stack;
/**
* @author yole
*/
public abstract class JavaJspRecursiveElementVisitor extends JavaJspElementVisitor {
// This stack thing is intended to prevent exponential child traversing due to visitReferenceExpression calls both visitRefElement
// and visitExpression.
private final Stack<PsiReferenceExpression> myRefExprsInVisit = new Stack<PsiReferenceExpression>();
private final Stack<PsiBinaryExpression> myBinaryExpressions = new Stack<PsiBinaryExpression>();
@Override
public void visitElement(PsiElement element) {
if (!myRefExprsInVisit.isEmpty() && myRefExprsInVisit.peek() == element) {
myRefExprsInVisit.pop();
myRefExprsInVisit.push(null);
}
else if (element instanceof PsiBinaryExpression) {
//implement smart traversing to avoid stack overflow
if (!myBinaryExpressions.isEmpty() && myBinaryExpressions.peek() == element) {
return;
}
PsiElement child = element.getFirstChild();
while (child != null) {
if (child instanceof PsiBinaryExpression) {
myBinaryExpressions.push((PsiBinaryExpression)child);
}
child.accept(this);
child = child.getNextSibling();
if (child == null) {
child = myBinaryExpressions.isEmpty() ? null : myBinaryExpressions.pop();
if (child != null) child = child.getFirstChild();
}
}
}
else {
element.acceptChildren(this);
}
}
@Override public void visitReferenceExpression(PsiReferenceExpression expression) {
myRefExprsInVisit.push(expression);
try {
visitExpression(expression);
visitReferenceElement(expression);
}
finally {
myRefExprsInVisit.pop();
}
}
//override in order to visit each root directly in visitor
@Override public void visitJspFile(JspFile file) {
super.visitJspFile(file);
visitClass(file.getJavaClass());
visitFile(file.getBaseLanguageRoot());
}
}