private void addAllAppropriateParameterNodesFrom(Set<SDGNode> start, AnnotationType type, Set<SDGNode> base) {
LinkedList<SDGNode> toDo = new LinkedList<SDGNode>();
toDo.addAll(start);
Set<SDGNode> visited = new HashSet<SDGNode>();
// add all parameter nodes of right type and reachable by PS edges
while (!toDo.isEmpty()) {
SDGNode next = toDo.poll();
visited.add(next);
TypeName paramName = TypeName.findOrCreate(next.getType());
/** annotate root parameters if their type is either primitive (non-void!) or they have no fields (like e.g. types assumed to be immutable) */
if (paramName.isPrimitiveType() && !TypeReference.VoidName.equals(paramName) || !hasFields(next)) {
base.add(next);
} else if (isParameterNodeOfKind(next, type)) {
base.add(next);
}
for (SDGEdge e : sdg.getOutgoingEdgesOfKind(next, SDGEdge.Kind.PARAMETER_STRUCTURE)) {
SDGNode succNode = e.getTarget();
if (!visited.contains(succNode)) {
toDo.add(succNode);
}
}
}
}