package org.intellij.plugins.markdown.lang.psi.impl;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.AbstractElementManipulator;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry;
import com.intellij.psi.impl.source.tree.LeafPsiElement;
import com.intellij.util.IncorrectOperationException;
import org.intellij.plugins.markdown.lang.psi.MarkdownPsiElement;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class MarkdownLinkDestinationImpl extends ASTWrapperPsiElement implements MarkdownPsiElement {
public MarkdownLinkDestinationImpl(@NotNull ASTNode node) {
super(node);
}
@NotNull
@Override
public PsiReference[] getReferences() {
return ReferenceProvidersRegistry.getReferencesFromProviders(this);
}
@NotNull
@Override
public List<MarkdownPsiElement> getCompositeChildren() {
return Collections.emptyList();
}
public static class Manipulator extends AbstractElementManipulator<MarkdownLinkDestinationImpl> {
@Override
public MarkdownLinkDestinationImpl handleContentChange(@NotNull MarkdownLinkDestinationImpl element,
@NotNull TextRange range,
String newContent) throws IncorrectOperationException {
final PsiElement child = element.getFirstChild();
if (child instanceof LeafPsiElement) {
((LeafPsiElement)child).replaceWithText(range.replace(child.getText(), newContent));
}
else {
throw new IncorrectOperationException("Bad child");
}
return element;
}
@NotNull
@Override
public TextRange getRangeInElement(@NotNull MarkdownLinkDestinationImpl element) {
final String text = element.getText();
if (text.startsWith("<") && text.endsWith(">")) {
return TextRange.create(1, text.length() - 1);
}
else {
return TextRange.allOf(text);
}
}
}
}