// Path: src/com/github/letsdrink/intellijplugin/translation/TranslationParser.java
// public class TranslationParser {
//     public interface Handler {
//         void handle(String key, String text, ArrayHashElement element);
//     }
// 
//     public void parse(PsiFile file, Handler handler) {
//         Collection<PhpReturn> phpReturns = PsiTreeUtil.collectElementsOfType(file, PhpReturn.class);
//         PhpReturn phpReturn = Iterables.getOnlyElement(phpReturns);
//         PsiElement root = phpReturn.getFirstPsiChild();
// 
//         parse(root, handler);
//     }
// 
//     public void parse(PsiElement root, Handler handler) {
//         List<String> keyParts = new ArrayList<>();
//         parse(root, keyParts, handler);
//     }
// 
//     private void parse(PsiElement root, List<String> keyParts, Handler handler) {
//         for (PsiElement psiElement : root.getChildren()) {
//             if (psiElement instanceof ArrayHashElement) {
//                 ArrayHashElement hashElement = (ArrayHashElement) psiElement;
//                 String key = PsiUtils.getContent(hashElement.getKey());
//                 if (key == null) {
//                     throw new IllegalStateException("Unsupported key element: " + hashElement.getKey().getClass());
//                 }
//                 keyParts.add(key);
// 
//                 if (PlatformPatterns.psiElement(PhpElementTypes.ARRAY_CREATION_EXPRESSION).accepts(hashElement.getValue())) {
//                     parse(hashElement.getValue(), keyParts, handler);
//                 } else {
//                     String text = PsiUtils.getContent(hashElement.getValue());
//                     handler.handle(Joiner.on('.').join(keyParts), text, hashElement);
//                 }
//                 keyParts.remove(keyParts.size() - 1);
//             }
//         }
//     }
// }
// 
// Path: src/com/github/letsdrink/intellijplugin/translation/TranslationUtils.java
// public class TranslationUtils {
//     public static List<PsiFile> getTranslationFiles(Project project) {
//         List<PsiFile> translationFiles = new ArrayList<PsiFile>();
//         Settings settings = Settings.getInstance(project);
// 
//         VirtualFile localesPath = settings.getOuzoProjectRoot().findChild("locales");
//         if (localesPath == null) {
//             return translationFiles;
//         }
//         VirtualFile[] locales = VfsUtil.getChildren(localesPath);
// 
//         for (VirtualFile locale : locales) {
//             if ("php".equals(locale.getExtension())) {
//                 translationFiles.add(PsiManager.getInstance(project).findFile(locale));
//             }
//         }
//         return translationFiles;
//     }
// 
//     public static boolean isParent(String parent, String key) {
//         if (!key.startsWith(parent)) {
//             return false;
//         }
//         return key.charAt(parent.length()) == '.';
//     }
// 
//     public static String getParentKey(String key) {
//         List<String> parts = Splitter.on(".").splitToList(key);
//         if (parts.size() == 1) {
//             return null;
//         }
//         return Joiner.on(".").join(Iterables.limit(parts, parts.size() - 1));
//     }
// 
//     public static boolean isTranslationFile(PsiFile file) {
//         return file != null && isTranslationFile(file.getVirtualFile());
//     }
// 
//     public static boolean isTranslationFile(VirtualFile virtualFile) {
//         return virtualFile != null && virtualFile.getParent() != null && "locales".equals(virtualFile.getParent().getName());
//     }
// 
//     public static boolean isTranslationCall(FunctionReference call) {
//         return call.getParameters().length > 0 && (call.getName().equals("t") || call.getText().startsWith("I18n::labels"));
//     }
// 
//     public static PsiElement extractKey(FunctionReference translationCall) {
//         PsiElement parameter = translationCall.getParameters()[0];
// 
//         if (PlatformPatterns.psiElement(PhpElementTypes.CONCATENATION_EXPRESSION).accepts(parameter)) {
//             BinaryExpression binaryExpression = (BinaryExpression) parameter;
//             parameter = binaryExpression.getLeftOperand();
//         }
//         return parameter;
//     }
// 
//     public static String getLastKeyPart(String key) {
//         int lastDotIndex = key.lastIndexOf('.');
//         int beginIndex = lastDotIndex == -1 ? 0 : lastDotIndex + 1;
//         return key.substring(beginIndex);
//     }
// }


import com.github.letsdrink.intellijplugin.translation.TranslationParser;
import com.github.letsdrink.intellijplugin.translation.TranslationUtils;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.util.indexing.*;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import com.jetbrains.php.lang.PhpFileType;
import com.jetbrains.php.lang.psi.elements.ArrayHashElement;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
package com.github.letsdrink.intellijplugin.translation.index;




public class TranslationKeyIndex  extends ScalarIndexExtension<String> {
    public static final ID<String, Void> KEY = ID.create("com.github.letsdrink.intellijplugin.index.TranslationKeyIndex");

    @NotNull
    @Override
    public ID<String, Void> getName() {
        return KEY;
    }

    @NotNull
    @Override
    public DataIndexer<String, Void, FileContent> getIndexer() {
        return new DataIndexer<String, Void, FileContent>() {
            @NotNull
            @Override
            public Map<String, Void> map(@NotNull FileContent fileContent) {
                final Map<String, Void> map = new HashMap<String, Void>();
                PsiFile psiFile = fileContent.getPsiFile();

// Path: src/com/github/letsdrink/intellijplugin/translation/TranslationParser.java
// public class TranslationParser {
//     public interface Handler {
//         void handle(String key, String text, ArrayHashElement element);
//     }
// 
//     public void parse(PsiFile file, Handler handler) {
//         Collection<PhpReturn> phpReturns = PsiTreeUtil.collectElementsOfType(file, PhpReturn.class);
//         PhpReturn phpReturn = Iterables.getOnlyElement(phpReturns);
//         PsiElement root = phpReturn.getFirstPsiChild();
// 
//         parse(root, handler);
//     }
// 
//     public void parse(PsiElement root, Handler handler) {
//         List<String> keyParts = new ArrayList<>();
//         parse(root, keyParts, handler);
//     }
// 
//     private void parse(PsiElement root, List<String> keyParts, Handler handler) {
//         for (PsiElement psiElement : root.getChildren()) {
//             if (psiElement instanceof ArrayHashElement) {
//                 ArrayHashElement hashElement = (ArrayHashElement) psiElement;
//                 String key = PsiUtils.getContent(hashElement.getKey());
//                 if (key == null) {
//                     throw new IllegalStateException("Unsupported key element: " + hashElement.getKey().getClass());
//                 }
//                 keyParts.add(key);
// 
//                 if (PlatformPatterns.psiElement(PhpElementTypes.ARRAY_CREATION_EXPRESSION).accepts(hashElement.getValue())) {
//                     parse(hashElement.getValue(), keyParts, handler);
//                 } else {
//                     String text = PsiUtils.getContent(hashElement.getValue());
//                     handler.handle(Joiner.on('.').join(keyParts), text, hashElement);
//                 }
//                 keyParts.remove(keyParts.size() - 1);
//             }
//         }
//     }
// }
// 
// Path: src/com/github/letsdrink/intellijplugin/translation/TranslationUtils.java
// public class TranslationUtils {
//     public static List<PsiFile> getTranslationFiles(Project project) {
//         List<PsiFile> translationFiles = new ArrayList<PsiFile>();
//         Settings settings = Settings.getInstance(project);
// 
//         VirtualFile localesPath = settings.getOuzoProjectRoot().findChild("locales");
//         if (localesPath == null) {
//             return translationFiles;
//         }
//         VirtualFile[] locales = VfsUtil.getChildren(localesPath);
// 
//         for (VirtualFile locale : locales) {
//             if ("php".equals(locale.getExtension())) {
//                 translationFiles.add(PsiManager.getInstance(project).findFile(locale));
//             }
//         }
//         return translationFiles;
//     }
// 
//     public static boolean isParent(String parent, String key) {
//         if (!key.startsWith(parent)) {
//             return false;
//         }
//         return key.charAt(parent.length()) == '.';
//     }
// 
//     public static String getParentKey(String key) {
//         List<String> parts = Splitter.on(".").splitToList(key);
//         if (parts.size() == 1) {
//             return null;
//         }
//         return Joiner.on(".").join(Iterables.limit(parts, parts.size() - 1));
//     }
// 
//     public static boolean isTranslationFile(PsiFile file) {
//         return file != null && isTranslationFile(file.getVirtualFile());
//     }
// 
//     public static boolean isTranslationFile(VirtualFile virtualFile) {
//         return virtualFile != null && virtualFile.getParent() != null && "locales".equals(virtualFile.getParent().getName());
//     }
// 
//     public static boolean isTranslationCall(FunctionReference call) {
//         return call.getParameters().length > 0 && (call.getName().equals("t") || call.getText().startsWith("I18n::labels"));
//     }
// 
//     public static PsiElement extractKey(FunctionReference translationCall) {
//         PsiElement parameter = translationCall.getParameters()[0];
// 
//         if (PlatformPatterns.psiElement(PhpElementTypes.CONCATENATION_EXPRESSION).accepts(parameter)) {
//             BinaryExpression binaryExpression = (BinaryExpression) parameter;
//             parameter = binaryExpression.getLeftOperand();
//         }
//         return parameter;
//     }
// 
//     public static String getLastKeyPart(String key) {
//         int lastDotIndex = key.lastIndexOf('.');
//         int beginIndex = lastDotIndex == -1 ? 0 : lastDotIndex + 1;
//         return key.substring(beginIndex);
//     }
// }


// Path: src/com/github/letsdrink/intellijplugin/translation/index/TranslationKeyIndex.java
import com.github.letsdrink.intellijplugin.translation.TranslationParser;
import com.github.letsdrink.intellijplugin.translation.TranslationUtils;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.util.indexing.*;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import com.jetbrains.php.lang.PhpFileType;
import com.jetbrains.php.lang.psi.elements.ArrayHashElement;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;

package com.github.letsdrink.intellijplugin.translation.index;




public class TranslationKeyIndex  extends ScalarIndexExtension<String> {
    public static final ID<String, Void> KEY = ID.create("com.github.letsdrink.intellijplugin.index.TranslationKeyIndex");

    @NotNull
    @Override
    public ID<String, Void> getName() {
        return KEY;
    }

    @NotNull
    @Override
    public DataIndexer<String, Void, FileContent> getIndexer() {
        return new DataIndexer<String, Void, FileContent>() {
            @NotNull
            @Override
            public Map<String, Void> map(@NotNull FileContent fileContent) {
                final Map<String, Void> map = new HashMap<String, Void>();
                PsiFile psiFile = fileContent.getPsiFile();

                TranslationParser translationParser = new TranslationParser();