package com.thoughtworks.gauge.reference;
import com.intellij.psi.PsiElement;
import com.thoughtworks.gauge.language.psi.SpecStep;
import java.util.Hashtable;
public class ReferenceCache {
private final Hashtable<String, PsiStepReferenceCache> stepReferences;
public ReferenceCache() {
this.stepReferences = new Hashtable<>();
}
public PsiElement searchReferenceFor(SpecStep step) {
try {
String stepValueText = step.getStepValue().getStepText();
PsiStepReferenceCache element = stepReferences.get(stepValueText);
if (isValid(element)) {
return element.getPsiElement();
}
stepReferences.remove(stepValueText);
} catch (Exception e) {
return null;
}
return null;
}
public void addStepReference(SpecStep step, PsiElement referenceElement) {
if (isValidPsiElement(referenceElement)) {
stepReferences.put(step.getStepValue().getStepText(), new PsiStepReferenceCache(referenceElement.getText(), referenceElement));
}
}
private boolean isValidPsiElement(PsiElement psiElement) {
return psiElement != null && psiElement.isValid();
}
private boolean isValid(PsiStepReferenceCache element) {
if (element == null || element.getPsiElement() == null) {
return false;
}
PsiElement psiElement = element.getPsiElement();
return psiElement.isValid() && element.getText().equals(psiElement.getText());
}
private class PsiStepReferenceCache {
private String text;
private PsiElement psiElement;
public PsiStepReferenceCache(String text, PsiElement psiElement) {
this.text = text;
this.psiElement = psiElement;
}
public String getText() {
return text;
}
public PsiElement getPsiElement() {
return psiElement;
}
}
}