package org.angularjs;
import com.intellij.lang.documentation.DocumentationProviderEx;
import com.intellij.lang.javascript.psi.jsdoc.JSDocComment;
import com.intellij.lang.javascript.psi.jsdoc.JSDocTag;
import com.intellij.lang.javascript.psi.jsdoc.JSDocTagValue;
import com.intellij.lang.javascript.psi.stubs.JSImplicitElement;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlElement;
import org.angularjs.codeInsight.DirectiveUtil;
import org.angularjs.index.AngularDirectivesDocIndex;
import org.angularjs.index.AngularIndexUtil;
import java.util.Collections;
import java.util.List;
/**
* @author Dennis.Ushakov
*/
public class AngularJSDocumentationProvider extends DocumentationProviderEx {
private static PsiElement getElementForDocumentation(final Project project, final String directiveName) {
return AngularIndexUtil.resolve(project, AngularDirectivesDocIndex.KEY, directiveName);
}
@Override
public PsiElement getDocumentationElementForLookupItem(PsiManager psiManager, Object object, PsiElement element) {
if (element instanceof XmlElement) {
return getElementForDocumentation(element.getProject(), object.toString());
}
return null;
}
@Override
public List<String> getUrlFor(PsiElement element, PsiElement originalElement) {
if (element instanceof JSImplicitElement) element = element.getParent();
if (element instanceof JSDocComment) {
JSDocTag ngdocTag = null;
JSDocTag nameTag = null;
for (JSDocTag tag : ((JSDocComment)element).getTags()) {
if ("ngdoc".equals(tag.getName())) ngdocTag = tag;
else if ("name".equals(tag.getName())) nameTag = tag;
}
if (ngdocTag != null && nameTag != null) {
final JSDocTagValue nameValue = nameTag.getValue();
String name = nameValue != null ? nameValue.getText() : null;
if (name != null) name = name.substring(name.indexOf(':') + 1);
if (name != null && AngularIndexUtil.resolve(element.getProject(), AngularDirectivesDocIndex.KEY, DirectiveUtil.getAttributeName(name)) != null) {
final String directiveName = DirectiveUtil.attributeToDirective(null, name);
return Collections.singletonList("http://docs.angularjs.org/api/ng/directive/" + directiveName);
}
}
}
return null;
}
}