diff options
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.java | 70 |
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; + } +} |