package com.nvlad.yii2support.i18n; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.CompletionResultSet; import com.intellij.psi.PsiElement; import com.intellij.util.ProcessingContext; import com.jetbrains.php.lang.psi.elements.*; import org.jetbrains.annotations.NotNull; /** * Created by NVlad on 06.01.2017. */ class CompletionProvider extends com.intellij.codeInsight.completion.CompletionProvider<CompletionParameters> { @Override protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet result) { PhpPsiElement psiElement = (PhpPsiElement) parameters.getPosition().getParent(); MethodReference methodReference = (MethodReference) psiElement.getParent().getParent(); PhpExpression classReference = methodReference.getClassReference(); if (classReference != null && classReference.getName() != null) { if (methodReference.isStatic() && classReference.getName().equals("Yii")) { String methodName = methodReference.getName(); if (methodName != null && methodReference.getParameterList() != null) { PsiElement[] methodParameters = methodReference.getParameterList().getParameters(); int parameterIndex = -1; for (int i = 0; i < methodParameters.length; i++) { if (psiElement == methodParameters[i]) { parameterIndex = i; break; } } switch (parameterIndex) { case 0: fillCategories(psiElement, result); break; case 1: if (methodParameters[0] instanceof StringLiteralExpression) { String category = ((StringLiteralExpression) methodParameters[0]).getContents(); fillMessages(psiElement, category, result); } break; } } } } } private void fillCategories(PhpPsiElement element, CompletionResultSet result) { for (PsiElement category : Util.getCategories(element)) { result.addElement(new CategoryLookupElement(category)); } } private void fillMessages(PhpPsiElement element, String category, CompletionResultSet result) { for (ArrayHashElement message : Util.getMessages(element, category)) { result.addElement(new MessageLookupElement(element, message)); } } }