package com.nvlad.yii2support.i18n; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.AutoCompletionPolicy; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; import com.intellij.psi.PsiElement; import com.jetbrains.php.lang.psi.elements.*; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by NVlad on 06.01.2017. */ class MessageLookupElement extends LookupElement { final private PhpPsiElement myElement; final private ArrayHashElement myMessage; MessageLookupElement(PhpPsiElement element, ArrayHashElement message) { myElement = element; myMessage = message; } @NotNull @Override public String getLookupString() { return Util.PhpExpressionValue((PhpExpression) myMessage.getKey()); } @Override public void renderElement(LookupElementPresentation presentation) { super.renderElement(presentation); if (myMessage.getKey() instanceof StringLiteralExpression) { presentation.setItemText(((StringLiteralExpression) myMessage.getKey()).getContents()); presentation.setIcon(myMessage.getKey().getIcon(0)); } PhpExpression value = (PhpExpression) myMessage.getValue(); if (value != null) { String text = Util.PhpExpressionValue(value); if (!text.isEmpty()) { presentation.setTailText(" = " + text, true); } presentation.setTypeText(value.getType().toString()); presentation.setTypeGrayed(true); } } @Override public void handleInsert(InsertionContext context) { super.handleInsert(context); int suffixLength = myElement.getText().length() - 21 - myElement.getText().lastIndexOf("IntellijIdeaRulezzz "); int blockStart = context.getSelectionEndOffset(); context.getDocument().deleteString(blockStart, blockStart + suffixLength); if (myMessage.getValue() instanceof StringLiteralExpression) { ArrayList<String> matches = new ArrayList<>(); StringLiteralExpression value = (StringLiteralExpression) myMessage.getValue(); Pattern pointers = Pattern.compile("\\{([\\w\\d]+)[},]", Pattern.MULTILINE | Pattern.UNICODE_CASE); Matcher matcher = pointers.matcher(value.getContents()); while (matcher.find()) { String match = matcher.group(1); if (!matches.contains(match)) { matches.add(match); } } if (matches.size() > 0) { ParameterList parameterList = (ParameterList) myElement.getParent(); if (parameterList.getParameters().length == 2) { String params = ""; if (matches.size() == 1 && matches.get(0).equals("0")) { params = ", []"; } else { for (String match : matches) { if (params.length() > 0) { params = params + ", "; } params = params.concat("'" + match + "' => "); } params = ", [" + params + "]"; } context.getDocument().insertString(context.getSelectionEndOffset() + 1, params); } } else { cleanParams(context); } } else { cleanParams(context); } } @Override public AutoCompletionPolicy getAutoCompletionPolicy() { return AutoCompletionPolicy.GIVE_CHANCE_TO_OVERWRITE; } private void cleanParams(InsertionContext context) { ParameterList parameterList = (ParameterList) myElement.getParent(); if (parameterList.getParameters().length == 3) { PsiElement[] parameters = parameterList.getParameters(); int blockStart = context.getSelectionEndOffset() + 1; int paramSpace = parameters[2].getTextRange().getStartOffset() - parameters[1].getTextRange().getEndOffset(); int blockLength = parameters[2].getTextLength() + paramSpace; context.getDocument().deleteString(blockStart, blockStart + blockLength); } } }