JsonPointerPosition (@NotNull PsiElement element, boolean forceLastTransition) { JsonPointerPosition pos = new JsonPointerPosition(); PsiElement current = element; while (!breakCondition(current)) { final PsiElement position = current; current = current.getParent(); if (current instanceof YAMLSequence array) { final List<YAMLSequenceItem> expressions = array.getItems(); int idx = -1; for (int i = 0; i < expressions.size(); i++) { final YAMLSequenceItem value = expressions.get(i); if (position.equals(value)) { idx = i; break; } } if (idx != -1) { pos.addPrecedingStep(idx); } } else if (current instanceof YAMLSequenceItem) { // do nothing - handled by the upper condition } else if (current instanceof YAMLKeyValue) { final String propertyName = StringUtil.notNullize(((YAMLKeyValue)current).getName()); current = current.getParent(); if (!(current instanceof YAMLMapping)) return null;//incorrect syntax? pos.addPrecedingStep(propertyName); } else if (current instanceof YAMLMapping && position instanceof YAMLKeyValue) { // if either value or not first in the chain - needed for completion variant final String propertyName = StringUtil.notNullize(((YAMLKeyValue)position).getName()); if (propertyName.contains(CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED)) continue; if (position != element || forceLastTransition) { pos.addPrecedingStep(propertyName); } } else if (breakCondition(current)) { break; } else { if (current instanceof YAMLMapping) { List<YAMLPsiElement> elements = ((YAMLMapping)current).getYAMLElements(); if (elements.size() == 0) return null; if (position instanceof YAMLPsiElement && elements.contains(position)) { continue; } } return null;//something went wrong } } return pos; }