diff --git a/src/main/java/org/noear/solon/idea/plugin/suggestion/completion/YamlCompletionProvider.java b/src/main/java/org/noear/solon/idea/plugin/suggestion/completion/YamlCompletionProvider.java index 5df4fde2e5411f8c7d8c603e46ee534e0dd18850..95ac2e848a1a88f2d21e02c99fab77ab6ff84125 100644 --- a/src/main/java/org/noear/solon/idea/plugin/suggestion/completion/YamlCompletionProvider.java +++ b/src/main/java/org/noear/solon/idea/plugin/suggestion/completion/YamlCompletionProvider.java @@ -8,7 +8,10 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.util.ProcessingContext; +import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.yaml.psi.YAMLKeyValue; +import org.jetbrains.yaml.psi.impl.YAMLKeyValueImpl; import org.jetbrains.yaml.psi.impl.YAMLPlainTextImpl; import org.noear.solon.idea.plugin.common.util.GenericUtil; import org.noear.solon.idea.plugin.suggestion.service.SuggestionService; @@ -18,6 +21,8 @@ import java.util.List; public class YamlCompletionProvider extends CompletionProvider { + private int hint_offset=0; + @Override protected void addCompletions(@NotNull CompletionParameters parameters, @NotNull ProcessingContext context, @NotNull CompletionResultSet resultSet) { PsiElement element = parameters.getPosition(); @@ -36,16 +41,43 @@ public class YamlCompletionProvider extends CompletionProvider elementBuilders = new ArrayList<>(); - if (yaml != null && queryWithDotDelimitedPrefixes.contains(": ")) { - elementBuilders = suggestionService.findHintSuggestionsForQueryPrefix(queryWithDotDelimitedPrefixes, queryWithDotDelimitedPrefixes); + String yamlKey = getYamlKey(yaml); + if (yaml != null && yaml.getParent().getClass() == YAMLKeyValueImpl.class) { + elementBuilders = suggestionService.findHintSuggestionsForQueryPrefix(yamlKey, queryWithDotDelimitedPrefixes); } else if (yaml != null) { - elementBuilders = suggestionService.findYamlSuggestionsForQueryPrefix(queryWithDotDelimitedPrefixes); + + elementBuilders = suggestionService.findYamlSuggestionsForQueryPrefix((StringUtils.isEmpty(yamlKey)?yamlKey:yamlKey+".")+queryWithDotDelimitedPrefixes); } assert elementBuilders != null; elementBuilders.forEach(resultSet::addElement); } + private String getYamlKey(YAMLPlainTextImpl yamlPlainText){ + List keys = new ArrayList<>(); + PsiElement parent = yamlPlainText.getParent(); + StringBuffer yamlKey=new StringBuffer(); + while (parent != null) { + if (parent instanceof YAMLKeyValue) { + YAMLKeyValue keyValue = (YAMLKeyValue) parent; + String key = keyValue.getKeyText(); + keys.add(key); + } + try { + parent = parent.getParent(); + }catch (Exception ex){ + parent=null; + } + } + for (int i = keys.size()-1 ; i >= 0; i--) { + yamlKey.append(keys.get(i)); + if(i!=0){ + yamlKey.append(":"); + } + } + return yamlKey.toString().replace(":","."); + } + private T getParentOfType(PsiElement element, Class clazz) { PsiElement parent = element.getParent(); if (parent.getClass() == clazz) { diff --git a/src/main/java/org/noear/solon/idea/plugin/suggestion/service/SuggestionServiceImpl.java b/src/main/java/org/noear/solon/idea/plugin/suggestion/service/SuggestionServiceImpl.java index 2f7fbd82d9cf360c5cecd58ca71c6b3ab2349d7b..e4d648f994478c9620576de367f869e3df13d446 100644 --- a/src/main/java/org/noear/solon/idea/plugin/suggestion/service/SuggestionServiceImpl.java +++ b/src/main/java/org/noear/solon/idea/plugin/suggestion/service/SuggestionServiceImpl.java @@ -37,6 +37,9 @@ public class SuggestionServiceImpl implements SuggestionService { private volatile boolean indexingInProgress; private final String DELIMITER = "\\."; + private final String LINE = "\n"; + private final String YML_FORMAT = " "; + private final String YML_DELIMITER = ":"; public SuggestionServiceImpl() { this.propertiesSearchIndex = new PatriciaTrie<>(); @@ -201,26 +204,28 @@ public class SuggestionServiceImpl implements SuggestionService { List builders = new ArrayList<>(); for (Map.Entry entry : sortedMap.entrySet()) { builders.add(toLookupElementBuilder(entry.getValue()).withInsertHandler((context, item) -> { - int index = queryWithDotDelimitedPrefixes.lastIndexOf(DELIMITER); + //选定提示事件 Editor editor = context.getEditor(); int startOffset = context.getStartOffset(); int endOffset = context.getTailOffset(); Document document = editor.getDocument(); String text = item.getLookupString(); - String[] count = text.split(DELIMITER); + String supplementText = text.substring(queryWithDotDelimitedPrefixes.length()-1); + String[] count = supplementText.split(DELIMITER); StringBuffer resultText = new StringBuffer(); for (int i = 0; i < count.length; i++) { resultText.append(count[i]); - resultText.append(":\n"); + resultText.append(YML_DELIMITER); if(i == count.length-1){ break; } - resultText.append(" ".repeat(i + 1)); + resultText.append(LINE); + resultText.append(YML_FORMAT.repeat(i + 1)); } - text = resultText.toString(); + System.out.println(editor.getCaretModel().getOffset()); document.replaceString(startOffset, endOffset, text); - editor.getCaretModel().moveToOffset(text.length()-1); + editor.getCaretModel().moveToOffset(startOffset+text.length()); })); } return builders;