package org.angularjs.codeInsight; import com.intellij.codeInsight.completion.CompletionContributor; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.CompletionResultSet; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.lang.javascript.JSTokenTypes; import com.intellij.lang.javascript.JavascriptLanguage; import com.intellij.lang.javascript.completion.JSCompletionUtil; import com.intellij.lang.javascript.completion.JSLookupPriority; import com.intellij.lang.javascript.psi.JSLiteralExpression; import com.intellij.lang.javascript.psi.JSProperty; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.impl.source.tree.LeafPsiElement; import com.intellij.util.indexing.FileBasedIndex; import org.angularjs.codeInsight.refs.AngularJSReferencesContributor; import org.angularjs.index.AngularIndexUtil; import org.angularjs.index.AngularJSIndexingHandler; import org.angularjs.index.AngularModuleIndex; import org.angularjs.index.AngularUiRouterViewsIndex; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; /** * @author Irina.Chernushina on 2/22/2016. */ public class AngularJavaScriptCompletionContributor extends CompletionContributor { @Override public void fillCompletionVariants(@NotNull CompletionParameters parameters, @NotNull CompletionResultSet result) { if (AngularJSCompletionContributor.getElementLanguage(parameters).isKindOf(JavascriptLanguage.INSTANCE)) { PsiElement originalPosition = parameters.getOriginalPosition(); if (originalPosition == null) return; final Project project = originalPosition.getProject(); if (AngularJSReferencesContributor.UI_VIEW_PATTERN.accepts(originalPosition)) { final FileBasedIndex instance = FileBasedIndex.getInstance(); final Collection<String> keys = instance.getAllKeys(AngularUiRouterViewsIndex.UI_ROUTER_VIEWS_CACHE_INDEX, project); addCompletionVariants(result, keys, " (angular-ui-router ui-view)"); } else { originalPosition = originalPosition instanceof LeafPsiElement && ((LeafPsiElement)originalPosition).getElementType() == JSTokenTypes.STRING_LITERAL ? originalPosition.getParent() : originalPosition; if (AngularJSReferencesContributor.MODULE_PATTERN.accepts(originalPosition) || AngularJSReferencesContributor.MODULE_DEPENDENCY_PATTERN.accepts(originalPosition)) { final Collection<String> keys = AngularIndexUtil.getAllKeys(AngularModuleIndex.KEY, project); addCompletionVariants(result, keys, " (AngularJS module)"); } } } } static void addCompletionVariants(@NotNull CompletionResultSet result, Collection<String> keys, @Nullable final String comment) { for (String key : keys) { if (StringUtil.isEmptyOrSpaces(key)) { continue; } LookupElementBuilder builder = LookupElementBuilder.create(key); if (comment != null) { builder = builder.withTailText(comment, true); } final LookupElement item = JSCompletionUtil.withJSLookupPriority(builder, JSLookupPriority.LOCAL_SCOPE_MAX_PRIORITY); result.addElement(item); } } private static boolean isControllerPropertyValue(JSLiteralExpression literal) { return literal.isQuotedLiteral() && literal.getParent() instanceof JSProperty && AngularJSIndexingHandler.CONTROLLER.equals(((JSProperty)literal.getParent()).getName()); } }