package de.plushnikov.intellij.plugin.language;
import com.intellij.codeInsight.completion.CompletionContributor;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionProvider;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.patterns.PsiJavaPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.util.ProcessingContext;
import de.plushnikov.intellij.plugin.language.psi.LombokConfigProperty;
import de.plushnikov.intellij.plugin.language.psi.LombokConfigPsiUtil;
import de.plushnikov.intellij.plugin.language.psi.LombokConfigTypes;
import de.plushnikov.intellij.plugin.lombokconfig.ConfigKey;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
public class LombokConfigCompletionContributor extends CompletionContributor {
private static final String LOMBOK_EQUALS_AND_HASH_CODE_CALL_SUPER = ConfigKey.EQUALSANDHASHCODE_CALL_SUPER.getConfigKey();
public LombokConfigCompletionContributor() {
final Collection<String> booleanOptions = new HashSet<String>(Arrays.asList(
"config.stopBubbling", "lombok.accessors.chain", "lombok.accessors.fluent",
"lombok.anyConstructor.suppressConstructorProperties", "lombok.equalsAndHashCode.doNotUseGetters", "lombok.getter.noIsPrefix",
"lombok.log.fieldIsStatic", "lombok.toString.doNotUseGetters", "lombok.toString.includeFieldNames"));
final Collection<String> flagUsageOptions = new HashSet<String>(Arrays.asList(
"lombok.accessors.flagUsage", "lombok.allArgsConstructor.flagUsage", "lombok.anyConstructor.flagUsage",
"lombok.builder.flagUsage", "lombok.cleanup.flagUsage", "lombok.data.flagUsage", "lombok.delegate.flagUsage",
"lombok.equalsAndHashCode.flagUsage", "lombok.experimental.flagUsage", "lombok.extensionMethod.flagUsage",
"lombok.fieldDefaults.flagUsage", "lombok.getter.flagUsage", "lombok.getter.lazy.flagUsage",
"lombok.log.apacheCommons.flagUsage", "lombok.log.flagUsage", "lombok.log.javaUtilLogging.flagUsage",
"lombok.log.log4j.flagUsage", "lombok.log.log4j2.flagUsage", "lombok.log.slf4j.flagUsage",
"lombok.log.xslf4j.flagUsage", "lombok.log.jbosslog.flagUsage",
"lombok.noArgsConstructor.flagUsage", "lombok.nonNull.flagUsage",
"lombok.requiredArgsConstructor.flagUsage", "lombok.setter.flagUsage", "lombok.sneakyThrows.flagUsage",
"lombok.synchronized.flagUsage", "lombok.toString.flagUsage", "lombok.val.flagUsage", "lombok.value.flagUsage",
"lombok.wither.flagUsage"));
final Collection<String> flagUsageAllowable = new HashSet<String>(Arrays.asList(
"lombok.var.flagUsage"
));
final Collection<String> otherOptions = new HashSet<String>(Arrays.asList(
ConfigKey.ACCESSORS_PREFIX.getConfigKey(), ConfigKey.LOG_FIELDNAME.getConfigKey(),
ConfigKey.NONNULL_EXCEPTIONTYPE.getConfigKey(), ConfigKey.EQUALSANDHASHCODE_CALL_SUPER.getConfigKey()));
final Collection<String> allOptions = new HashSet<String>(booleanOptions);
allOptions.addAll(flagUsageOptions);
allOptions.addAll(flagUsageAllowable);
allOptions.addAll(otherOptions);
extend(CompletionType.BASIC,
PsiJavaPatterns.psiElement(LombokConfigTypes.VALUE).withLanguage(LombokConfigLanguage.INSTANCE),
new CompletionProvider<CompletionParameters>() {
public void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet resultSet) {
PsiElement psiElement = parameters.getPosition().getParent();
if (psiElement instanceof LombokConfigProperty) {
final String configPropertyKey = StringUtil.notNullize(LombokConfigPsiUtil.getKey((LombokConfigProperty) psiElement));
if (booleanOptions.contains(configPropertyKey)) {
resultSet.addElement(LookupElementBuilder.create("true"));
resultSet.addElement(LookupElementBuilder.create("false"));
} else if (flagUsageOptions.contains(configPropertyKey)) {
resultSet.addElement(LookupElementBuilder.create("WARNING"));
resultSet.addElement(LookupElementBuilder.create("ERROR"));
} else if (flagUsageAllowable.contains(configPropertyKey)) {
resultSet.addElement(LookupElementBuilder.create("ALLOW"));
resultSet.addElement(LookupElementBuilder.create("WARNING"));
} else if (LOMBOK_EQUALS_AND_HASH_CODE_CALL_SUPER.equals(configPropertyKey)) {
resultSet.addElement(LookupElementBuilder.create("CALL"));
resultSet.addElement(LookupElementBuilder.create("SKIP"));
resultSet.addElement(LookupElementBuilder.create("WARN"));
}
}
}
}
);
extend(CompletionType.BASIC,
PsiJavaPatterns.psiElement(LombokConfigTypes.KEY).withLanguage(LombokConfigLanguage.INSTANCE),
new CompletionProvider<CompletionParameters>() {
public void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet resultSet) {
for (String contribution : allOptions) {
resultSet.addElement(LookupElementBuilder.create(contribution));
}
}
}
);
}
}