[ https://issues.apache.org/jira/browse/GROOVY-9612?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17149158#comment-17149158 ]
Paul King edited comment on GROOVY-9612 at 7/1/20, 6:36 AM: ------------------------------------------------------------ I would phrase things differently to what Daniel said. Groovy has never (at least not since 1.0) supported the syntax: {code:java} println ( 100 ) {code} as a single statement. This ties back to semicolon being a statement separator in Groovy (not statement terminator like in Java). The general rule of parsing is that end of line terminates the statement except when it wouldn't validly end a statement. So, this is fine: {code:java} println ( 100 ) {code} But {{println}} on its own could be a property. You can work around this limitation in various ways, e.g. using a trailing backslash: {code:java} println \ ( 100 ) {code} We do make exceptions to the general rule, e.g. we do lookahead in various situations including closures, e.g. the above limitations don't exist and workarounds not needed for: {code:java} def println(Closure c) { println c.call() } println { 100 } {code} When designing Groovy 3, we looked at whether we could also do lookahead for brackets. Adding such support would be a breaking change. This is different to the closure case since lookahead for closures has been around for a long time. As an example, this code: {code:java} binding.variables.println = 42 println ( 100 ) {code} prints nothing and returns 100 in all previous Groovy versions. If we supported the lookahead for brackets, it would print 100 and return null. We haven't been convinced that such a breaking change and added complexity to the parser would be justified for marginal extra Java compatibility. It isn't a goal of Groovy to be 100% Java compatible for all styles, we just try to be very close whenever we can. was (Author: paulk): I would phrase things differently to what Daniel said. Groovy has never (at least not since 1.0) supported the syntax: {code} println ( 100 ) {code} This ties back to semicolon being a statement separator in Groovy (not statement terminator like in Java). The general rule of parsing is that end of line terminates the statement except when it wouldn't validly end a statement. So, this is fine: {code} println ( 100 ) {code} But {{println}} on its own could be a property. You can work around this limitation in various ways, e.g. using a trailing backslash: {code} println \ ( 100 ) {code} We do make exceptions to the general rule, e.g. we do lookahead in various situations including closures, e.g. the above limitations don't exist and workarounds not needed for: {code} def println(Closure c) { println c.call() } println { 100 } {code} When designing Groovy 3, we looked at whether we could also do lookahead for brackets. Adding such support would be a breaking change. This is different to the closure case since lookahead for closures has been around for a long time. As an example, this code: {code} binding.variables.println = 42 println ( 100 ) {code} prints nothing and returns 100 in all previous Groovy versions. If we supported the lookahead for brackets, it would print 100 and return null. We haven't been convinced that such a breaking change and added complexity to the parser would be justified for marginal extra Java compatibility. It isn't a goal of Groovy to be 100% Java compatible for all styles, we just try to be very close whenever we can. > Should parse parenthesis and bracket after newline correctly > ------------------------------------------------------------ > > Key: GROOVY-9612 > URL: https://issues.apache.org/jira/browse/GROOVY-9612 > Project: Groovy > Issue Type: Wish > Components: parser > Affects Versions: 3.0.4 > Reporter: Laurent RICHARD de LAPRADE > Priority: Major > > For example, this should compile correctly. Current groovy parser forces > coding style format which is not the one we choose when we code Java. > {code:java} > import java.io.*; > import groovy.io.*; > def dir = new File("C:\\"); > dir.eachFileRecurse > ( > f > -> > println(f.name) > ); > {code} > groovy.lang.MissingPropertyException: No such property: eachFileRecurse for > class: java.io.File > -- This message was sent by Atlassian Jira (v8.3.4#803005)