summaryrefslogtreecommitdiff
path: root/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/XmlCompilingVisitor.java
diff options
context:
space:
mode:
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.java53
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)));
+ }
+ }
+}