docs: public static List<UIComponent> resolveComponents(FacesContext context, UIComponent source, String expressions, int hints) {
  
          ArrayList<UIComponent> components = new ArrayList<>();
  
          if (!LangUtils.isValueBlank(expressions)) {
              String[] splittedExpressions = splitExpressions(context, source, expressions);
  
              if (splittedExpressions != null && splittedExpressions.length > 0) {
  
                  final char separatorChar = UINamingContainer.getSeparatorChar(context);
  
                  for (String splittedExpression : splittedExpressions) {
                      String expression = splittedExpression.trim();
  
                      if (LangUtils.isValueBlank(expression)) {
                          continue;
                      }
  
                      // if it contains a keyword and it's not a nested expression (e.g. @parent:@parent), we don't need to loop
                      if (expression.contains(SearchExpressionConstants.KEYWORD_PREFIX) && expression.indexOf(separatorChar) != -1) {
                          components.addAll(resolveComponentsByExpressionChain(context, source, expression, separatorChar, hints));
                      }
                      else {
                          // it's a keyword and not nested, just ask our resolvers
                          if (expression.contains(SearchExpressionConstants.KEYWORD_PREFIX)) {
                              SearchExpressionResolver resolver = SearchExpressionResolverFactory.findResolver(expression);
  
                              if (resolver instanceof MultiSearchExpressionResolver) {
                                  ((MultiSearchExpressionResolver) resolver).resolveComponents(context, source, source, expression, components, hints);
                              }
                              else {
                                  UIComponent component = resolver.resolveComponent(context, source, source, expression, hints);
  
                                  if (component == null) {
                                      if (!SearchExpressionUtils.isHintSet(hints, SearchExpressionHint.IGNORE_NO_RESULT)) {
                                          cannotFindComponent(context, source, expression);
                                      }
                                  }
                                  else {
                                      components.add(component);
                                  }
                              }
                          }
                          // default ID case
                          else {
                              ResolveComponentCallback callback = new ResolveComponentCallback();
                              resolveComponentById(source, expression, separatorChar, context, callback);
                              UIComponent component = callback.getComponent();
  
                              if (component == null) {
                                  if (!SearchExpressionUtils.isHintSet(hints, SearchExpressionHint.IGNORE_NO_RESULT)) {
                                      cannotFindComponent(context, source, expression);
                                  }
                              }
                              else {
                                  components.add(component);
                              }
                          }
                      }
                  }
              }
          }
  
          return components;
      }