blob: 79ccb849946f8abe9682d8881c8ccf11e559c648 [file]
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.gradle.findUsages;
import com.intellij.lang.properties.psi.Property;
import com.intellij.openapi.application.QueryExecutorBase;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.DelegatingGlobalSearchScope;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.RequestResultProcessor;
import com.intellij.psi.search.UsageSearchContext;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
/**
* @author Kirill Marchuk
*/
public class GradlePropertyReferencesSearcher extends QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters> {
private final static String[] GRADLE_PROPERTY_FILES = {"gradle.properties"};
private final static String GRADLE_DSL_EXTENSION = "gradle";
public GradlePropertyReferencesSearcher() {
super(true);
}
@Override
public void processQuery(@NotNull ReferencesSearch.SearchParameters queryParameters, @NotNull Processor<? super PsiReference> consumer) {
final PsiElement element = queryParameters.getElementToSearch();
if (element instanceof Property
&& isContainingFileGradlePropertyFile(element.getContainingFile())
&& queryParameters.getEffectiveSearchScope() instanceof GlobalSearchScope
) {
final Property property = (Property)element;
if (property.getName() == null) {
return;
}
final GlobalSearchScope gradleSearchScope =
new FileByExtensionSearchScope(((GlobalSearchScope)queryParameters.getEffectiveSearchScope()), GRADLE_DSL_EXTENSION);
final short searchContext = (short)(UsageSearchContext.IN_CODE | UsageSearchContext.IN_STRINGS);
final MyProcessor processor = new MyProcessor(property);
queryParameters.getOptimizer().searchWord(
property.getName(),
gradleSearchScope,
searchContext,
false,
property,
processor);
}
}
private static boolean isContainingFileGradlePropertyFile(PsiFile file) {
for (String filename : GRADLE_PROPERTY_FILES) {
if (file.getName().equalsIgnoreCase(filename)) {
return true;
}
}
return false;
}
private static class MyProcessor extends RequestResultProcessor {
final PsiElement target;
MyProcessor(PsiElement target) {
super(target);
this.target = target;
}
@Override
public boolean processTextOccurrence(@NotNull PsiElement element,
int offsetInElement,
@NotNull Processor<? super PsiReference> consumer) {
if (element instanceof PsiReference) {
if (!consumer.process((PsiReference)element)) {
return false;
}
}
return true;
}
}
private static class FileByExtensionSearchScope extends DelegatingGlobalSearchScope {
@NotNull
private final String extension;
FileByExtensionSearchScope(GlobalSearchScope scope,
@NotNull String extension) {
super(scope);
this.extension = extension;
}
@Override
public boolean contains(@NotNull VirtualFile file) {
return super.contains(file) && extension.equalsIgnoreCase(file.getExtension());
}
}
}