@ApiStatus.Internal
  public @NotNull String getAttributeValue(@NotNull Attribute attribute, @Nullable PathMacroFilter filter, boolean caseSensitive, boolean recursively) {
    String oldValue = attribute.getValue();
    if (recursively || (filter != null && filter.recursePathMacros(attribute))) {
      return substituteRecursively(oldValue, caseSensitive).toString();
    }
    else {
      return substitute(oldValue, caseSensitive);
    }
  }
@ApiStatus.Internal
  public @NotNull String getAttributeValue(@NotNull Attribute attribute, @Nullable PathMacroFilter filter, boolean caseSensitive, boolean recursively)