diff options
Diffstat (limited to 'platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/XmlCompilingVisitor.java')
-rw-r--r-- | platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/XmlCompilingVisitor.java | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/XmlCompilingVisitor.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/XmlCompilingVisitor.java new file mode 100644 index 000000000000..99917ad23240 --- /dev/null +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/XmlCompilingVisitor.java @@ -0,0 +1,53 @@ +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))); + } + } +} |