blob: 8761472d813a779c9acfa9ad91ec773d276ee98e [file] [log] [blame]
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<MatchResult> 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<MatchResult> getMatches() {
if (matches==null) matches = new ArrayList<MatchResult>();
return matches;
}
public List<MatchResult> 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<MatchResult> 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 + '\'' + "}";
}
}