package com.jetbrains.lang.dart.psi.impl; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.lang.dart.DartLanguage; import com.jetbrains.lang.dart.psi.DartFile; import com.jetbrains.lang.dart.psi.DartImportStatement; import com.jetbrains.lang.dart.psi.DartUriElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public abstract class DartUriElementBase extends DartPsiCompositeElementImpl implements DartUriElement { private static final Condition<PsiFileSystemItem> DART_FILE_OR_DIR_FILTER = item -> item.isDirectory() || item instanceof DartFile; public DartUriElementBase(@NotNull final ASTNode node) { super(node); } @Nullable @Override public PsiReference getReference() { final PsiReference[] references = getReferences(); return references.length == 0 ? null : references[0]; } @NotNull @Override public PsiReference[] getReferences() { return new PsiReference[]{new DartFileReference(this, getUriStringAndItsRange().first)}; } public static class DartUriElementManipulator extends AbstractElementManipulator<DartUriElement> { @Override public DartUriElement handleContentChange(@NotNull final DartUriElement oldUriElement, @NotNull final TextRange range, @NotNull final String newContent) { final String newUriElementText = StringUtil.replaceSubstring(oldUriElement.getText(), getRangeInElement(oldUriElement), newContent); final PsiFile fileFromText = PsiFileFactory.getInstance(oldUriElement.getProject()) .createFileFromText(DartLanguage.INSTANCE, "import " + newUriElementText + ";"); final DartImportStatement importStatement = PsiTreeUtil.findChildOfType(fileFromText, DartImportStatement.class); assert importStatement != null : fileFromText.getText(); return (DartUriElement)oldUriElement.replace(importStatement.getUriElement()); } @NotNull @Override public TextRange getRangeInElement(@NotNull final DartUriElement element) { return element.getUriStringAndItsRange().second; } } }