// Path: src/main/java/ru/adelf/idea/dotenv/DotEnvSettings.java
// @State(name = "DotEnvSettings", storages = {@Storage("dot-env.xml")})
// public class DotEnvSettings implements PersistentStateComponent<DotEnvSettings> {
//     public boolean completionEnabled = true;
//     public boolean storeValues = true;
// 
//     @Nullable
//     @Override
//     public DotEnvSettings getState() {
//         return this;
//     }
// 
//     @Override
//     public void loadState(@NotNull DotEnvSettings state) {
//         XmlSerializerUtil.copyBean(state, this);
//     }
// 
//     public static DotEnvSettings getInstance(Project project) {
//         return project.getService(DotEnvSettings.class);
//     }
// }
// 
// Path: src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesProvider.java
// public interface EnvironmentVariablesProvider {
//     @NotNull
//     FileAcceptResult acceptFile(VirtualFile file);
// 
//     @NotNull
//     Collection<KeyValuePsiElement> getElements(PsiFile psiFile);
// }
// 
// Path: src/main/java/ru/adelf/idea/dotenv/models/KeyValuePsiElement.java
// public class KeyValuePsiElement {
// 
//     private final String key;
//     private final String value;
//     private final PsiElement element;
// 
//     public KeyValuePsiElement(String key, String value, PsiElement element) {
//         this.key = key;
//         this.value = value;
//         this.element = element;
//     }
// 
//     public String getKey() {
//         return key.trim();
//     }
// 
//     public String getShortValue() {
//         if (value.indexOf('\n') != -1) {
//             return clearString(value.substring(0, value.indexOf('\n'))) + "...";
//         }
// 
//         return value.trim();
//     }
// 
//     private String clearString(String s) {
//         return StringUtil.trim(s.trim(), ch -> ch != '\\').trim();
//     }
// 
//     public PsiElement getElement() {
//         return element;
//     }
// }
// 
// Path: src/main/java/ru/adelf/idea/dotenv/util/EnvironmentVariablesProviderUtil.java
// public class EnvironmentVariablesProviderUtil {
//     public static final EnvironmentVariablesProvider[] PROVIDERS = getEnvVariablesProviders();
// 
//     public static final EnvironmentVariablesUsagesProvider[] USAGES_PROVIDERS = getEnvVariablesUsagesProviders();
// 
//     private static EnvironmentVariablesProvider[] getEnvVariablesProviders() {
//         return getExtensions("ru.adelf.idea.dotenv.environmentVariablesProvider");
//     }
// 
//     private static EnvironmentVariablesUsagesProvider[] getEnvVariablesUsagesProviders() {
//         return getExtensions("ru.adelf.idea.dotenv.environmentVariablesUsagesProvider");
//     }
// 
//     private static <T> T[] getExtensions(@NotNull String name) {
//         ExtensionPointName<T> pointName = new ExtensionPointName<>(name);
// 
//         return pointName.getExtensions();
//     }
// }


import com.intellij.util.indexing.*;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.DotEnvSettings;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesProvider;
import ru.adelf.idea.dotenv.models.KeyValuePsiElement;
import ru.adelf.idea.dotenv.util.EnvironmentVariablesProviderUtil;
import java.util.HashMap;
import java.util.Map;

            for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
                for (KeyValuePsiElement keyValueElement : provider.getElements(fileContent.getPsiFile())) {
                    if (storeValues) {
                        map.put(keyValueElement.getKey(), keyValueElement.getShortValue());
                    } else {
                        map.put(keyValueElement.getKey(), "");
                    }
                }
            }

            return map;
        };
    }

    @NotNull
    @Override
    public KeyDescriptor<String> getKeyDescriptor() {
        return EnumeratorStringDescriptor.INSTANCE;
    }

    @NotNull
    @Override
    public DataExternalizer<String> getValueExternalizer() {
        return EnumeratorStringDescriptor.INSTANCE;
    }

    @NotNull
    @Override
    public FileBasedIndex.InputFilter getInputFilter() {
// Path: src/main/java/ru/adelf/idea/dotenv/DotEnvSettings.java
// @State(name = "DotEnvSettings", storages = {@Storage("dot-env.xml")})
// public class DotEnvSettings implements PersistentStateComponent<DotEnvSettings> {
//     public boolean completionEnabled = true;
//     public boolean storeValues = true;
// 
//     @Nullable
//     @Override
//     public DotEnvSettings getState() {
//         return this;
//     }
// 
//     @Override
//     public void loadState(@NotNull DotEnvSettings state) {
//         XmlSerializerUtil.copyBean(state, this);
//     }
// 
//     public static DotEnvSettings getInstance(Project project) {
//         return project.getService(DotEnvSettings.class);
//     }
// }
// 
// Path: src/main/java/ru/adelf/idea/dotenv/api/EnvironmentVariablesProvider.java
// public interface EnvironmentVariablesProvider {
//     @NotNull
//     FileAcceptResult acceptFile(VirtualFile file);
// 
//     @NotNull
//     Collection<KeyValuePsiElement> getElements(PsiFile psiFile);
// }
// 
// Path: src/main/java/ru/adelf/idea/dotenv/models/KeyValuePsiElement.java
// public class KeyValuePsiElement {
// 
//     private final String key;
//     private final String value;
//     private final PsiElement element;
// 
//     public KeyValuePsiElement(String key, String value, PsiElement element) {
//         this.key = key;
//         this.value = value;
//         this.element = element;
//     }
// 
//     public String getKey() {
//         return key.trim();
//     }
// 
//     public String getShortValue() {
//         if (value.indexOf('\n') != -1) {
//             return clearString(value.substring(0, value.indexOf('\n'))) + "...";
//         }
// 
//         return value.trim();
//     }
// 
//     private String clearString(String s) {
//         return StringUtil.trim(s.trim(), ch -> ch != '\\').trim();
//     }
// 
//     public PsiElement getElement() {
//         return element;
//     }
// }
// 
// Path: src/main/java/ru/adelf/idea/dotenv/util/EnvironmentVariablesProviderUtil.java
// public class EnvironmentVariablesProviderUtil {
//     public static final EnvironmentVariablesProvider[] PROVIDERS = getEnvVariablesProviders();
// 
//     public static final EnvironmentVariablesUsagesProvider[] USAGES_PROVIDERS = getEnvVariablesUsagesProviders();
// 
//     private static EnvironmentVariablesProvider[] getEnvVariablesProviders() {
//         return getExtensions("ru.adelf.idea.dotenv.environmentVariablesProvider");
//     }
// 
//     private static EnvironmentVariablesUsagesProvider[] getEnvVariablesUsagesProviders() {
//         return getExtensions("ru.adelf.idea.dotenv.environmentVariablesUsagesProvider");
//     }
// 
//     private static <T> T[] getExtensions(@NotNull String name) {
//         ExtensionPointName<T> pointName = new ExtensionPointName<>(name);
// 
//         return pointName.getExtensions();
//     }
// }


// Path: src/main/java/ru/adelf/idea/dotenv/indexing/DotEnvKeyValuesIndex.java
import com.intellij.util.indexing.*;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import org.jetbrains.annotations.NotNull;
import ru.adelf.idea.dotenv.DotEnvSettings;
import ru.adelf.idea.dotenv.api.EnvironmentVariablesProvider;
import ru.adelf.idea.dotenv.models.KeyValuePsiElement;
import ru.adelf.idea.dotenv.util.EnvironmentVariablesProviderUtil;
import java.util.HashMap;
import java.util.Map;


            for (EnvironmentVariablesProvider provider : EnvironmentVariablesProviderUtil.PROVIDERS) {
                for (KeyValuePsiElement keyValueElement : provider.getElements(fileContent.getPsiFile())) {
                    if (storeValues) {
                        map.put(keyValueElement.getKey(), keyValueElement.getShortValue());
                    } else {
                        map.put(keyValueElement.getKey(), "");
                    }
                }
            }

            return map;
        };
    }

    @NotNull
    @Override
    public KeyDescriptor<String> getKeyDescriptor() {
        return EnumeratorStringDescriptor.INSTANCE;
    }

    @NotNull
    @Override
    public DataExternalizer<String> getValueExternalizer() {
        return EnumeratorStringDescriptor.INSTANCE;
    }

    @NotNull
    @Override
    public FileBasedIndex.InputFilter getInputFilter() {
        return file -> {