package net.enilink.komma.edit.assist;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import net.enilink.komma.edit.KommaEditPlugin;
import org.parboiled.support.ParsingResult;
public abstract class ReflectiveSemanticProposals implements
ISemanticProposalProvider {
class Proposal implements ISemanticProposal {
Method m;
public Proposal(Method m) {
this.m = m;
m.setAccessible(true);
}
@Override
public IContentProposal[] compute(ParsingResult<?> result, int index,
String prefix) {
try {
return (IContentProposal[]) m
.invoke(ReflectiveSemanticProposals.this, result,
index, prefix);
} catch (Exception e) {
KommaEditPlugin.INSTANCE.log(e);
}
return null;
}
}
protected Map<String, Proposal> proposals = new HashMap<String, Proposal>();
public ReflectiveSemanticProposals() {
for (Method m : getClass().getMethods()) {
if (IContentProposal[].class.equals(m.getReturnType())) {
Class<?>[] paramTypes = m.getParameterTypes();
if (paramTypes.length == 3
&& ParsingResult.class.equals(paramTypes[0])
&& int.class.equals(paramTypes[1])
&& String.class.equals(paramTypes[2])) {
proposals.put(m.getName(), new Proposal(m));
}
}
}
}
@Override
public ISemanticProposal getProposal(String rule) {
return proposals.get(rule);
}
protected IContentProposal[] compute(Method m, ParsingResult<?> result,
int index, String prefix) {
try {
return (IContentProposal[]) m.invoke(
ReflectiveSemanticProposals.this, result, index, prefix);
} catch (Exception e) {
KommaEditPlugin.INSTANCE.log(e);
}
return null;
}
}