package com.chrisfolger.needsmoredojo.intellij.reference; import com.chrisfolger.needsmoredojo.core.amd.define.DefineResolver; import com.chrisfolger.needsmoredojo.core.amd.define.DefineStatement; import com.chrisfolger.needsmoredojo.core.amd.filesystem.DojoModuleFileResolver; import com.chrisfolger.needsmoredojo.core.amd.filesystem.SourceLibrary; import com.chrisfolger.needsmoredojo.core.amd.filesystem.SourcesLocator; import com.chrisfolger.needsmoredojo.core.amd.importing.ImportResolver; import com.chrisfolger.needsmoredojo.core.amd.naming.NameResolver; import com.chrisfolger.needsmoredojo.core.amd.psi.AMDPsiUtil; import com.chrisfolger.needsmoredojo.intellij.inspections.DojoInspection; import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler; import com.intellij.lang.Language; import com.intellij.lang.javascript.psi.JSExpression; import com.intellij.lang.javascript.psi.JSNewExpression; import com.intellij.lang.javascript.psi.JSParameter; import com.intellij.lang.javascript.psi.JSReferenceExpression; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.Nullable; import java.util.LinkedHashMap; /** * This action provides Goto ... declaration functionality for any AMD module references. * * There's some logic in here that I could have separated out, but since it is not reusable I just kept * it in here for the moment. In the future it can be separated out if necessary. */ public class ImportGotoDeclarationHandler extends DojoDeclarationHandler implements GotoDeclarationHandler { @Nullable @Override public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int i, Editor editor) { if(psiElement == null || !psiElement.getLanguage().equals(Language.findLanguageByID("JavaScript"))) { return new PsiElement[0]; } if(!isEnabled(psiElement.getProject())) { return new PsiElement[0]; } PsiElement referencedDefine = AMDPsiUtil.resolveReferencedDefine(psiElement); if(referencedDefine == null) { return new PsiElement[0]; } PsiFile referencedFile = new DojoModuleFileResolver().resolveReferencedFile(psiElement.getProject(), referencedDefine); if(referencedFile == null) { return new PsiElement[0]; } return new PsiElement[] { referencedFile }; } @Nullable @Override public String getActionText(DataContext dataContext) { return "jump to AMD import"; } }