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; } }