package com.nvlad.yii2support.i18n; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.jetbrains.php.lang.psi.elements.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; /** * Created by NVlad on 06.01.2017. */ class Util { @NotNull static PsiElement[] getCategories(PhpPsiElement element) { ArrayList<PsiElement> categories = new ArrayList<>(); PsiDirectory directory = getDirectory(element); if (directory != null) { Collections.addAll(categories, directory.getFiles()); } return categories.toArray(new PsiElement[categories.size()]); } @NotNull static ArrayHashElement[] getMessages(PhpPsiElement element, String category) { ArrayList<ArrayHashElement> messages = new ArrayList<>(); PsiDirectory directory = getDirectory(element); if (directory != null) { PsiFile file = directory.findFile(category.concat(".php")); if (file != null) { messages.addAll(loadMessagesFromFile(file)); } } return messages.toArray(new ArrayHashElement[messages.size()]); } // // public String[] getMessagePointers(String category, String message) { // return new String[0]; // } @NotNull static String PhpExpressionValue(PhpExpression expression) { if (expression instanceof StringLiteralExpression) { return ((StringLiteralExpression) expression).getContents(); } if (expression instanceof ConstantReference) { Constant constant = (Constant) ((ConstantReference) expression).resolve(); if (constant != null) { return PhpExpressionValue((PhpExpression) constant.getValue()); } } if (expression instanceof ClassConstantReference) { ClassReference classReference = (ClassReference) ((ClassConstantReference) expression).getClassReference(); if (classReference != null) { PhpClass phpClass = (PhpClass) classReference.resolve(); if (phpClass != null) { Field field = phpClass.findFieldByName(expression.getName(), true); if (field != null) { return PhpExpressionValue((PhpExpression) field.getDefaultValue()); } } } } if (expression instanceof Variable) { PhpExpression variable = (PhpExpression) ((Variable) expression).resolve(); if (variable != null && variable.getContext() instanceof AssignmentExpression) { AssignmentExpression assignmentExpression = (AssignmentExpression) variable.getContext(); return PhpExpressionValue((PhpExpression) assignmentExpression.getValue()); } } if (expression instanceof ConcatenationExpression) { ConcatenationExpression concatenation = (ConcatenationExpression) expression; return PhpExpressionValue((PhpExpression) concatenation.getLeftOperand()) + PhpExpressionValue((PhpExpression) concatenation.getRightOperand()); } String expressionType = expression.getType().toString(); if (expressionType.equals("int") || expressionType.equals("float")) { return expression.getText(); } return ""; } @Nullable private static PsiDirectory getDirectory(PsiElement element) { PsiFile file = element.getContainingFile().getOriginalFile(); String filename = file.getName(); PsiDirectory directory = file.getParent(); filename = filename.substring(0, filename.lastIndexOf(".")); if (directory != null) { if (filename.endsWith("Controller")) { directory = directory.getParentDirectory(); } else { PsiDirectory messageParent = directory.findSubdirectory("messages"); while (messageParent == null) { directory = directory.getParentDirectory(); if (directory == null) { break; } messageParent = directory.findSubdirectory("messages"); } } } if (directory != null) { directory = directory.findSubdirectory("messages"); if (directory != null && directory.getSubdirectories().length > 0) { directory = directory.getSubdirectories()[0]; return directory; } } return null; } private static Collection<ArrayHashElement> loadMessagesFromFile(PsiFile file) { ArrayList<ArrayHashElement> result = new ArrayList<>(); GroupStatement groupStatement = (GroupStatement) file.getFirstChild(); for (PsiElement element : groupStatement.getChildren()) { if (element instanceof PhpReturn) { if (((PhpReturn) element).getFirstPsiChild() instanceof ArrayCreationExpression) { ArrayCreationExpression array = (ArrayCreationExpression) ((PhpReturn) element).getFirstPsiChild(); if (array != null) { for (ArrayHashElement hashElement : array.getHashElements()) { result.add(hashElement); } } } break; } } return result; } }