package com.redhat.ceylon.eclipse.util;
import static com.redhat.ceylon.eclipse.code.preferences.CeylonPreferenceInitializer.ENABLE_OPEN_FILTERS;
import static com.redhat.ceylon.eclipse.code.preferences.CeylonPreferenceInitializer.FILTERS;
import static com.redhat.ceylon.eclipse.code.preferences.CeylonPreferenceInitializer.OPEN_FILTERS;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.eclipse.jdt.core.IJavaElement;
import com.redhat.ceylon.eclipse.ui.CeylonPlugin;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.Module;
import com.redhat.ceylon.model.typechecker.model.Package;
public class Filters {
private List<Pattern> filters;
private List<Pattern> packageFilters;
private List<Pattern> moduleFilters;
public Filters() {
initFilters();
}
protected String getFilterListAsString(String preference) {
return CeylonPlugin.getPreferences().getString(preference);
}
public void initFilters() {
filters = new ArrayList<Pattern>();
packageFilters = new ArrayList<Pattern>();
moduleFilters = new ArrayList<Pattern>();
parseFilters(getFilterListAsString(FILTERS));
if (CeylonPlugin.getPreferences().getBoolean(enableExtraFiltersPref())) {
parseFilters(getFilterListAsString(extraFiltersPref()));
}
}
protected String extraFiltersPref() {
return OPEN_FILTERS;
}
protected String enableExtraFiltersPref() {
return ENABLE_OPEN_FILTERS;
}
private void parseFilters(String filtersString) {
if (!filtersString.trim().isEmpty()) {
String[] regexes =
filtersString
.replaceAll("\\(\\w+\\)", "")
.replace(".", "\\.")
.replace("*", ".*")
.split(",");
for (String regex: regexes) {
regex = regex.trim();
if (!regex.isEmpty()) {
filters.add(Pattern.compile(regex));
if (!regex.contains("::") && regex.endsWith(".*")) {
moduleFilters.add(Pattern.compile(regex));
}
if (regex.endsWith("::.*")) {
regex = regex.substring(0, regex.length()-4);
}
if (!regex.contains("::")) {
packageFilters.add(Pattern.compile(regex));
}
}
}
}
}
public boolean isFiltered(Declaration declaration) {
String name = declaration.getName();
if (name==null) {
return false;
}
if (name.contains("__") &&
declaration.isAnnotation()) {
//actually what we should really do is filter
//out all constructors for Java annotations
return true;
}
if (!filters.isEmpty()) {
String qname =
declaration.getQualifiedNameString();
for (Pattern filter: filters) {
if (filter.matcher(qname).matches()) {
return true;
}
}
}
return false;
}
public boolean isFiltered(Module module) {
if (!moduleFilters.isEmpty()) {
String name = module.getNameAsString();
for (Pattern filter: moduleFilters) {
if (filter.matcher(name).matches()) {
return true;
}
}
}
return false;
}
public boolean isFiltered(Package pack) {
if (!packageFilters.isEmpty()) {
String name = pack.getNameAsString();
for (Pattern filter: packageFilters) {
if (filter.matcher(name).matches()) {
return true;
}
}
}
return false;
}
public boolean isFiltered(IJavaElement enclosingElement) {
if (!packageFilters.isEmpty()) {
IJavaElement pf =
enclosingElement.getAncestor(
IJavaElement.PACKAGE_FRAGMENT);
if (pf!=null) {
for (Pattern filter: packageFilters) {
String name = pf.getElementName();
if (filter.matcher(name).matches()) {
return true;
}
}
}
}
return false;
}
}