blob: 99917ad232409e603fdaf109e8df75469581e759 [file] [log] [blame]
package com.intellij.structuralsearch.impl.matcher.compiler;
import com.intellij.psi.PsiElement;
import com.intellij.psi.XmlRecursiveElementVisitor;
import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlText;
import com.intellij.psi.xml.XmlToken;
import com.intellij.structuralsearch.impl.matcher.filters.TagValueFilter;
import com.intellij.structuralsearch.impl.matcher.handlers.MatchingHandler;
import com.intellij.structuralsearch.impl.matcher.handlers.TopLevelMatchingHandler;
import com.intellij.structuralsearch.impl.matcher.handlers.XmlTextHandler;
import com.intellij.structuralsearch.impl.matcher.strategies.XmlMatchingStrategy;
/**
* @author Eugene.Kudelevsky
*/
public class XmlCompilingVisitor extends XmlRecursiveElementVisitor {
private final GlobalCompilingVisitor myCompilingVisitor;
public XmlCompilingVisitor(GlobalCompilingVisitor compilingVisitor) {
this.myCompilingVisitor = compilingVisitor;
}
@Override public void visitElement(PsiElement element) {
myCompilingVisitor.handle(element);
super.visitElement(element);
}
@Override public void visitXmlToken(XmlToken token) {
super.visitXmlToken(token);
if (token.getParent() instanceof XmlText && myCompilingVisitor.getContext().getPattern().isRealTypedVar(token)) {
final MatchingHandler handler = myCompilingVisitor.getContext().getPattern().getHandler(token);
handler.setFilter(TagValueFilter.getInstance());
final XmlTextHandler parentHandler = new XmlTextHandler();
myCompilingVisitor.getContext().getPattern().setHandler(token.getParent(), parentHandler);
parentHandler.setFilter(TagValueFilter.getInstance());
}
}
@Override public void visitXmlTag(XmlTag xmlTag) {
myCompilingVisitor.setCodeBlockLevel(myCompilingVisitor.getCodeBlockLevel() + 1);
super.visitXmlTag(xmlTag);
myCompilingVisitor.setCodeBlockLevel(myCompilingVisitor.getCodeBlockLevel() - 1);
if (myCompilingVisitor.getCodeBlockLevel() == 1) {
myCompilingVisitor.getContext().getPattern().setStrategy(XmlMatchingStrategy.getInstance());
myCompilingVisitor.getContext().getPattern()
.setHandler(xmlTag, new TopLevelMatchingHandler(myCompilingVisitor.getContext().getPattern().getHandler(xmlTag)));
}
}
}