package requirejs;
import com.intellij.lang.javascript.psi.JSArgumentList;
import com.intellij.lang.javascript.psi.JSArrayLiteralExpression;
import com.intellij.lang.javascript.psi.JSCallExpression;
import com.intellij.lang.javascript.psi.JSReferenceExpression;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceProvider;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import requirejs.settings.Settings;
public class RequirejsPsiReferenceProvider extends PsiReferenceProvider {
protected Project project;
public Settings settings;
@NotNull
@Override
public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) {
RequirejsProjectComponent projectComponent = psiElement.getProject().getComponent(RequirejsProjectComponent.class);
if (!projectComponent.isEnabled()) {
return PsiReference.EMPTY_ARRAY;
}
String path = psiElement.getText();
if (isRequireCall(psiElement) || isDefineFirstCollection(psiElement)) {
PsiReference ref = new RequirejsReference(psiElement, new TextRange(1, path.length() - 1));
return new PsiReference[] {ref};
}
return new PsiReference[0];
}
public boolean isRequireCall(PsiElement element) {
PsiElement prevEl = element.getParent();
if (prevEl != null) {
prevEl = prevEl.getParent();
}
if (prevEl instanceof JSCallExpression) {
if (prevEl.getChildren().length > 1) {
String requireFunctionName = Settings.REQUIREJS_REQUIRE_FUNCTION_NAME;
if (prevEl.getChildren()[0].getText().toLowerCase().equals(requireFunctionName)) {
return true;
}
}
}
return false;
}
public boolean isDefineFirstCollection(PsiElement element) {
PsiElement jsArrayLiteral = element.getParent();
if (null != jsArrayLiteral && jsArrayLiteral instanceof JSArrayLiteralExpression) {
PsiElement jsArgumentList = jsArrayLiteral.getParent();
if (null != jsArgumentList && jsArgumentList instanceof JSArgumentList) {
PsiElement jsReferenceExpression = jsArgumentList.getPrevSibling();
if (null != jsReferenceExpression && jsReferenceExpression instanceof JSReferenceExpression) {
if (jsReferenceExpression.getText().equals(Settings.REQUIREJS_DEFINE_FUNCTION_NAME)) {
return true;
}
}
}
}
return false;
}
}