/*******************************************************************************
* Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
******************************************************************************/
package org.axdt.avm.ui.proposal;
import org.axdt.avm.model.AvmDeclaredType;
import org.axdt.avm.model.AvmDefinition;
import org.axdt.avm.model.AvmMember;
import org.axdt.avm.model.AvmVisibility;
import org.axdt.avm.ui.proposal.IAvmProposalProvider.Filter;
public final class DefinitionMatchFilters {
private DefinitionMatchFilters() {
}
public static IAvmProposalProvider.Filter all() {
return new All();
}
public static IAvmProposalProvider.Filter none() {
return new None();
}
public static IAvmProposalProvider.Filter not(IAvmProposalProvider.Filter filter) {
return new Not(filter);
}
public static IAvmProposalProvider.Filter and(IAvmProposalProvider.Filter... filter) {
return new And(filter);
}
public static IAvmProposalProvider.Filter or(IAvmProposalProvider.Filter... filter) {
return new Or(filter);
}
public static IAvmProposalProvider.Filter canInstantiate() {
return new CanInstantiate();
}
public static IAvmProposalProvider.Filter isPublic() {
return new IsPublic();
}
public static class All implements IAvmProposalProvider.Filter {
public boolean accept(AvmDefinition definition) {
return true;
}
}
public static class None implements IAvmProposalProvider.Filter {
public boolean accept(AvmDefinition definition) {
return false;
}
}
public static class Not implements IAvmProposalProvider.Filter {
private final Filter delegate;
public Not(IAvmProposalProvider.Filter delegate) {
this.delegate = delegate;
}
public boolean accept(AvmDefinition definition) {
return !delegate.accept(null);
}
}
public static class And implements IAvmProposalProvider.Filter {
private final Filter[] delegates;
public And(IAvmProposalProvider.Filter[] delegates) {
this.delegates = delegates;
if (delegates.length < 1)
throw new IllegalArgumentException("Cannot 'and' empty delegates");
}
public boolean accept(AvmDefinition definition) {
boolean result = true;
int i = 0;
while(result && i < delegates.length) {
result = delegates[i].accept(null);
i++;
}
return result;
}
}
public static class Or implements IAvmProposalProvider.Filter {
private final Filter[] delegates;
public Or(IAvmProposalProvider.Filter[] delegates) {
this.delegates = delegates;
if (delegates.length < 1)
throw new IllegalArgumentException("Cannot 'or' empty delegates");
}
public boolean accept(AvmDefinition definition) {
boolean result = false;
int i = 0;
while(!result && i < delegates.length) {
result = delegates[i].accept(null);
i++;
}
return result;
}
}
public static class CanInstantiate implements IAvmProposalProvider.Filter {
public boolean accept(AvmDefinition definition) {
if (definition instanceof AvmDeclaredType) {
AvmDeclaredType type = (AvmDeclaredType) definition;
return type.isClass() && !type.isFinal();
}
// TODO check for members with type class
// we can instantiate with any variable:Class and function():Class
// thus with any untyped member
return false;
}
}
public static class IsPublic implements IAvmProposalProvider.Filter {
public boolean accept(AvmDefinition definition) {
if (definition instanceof AvmDeclaredType) {
AvmDeclaredType type = (AvmDeclaredType) definition;
return AvmVisibility.PUBLIC.equals(type.getVisibility());
}
if (definition instanceof AvmMember) {
AvmMember member = (AvmMember) definition;
return AvmVisibility.PUBLIC.equals(member.getVisibility());
}
return false;
}
}
}