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