summaryrefslogtreecommitdiff
path: root/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java')
-rw-r--r--java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java70
1 files changed, 70 insertions, 0 deletions
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java
new file mode 100644
index 000000000000..dbc97ce67f75
--- /dev/null
+++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/handlers/DocDataHandler.java
@@ -0,0 +1,70 @@
+package com.intellij.structuralsearch.impl.matcher.handlers;
+
+import com.intellij.psi.JavaDocTokenType;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.javadoc.PsiDocTagValue;
+import com.intellij.psi.javadoc.PsiDocToken;
+import com.intellij.structuralsearch.impl.matcher.MatchContext;
+import org.jetbrains.annotations.NonNls;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Handler for doc nodes
+ */
+public class DocDataHandler extends MatchingHandler {
+ @NonNls private static final String P_STR = "^\\s*((?:\\w|_|\\-|\\$)+)\\s*(?:=\\s*\"(.*)\"\\s*)?$";
+ private static final Pattern p = Pattern.compile(
+ P_STR,
+ Pattern.CASE_INSENSITIVE
+ );
+
+ public boolean match(PsiElement node, PsiElement match, MatchContext context) {
+ String text1 = node.getText();
+
+ text1 = getTextFromNode(node, text1);
+
+ Matcher m1 = p.matcher(text1);
+
+ String text2 = match.getText();
+ text2 = getTextFromNode(match, text2);
+
+ Matcher m2 = p.matcher(text2);
+
+ if (m1.matches() && m2.matches()) {
+ String name = m1.group(1);
+ String name2 = m2.group(1);
+ boolean isTypedName = context.getPattern().isTypedVar(name);
+
+ if (name.equals(name2) || isTypedName) {
+ String value = m1.group(2);
+ String value2 = m2.group(2);
+
+ if (value!=null) {
+ if (value2 == null || !value2.matches(value)) return false;
+ }
+ if (isTypedName) {
+ SubstitutionHandler handler = (SubstitutionHandler) context.getPattern().getHandler(name);
+ return handler.handle(match,context);
+ }
+ return true;
+ }
+ }
+ return text1.equals(text2);
+ }
+
+ // since doctag value may be inside doc comment we specially build text including skipped nodes
+ private static String getTextFromNode(final PsiElement node, String text1) {
+ PsiElement nextSibling = node.getNextSibling();
+ if (nextSibling instanceof PsiDocTagValue) {
+ text1 += nextSibling.getText();
+
+ nextSibling = nextSibling.getNextSibling();
+ if (nextSibling instanceof PsiDocToken && ((PsiDocToken)nextSibling).getTokenType() == JavaDocTokenType.DOC_COMMENT_DATA) {
+ text1 += nextSibling.getText();
+ }
+ }
+ return text1;
+ }
+}