in analysis/src/main/java/org/eclipse/jifa/analysis/AbstractApiExecutor.java [123:174]
private void loadApi() {
this.apis = new HashSet<>();
// load predefine apis
fillPredefinedApis("needOptionsForAnalysis", Path.class);
fillPredefinedApis("analyze", Path.class, Map.class);
fillPredefinedApis("progressOfAnalysis", Path.class);
fillPredefinedApis("release", Path.class);
fillPredefinedApis("clean", Path.class);
fillPredefinedApis("errorLog", Path.class);
// load apis from analyzer class
Class<Analyzer> analyzerClass = analyzerClass();
for (Method method : analyzerClass.getMethods()) {
if (Modifier.isStatic(method.getModifiers()) ||
(!analyzerClass.isInterface() && method.getDeclaringClass() != analyzerClass) ||
method.isAnnotationPresent(Exclude.class)) {
continue;
}
String name = method.getName();
if (methodNameConverter() != null) {
name = methodNameConverter().convert(name);
}
String[] aliases = null;
ApiMeta apiMeta = method.getAnnotation(ApiMeta.class);
if (apiMeta != null) {
if (StringUtils.isNotBlank(apiMeta.value())) {
name = apiMeta.value();
}
aliases = apiMeta.aliases();
}
// validate duplication
Validate.isTrue(!apiMethodMap.containsKey(name), "Duplicate api name: " + name);
if (aliases != null) {
for (String alias : aliases) {
Validate.isTrue(!apiMethodMap.containsKey(alias), "Duplicate api name: " + alias);
}
}
ApiParameter[] apiParameters = buildApiParameters(method);
Set<String> aliasesSet = aliases != null ? Set.of(aliases) : Collections.emptySet();
Api api = new Api(name, aliasesSet, apiParameters);
apiMethodMap.put(name, method);
for (String alias : aliasesSet) {
apiMethodMap.put(alias, method);
}
apis.add(api);
}
this.apis = Collections.unmodifiableSet(apis);
}