antlr / antlr/stringtemplate4

correct StackOverflowEerror from rendering `java.nio.Path`

Open
#319 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
1k
Forks
234
PR merge metrics
No merged PRs in 30d

Description

the `java.nio.Path` interface is recursively iterable on Path. This causes a stack-overflow in ST4's representation as it is never able to find an element that isnt iterable, so it calls `convertAnythingIteratableToIterator` all-the-way-down.

`java.nio.Path implements Iterable`,

eg:

```
var path = Paths.get("some/path");
Path first = path.iterator().next(); //== "some"
Path firstFirst = first.iterator().next(); //== "some"
Path firstFirstFirst = firstFirst.iterator().next(); //== "some"
```

and so on.

This _really_ does not play nicely with `convertAnythingIteratableToIterator`: This behavior means, even if you supply a converter for `java.nio.path`, ST4 never identifies it as a POJO and so never asks for a renderer.

---

suggestions:
- could rewrite the convertAnything to keep a stack of elements that it checks against, if it finds that asking for iterable conversions ever produces the same value => we're _probably_ in an infinite loop => take some action
- could try to restructure to ask if a representation exists for the object before trying to iterate over it.
- a simple-ish fix would be to look for instances of `Collection` rather than `Iterable`; given that `Iterable` is used in some infinite sequences, this would likely help there too.

I'm swamped, but I need this so I could create a PR if needed. In the mean time I'm going to twiddle my thumbs for a while.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.