package com.intellij.structuralsearch.impl.matcher; import com.intellij.psi.PsiElement; import com.intellij.structuralsearch.MatchResult; import com.intellij.structuralsearch.plugin.util.SmartPsiPointer; import org.jetbrains.annotations.NonNls; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Class describing the match result */ public final class MatchResultImpl extends MatchResult { private String name; private SmartPsiPointer matchRef; private int start; private int end = -1; private String matchImage; private List matches; private MatchResult parent; private boolean target; @NonNls public static final String DEFAULT_NAME2 = "end of context match"; @NonNls public static final String DEFAULT_NAME = "start of context match"; private boolean myScopeMatch; private boolean myMultipleMatch; @NonNls private static final String NULL = "null"; private MatchResultImpl myContext; MatchResultImpl() { } public MatchResultImpl(String name, String image, SmartPsiPointer ref, boolean target) { this(name,image,ref,0,-1,target); } public MatchResultImpl(String name, String image, SmartPsiPointer ref, int start, int end,boolean target) { matchRef = ref; this.name = name; matchImage = image; this.target = target; this.start = start; this.end = end; } public String getMatchImage() { if (matchImage==null) { matchImage = NULL; } return matchImage; } public void setParent(MatchResult parent) { this.parent = parent; } public SmartPsiPointer getMatchRef() { return matchRef; } public PsiElement getMatch() { return matchRef.getElement(); } public void setMatchRef(SmartPsiPointer matchStart) { matchRef = matchStart; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List getMatches() { if (matches==null) matches = new ArrayList(); return matches; } public List getAllSons() { return getMatches(); } public boolean hasSons() { return matches!=null; } public boolean isScopeMatch() { return myScopeMatch; } public boolean isMultipleMatch() { return myMultipleMatch; } public void clear() { if (matchRef != null) { matchRef.clear(); matchRef = null; } if (matches != null) { for (final MatchResult match : matches) { ((MatchResultImpl)match).clear(); } matches = null; } name = null; matchImage = null; } public void clearMatches() { matches = null; } public void setScopeMatch(final boolean scopeMatch) { myScopeMatch = scopeMatch; } public void setMultipleMatch(final boolean multipleMatch) { myMultipleMatch = multipleMatch; } public MatchResultImpl findSon(String name) { if (matches!=null) { // @todo this could be performance bottleneck, replace with hash lookup! for (final MatchResult match : matches) { final MatchResultImpl res = (MatchResultImpl)match; if (name.equals(res.getName())) { return res; } } } return null; } public MatchResultImpl removeSon(String typedVar) { if (matches == null) return null; // @todo this could be performance bottleneck, replace with hash lookup! for(Iterator i=matches.iterator();i.hasNext();) { final MatchResultImpl res = (MatchResultImpl)i.next(); if (typedVar.equals(res.getName())) { i.remove(); return res; } } return null; } public void addSon(MatchResultImpl result) { getMatches().add(result); } public void setMatchImage(String matchImage) { this.matchImage = matchImage; } public boolean isTarget() { return target; } public void setTarget(boolean target) { this.target = target; } public boolean isMatchImageNull() { return matchImage==null; } public int getStart() { return start; } public void setStart(int start) { this.start = start; } public int getEnd() { return end; } public void setEnd(int end) { this.end = end; } public void setContext(final MatchResultImpl context) { myContext = context; } public MatchResultImpl getContext() { return myContext; } @Override public String toString() { return "MatchResultImpl{name='" + name + '\'' + ", matchImage='" + matchImage + '\'' + "}"; } }