[
https://issues.apache.org/jira/browse/GROOVY-11628?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles updated GROOVY-11628:
---------------------------------
Description:
Java supports record deconstruction in switch and instanceof, like this:
{code:java}
record BlockPos(int x, int y, int z) {}
record BlockBreakEvent(String username, BlockPos pos) {}
public static void main(String[] args) {
var event = new BlockBreakEvent("Bob", new BlockPos(50, 100, 300));
switch (event) {
case BlockBreakEvent(String username, BlockPos(int x, int y, int z)) ->
LOGGER.info("Player {} broke a block at ({}, {}, {})", username, x,
y, z);
}
if (event instanceof BlockBreakEvent(String username, BlockPos(int x, int
y, int z)))
LOGGER.info("Player {} broke a block at ({}, {}, {})", username, x, y,
z);
}
{code}
However, this cannot be used directly in method parameters, making the syntax
sugar less useful for code styles that involve the publisher/subscriber pattern
with a subscriber method per event type. I'd like to request support for this
in Groovy:
{code:groovy}
static void onBlockBreak(BlockBreakEvent(String username, BlockPos(int x, int
y, int z)) {
log.info "Player $username broke a block at ($x, $y, $z)"
}
{code}
The above would be equivalent to the following code:
{code:groovy}
static void onBlockBreak(BlockBreakEvent event) {
String username = event.username()
def (int x, int y, int z) = event.pos()
log.info "Player $username broke a block at ($x, $y, $z)"
}
{code}
was:
Java supports record deconstruction in switch and instanceof, like this:
{code:java}
record BlockPos(int x, int y, int z) {}
record BlockBreakEvent(String username, BlockPos pos) {}
public static void main(String[] args) {
var event = new BlockBreakEvent("Bob", new BlockPos(50, 100, 300));
switch (event) {
case BlockBreakEvent(String username, BlockPos(int x, int y, int z)) ->
LOGGER.info("Player {} broke a block at ({}, {}, {})", username, x,
y, z);
}
if (event instanceof BlockBreakEvent(String username, BlockPos(int x, int
y, int z)))
LOGGER.info("Player {} broke a block at ({}, {}, {})", username, x, y,
z);
}
{code}
However, this cannot be used directly in method parameters, making the syntax
sugar less useful for code styles that involve the publisher/subscriber pattern
with a subscriber method per event type. I'd like to request support for this
in Groovy:
{code:groovy}
static void onBlockBreak(BlockBreakEvent(String username, BlockPos(int x, int
y, int z)) {
log.info "Player $username broke a block at ($x, $y, $z)"
}
{code}
The above would be equivalent to the following code:
{code:groovy}
static void onBlockBreak(BlockBreakEvent event) {
String username = event.username()
def (int x, int y, int z) = event.pos()
log.info "Player $username broke a block at ($x, $y, $z)"
}
{code}
Relates to https://issues.apache.org/jira/browse/GROOVY-11589
> Support record deconstruction inside method parameter
> -----------------------------------------------------
>
> Key: GROOVY-11628
> URL: https://issues.apache.org/jira/browse/GROOVY-11628
> Project: Groovy
> Issue Type: New Feature
> Components: syntax
> Reporter: Oscar N
> Priority: Major
>
> Java supports record deconstruction in switch and instanceof, like this:
> {code:java}
> record BlockPos(int x, int y, int z) {}
> record BlockBreakEvent(String username, BlockPos pos) {}
>
> public static void main(String[] args) {
> var event = new BlockBreakEvent("Bob", new BlockPos(50, 100, 300));
> switch (event) {
> case BlockBreakEvent(String username, BlockPos(int x, int y, int z))
> ->
> LOGGER.info("Player {} broke a block at ({}, {}, {})", username,
> x, y, z);
> }
> if (event instanceof BlockBreakEvent(String username, BlockPos(int x, int
> y, int z)))
> LOGGER.info("Player {} broke a block at ({}, {}, {})", username, x,
> y, z);
> }
> {code}
> However, this cannot be used directly in method parameters, making the syntax
> sugar less useful for code styles that involve the publisher/subscriber
> pattern with a subscriber method per event type. I'd like to request support
> for this in Groovy:
> {code:groovy}
> static void onBlockBreak(BlockBreakEvent(String username, BlockPos(int x, int
> y, int z)) {
> log.info "Player $username broke a block at ($x, $y, $z)"
> }
> {code}
> The above would be equivalent to the following code:
> {code:groovy}
> static void onBlockBreak(BlockBreakEvent event) {
> String username = event.username()
> def (int x, int y, int z) = event.pos()
> log.info "Player $username broke a block at ($x, $y, $z)"
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)