blob: 77aa52a7e3ec801d9609f1d42d90239451e560a4 [file] [log] [blame]
/*
* Copyright 2000-2014 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 org.jetbrains.plugins.groovy.findUsages;
import com.intellij.openapi.application.QueryExecutorBase;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.search.*;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod;
import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils;
/**
* @author Maxim.Medvedev
*/
public class GrAliasedImportedElementSearcher extends QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters> {
public GrAliasedImportedElementSearcher() {
super(true);
}
@Override
public void processQuery(@NotNull ReferencesSearch.SearchParameters parameters, @NotNull Processor<PsiReference> consumer) {
final PsiElement target = parameters.getElementToSearch();
if (!(target instanceof PsiMember) || !(target instanceof PsiNamedElement)) return;
final String name = ((PsiNamedElement)target).getName();
if (name == null || StringUtil.isEmptyOrSpaces(name)) return;
final SearchScope onlyGroovy = GroovyScopeUtil.restrictScopeToGroovyFiles(parameters.getEffectiveSearchScope());
final SearchRequestCollector collector = parameters.getOptimizer();
final SearchSession session = collector.getSearchSession();
if (target instanceof PsiMethod) {
final PsiMethod method = (PsiMethod)target;
if (GroovyPropertyUtils.isSimplePropertyAccessor(method)) {
final PsiField field = GroovyPropertyUtils.findFieldForAccessor(method, true);
if (field != null) {
final String propertyName = field.getName();
if (propertyName != null) {
final MyProcessor processor = new MyProcessor(method, GroovyPropertyUtils.getAccessorPrefix(method), session);
collector.searchWord(propertyName, onlyGroovy, UsageSearchContext.IN_CODE, true, method, processor);
}
}
}
}
collector.searchWord(name, onlyGroovy, UsageSearchContext.IN_CODE, true, target, new MyProcessor(target, null, session));
}
private static class MyProcessor extends RequestResultProcessor {
private final PsiElement myTarget;
private final String prefix;
private final SearchSession mySession;
MyProcessor(PsiElement target, @Nullable String prefix, SearchSession session) {
super(target, prefix);
myTarget = target;
this.prefix = prefix;
mySession = session;
}
@Override
public boolean processTextOccurrence(@NotNull final PsiElement element, int offsetInElement, @NotNull Processor<PsiReference> consumer) {
String alias = getAlias(element);
if (alias == null) return true;
final PsiReference reference = element.getReference();
if (reference == null) {
return true;
}
if (!reference.isReferenceTo(myTarget instanceof GrAccessorMethod ? ((GrAccessorMethod)myTarget).getProperty() : myTarget)) {
return true;
}
final SearchRequestCollector collector = new SearchRequestCollector(mySession);
final SearchScope fileScope = new LocalSearchScope(element.getContainingFile());
collector.searchWord(alias, fileScope, UsageSearchContext.IN_CODE, true, myTarget);
if (prefix != null) {
collector.searchWord(prefix + GroovyPropertyUtils.capitalize(alias), fileScope, UsageSearchContext.IN_CODE, true, myTarget);
}
return PsiSearchHelper.SERVICE.getInstance(element.getProject()).processRequests(collector, consumer);
}
@Nullable
private static String getAlias(final PsiElement element) {
if (!(element.getParent() instanceof GrImportStatement)) return null;
final GrImportStatement importStatement = (GrImportStatement)element.getParent();
if (!importStatement.isAliasedImport()) return null;
return importStatement.getImportedName();
}
}
}