blob: 0e2e4688219dc6769f3481edfb2bc50b77a39a82 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.impl.source.resolve.reference.impl.providers;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NotNullLazyValue;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.templateLanguages.OuterLanguageElement;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created by IntelliJ IDEA.
* User: ik
* Date: 05.06.2003
* Time: 20:27:59
* To change this template use Options | File Templates.
*/
public class JavaClassListReferenceProvider extends JavaClassReferenceProvider {
public JavaClassListReferenceProvider() {
setOption(ADVANCED_RESOLVE, Boolean.TRUE);
}
@Override
@NotNull
public PsiReference[] getReferencesByString(String str, @NotNull final PsiElement position, int offsetInPosition){
if (position instanceof XmlTag && ((XmlTag)position).getValue().getTextElements().length == 0) {
return PsiReference.EMPTY_ARRAY;
}
if (str.length() < 2) {
return PsiReference.EMPTY_ARRAY;
}
int offset = position.getTextRange().getStartOffset() + offsetInPosition;
for(PsiElement child = position.getFirstChild(); child != null; child = child.getNextSibling()){
if (child instanceof OuterLanguageElement && child.getTextRange().contains(offset)) {
return PsiReference.EMPTY_ARRAY;
}
}
NotNullLazyValue<Set<String>> topLevelPackages = new NotNullLazyValue<Set<String>>() {
@NotNull
@Override
protected Set<String> compute() {
final Set<String> knownTopLevelPackages = new HashSet<String>();
final List<PsiElement> defaultPackages = getDefaultPackages(position.getProject());
for (final PsiElement pack : defaultPackages) {
if (pack instanceof PsiPackage) {
knownTopLevelPackages.add(((PsiPackage)pack).getName());
}
}
return knownTopLevelPackages;
}
};
final List<PsiReference> results = new ArrayList<PsiReference>();
for(int dot = str.indexOf('.'); dot > 0; dot = str.indexOf('.', dot + 1)) {
int start = dot;
while (start > 0 && Character.isLetterOrDigit(str.charAt(start - 1))) start--;
if (dot == start) {
continue;
}
String candidate = str.substring(start, dot);
if (topLevelPackages.getValue().contains(candidate)) {
int end = dot;
while (end < str.length() - 1) {
end++;
char ch = str.charAt(end);
if (ch != '.' && !Character.isJavaIdentifierPart(ch)) {
break;
}
}
String s = str.substring(start, end + 1);
ContainerUtil.addAll(results, new JavaClassReferenceSet(s, position, offsetInPosition + start, false, this) {
@Override
public boolean isSoft() {
return true;
}
}.getAllReferences());
ProgressManager.checkCanceled();
}
}
return ContainerUtil.toArray(results, new PsiReference[results.size()]);
}
@Override
public GlobalSearchScope getScope(Project project) {
return GlobalSearchScope.allScope(project);
}
}