package com.jetbrains.lang.dart.psi.impl;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPolyVariantReference;
import com.intellij.psi.PsiReference;
import com.intellij.psi.ResolveResult;
import com.intellij.psi.impl.source.resolve.ResolveCache;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.lang.dart.psi.DartLibraryNameElement;
import com.jetbrains.lang.dart.psi.DartReference;
import com.jetbrains.lang.dart.resolve.DartResolver;
import com.jetbrains.lang.dart.util.DartClassResolveResult;
import com.jetbrains.lang.dart.util.DartElementGenerator;
import com.jetbrains.lang.dart.util.DartResolveUtil;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class DartLibraryIdBase extends DartExpressionImpl implements DartReference, PsiPolyVariantReference {
public DartLibraryIdBase(ASTNode node) {
super(node);
}
@Override
public PsiElement getElement() {
return this;
}
@Override
public PsiReference getReference() {
return this;
}
@Override
public TextRange getRangeInElement() {
final TextRange textRange = getTextRange();
return new TextRange(0, textRange.getEndOffset() - textRange.getStartOffset());
}
@NotNull
@Override
public String getCanonicalText() {
return getText();
}
@Override
public PsiElement handleElementRename(String newLibraryName) throws IncorrectOperationException {
final DartLibraryNameElement libraryNameElement = DartElementGenerator.createLibraryNameElementFromText(getProject(), newLibraryName);
if (libraryNameElement != null) {
getNode().replaceAllChildrenToChildrenOf(libraryNameElement.getNode());
}
return this;
}
@Override
public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
return this;
}
@Override
public boolean isReferenceTo(PsiElement element) {
return resolve() == element;
}
@Override
public boolean isSoft() {
return false;
}
@Override
public PsiElement resolve() {
final ResolveResult[] resolveResults = multiResolve(true);
return resolveResults.length == 0 ||
resolveResults.length > 1 ||
!resolveResults[0].isValidResult() ? null : resolveResults[0].getElement();
}
@NotNull
@Override
public ResolveResult[] multiResolve(boolean incompleteCode) {
final List<? extends PsiElement> elements =
ResolveCache.getInstance(getProject()).resolveWithCaching(this, DartResolver.INSTANCE, true, incompleteCode);
return DartResolveUtil.toCandidateInfoArray(elements);
}
@NotNull
@Override
public DartClassResolveResult resolveDartClass() {
return DartClassResolveResult.EMPTY;
}
@NotNull
@Override
public Object[] getVariants() {
return PsiReference.EMPTY_ARRAY; // completion comes from DAS
/*
final VirtualFile vFile = DartResolveUtil.getRealVirtualFile(getContainingFile());
if (vFile == null) return PsiElement.EMPTY_ARRAY;
final ProjectFileIndex index = ProjectRootManager.getInstance(getProject()).getFileIndex();
VirtualFile scopeFolder = vFile.getParent();
if (scopeFolder != null && scopeFolder.findChild(PubspecYamlUtil.PUBSPEC_YAML) == null) {
VirtualFile parentFolder = scopeFolder.getParent();
while (parentFolder != null && index.isInContent(parentFolder) && parentFolder.findChild(PubspecYamlUtil.PUBSPEC_YAML) == null) {
scopeFolder = parentFolder;
parentFolder = scopeFolder.getParent();
}
}
if (scopeFolder == null) return PsiElement.EMPTY_ARRAY;
// scopeFolder is either:
// - pubspec.yaml file parent if current dart file is at the same level as pubspec.yaml
// - direct subfolder of dart project root like 'bin' or 'web' if curennt dart file is inside at any level
// - module content root if there's no pubspec.yaml file
final GlobalSearchScope scope = GlobalSearchScopesCore.directoryScope(getProject(), scopeFolder, true);
final CommonProcessors.CollectProcessor<String> processor = new CommonProcessors.CollectProcessor<String>();
FileBasedIndex.getInstance().processAllKeys(DartLibraryIndex.DART_LIBRARY_INDEX, processor, scope, null);
return processor.toArray(new String[processor.getResults().size()]);
*/
}
}