Hi all, Safe indexing has been introduced since Groovy 3.0.0, it is useful but confuses both parser and users sometimes because it is not a real operator in order to not breaking existing code as possible as we could. For example,
``` // https://issues.apache.org/jira/browse/GROOVY-9522 def a() { null } def b() { '' } a()?[b(), a()].join(','):b() // statement with ambiguities ``` The above statement with ambiguities can be parsed into: 1) safe indexing expression, `a()?[[b(), a()]].join([',': b()])` 2) ternary expression, `a() ? ([b(), a()].join(',')) : b()` As safe indexing(i.e. `?[`) has same precedence with safe reference(i.e. `?.`), safe indexing has higher precedence than ternary expression. When ambiguities appear, the expression with ambiguities will be parsed into safe indexing. As a result, the potential issue is hard for user to find early and is ususally found when code has been executed... So I propose to make safe indexing operator `?[` become a real operator, i.e. it will be defined in the groovy lexer. * pros: 1) No ambiguities 2) Better parsing performance * cons: 1) Breaking some existing ternary expressions without spaces between`?` and `[`, e.g. `true?[0] : [1]` will be broken, so it has to be rewritten to `true? [0] : [1]` As Groovy 3 has been released, I proposed to apply the change to Groovy 4. Any thoughts? Cheers, Daniel Sun ----- Apache Groovy committer & PMC member Blog: http://blog.sunlan.me Twitter: @daniel_sun -- Sent from: http://groovy.329449.n5.nabble.com/Groovy-Dev-f372993.html