[
https://issues.apache.org/jira/browse/GROOVY-9848?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles updated GROOVY-9848:
--------------------------------
Description:
{code:groovy}def map = [a:1,b:2,z:0].withDefault{3}{code}
Options:
# do nothing
{code:groovy}
assert 'a' in map
assert 'b' in map
assert 'x' in map // mutates!
assert 'z' !in map
assert 4 === map.size()
{code}
# change mutation of {{isCase}} -- guard with {{containsKey}}:
{code:groovy}
assert 'a' in map
assert 'b' in map
assert 'x' !in map
assert 'z' !in map
assert 3 === map.size()
{code}
# change {{isCase}} to {{containsKey}}:
{code:groovy}
assert 'a' in map
assert 'b' in map
assert 'x' !in map
assert 'z' in map
assert 3 === map.size()
// grep and switch behavior change (see below)
{code}
# ask user to test key set
{code:groovy}
assert 'a' in map.keySet()
assert 'b' in map.keySet()
assert 'x' !in map.keySet()
assert 'z' !in map.keySet()
assert 3 === map.size()
{code}
# provide {{@OperatorRename}} support:
{code:groovy}
@OperatorRename(isCase='containsKey')
void test() {
assert 'a' in map
assert 'b' in map
assert 'x' !in map
assert 'z' !in map
assert 3 === map.size()
}
{code}
# remap operator {{in}} to {{isIn}} (or some such):
{code:groovy}
// DGMs:
boolean isIn(Map map, Object key) {
return map != null && map.containsKey(key);
}
boolean isIn(Object obj, Object value) {
return InvokerHelper.invokeMethod(obj, "isCase", new Object[]{value});
}
assert 'a' in map
assert 'b' in map
assert 'x' !in map
assert 'z' in map
assert 3 === map.size()
// behavior change for any type that provides "isIn"
{code}
was:
{code:groovy}def map = [a:1,b:2,z:0].withDefault{3}{code}
Options:
# do nothing
{code:groovy}
assert 'a' in map
assert 'b' in map
assert 'x' in map // mutates!
assert 'z' !in map
assert 4 === map.size()
{code}
# change mutation of {{isCase}} -- guard with {{containsKey}}:
{code:groovy}
assert 'a' in map
assert 'b' in map
assert 'x' !in map
assert 'z' !in map
assert 3 === map.size()
{code}
# change {{isCase}} to {{containsKey}}:
{code:groovy}
assert 'a' in map
assert 'b' in map
assert 'x' !in map
assert 'z' in map
assert 3 === map.size()
// grep and switch behavior change (see below)
{code}
# ask user to test key set
{code:groovy}
assert 'a' in map.keySet()
assert 'b' in map.keySet()
assert 'x' !in map.keySet()
assert 'z' !in map.keySet()
assert 3 === map.size()
{code}
# provide {{@OperatorRename}} support:
{code:groovy}
@OperatorRename(isCase='containsKey')
void test() {
assert 'a' in map
assert 'b' in map
assert 'x' !in map
assert 'z' !in map
assert 3 === map.size()
}
{code}
> Allow membership operator to work on maps
> -----------------------------------------
>
> Key: GROOVY-9848
> URL: https://issues.apache.org/jira/browse/GROOVY-9848
> Project: Groovy
> Issue Type: Improvement
> Reporter: Keegan Witt
> Assignee: Eric Milles
> Priority: Major
> Labels: breaking, breaking_change
>
> {code:groovy}def map = [a:1,b:2,z:0].withDefault{3}{code}
> Options:
> # do nothing
> {code:groovy}
> assert 'a' in map
> assert 'b' in map
> assert 'x' in map // mutates!
> assert 'z' !in map
> assert 4 === map.size()
> {code}
> # change mutation of {{isCase}} -- guard with {{containsKey}}:
> {code:groovy}
> assert 'a' in map
> assert 'b' in map
> assert 'x' !in map
> assert 'z' !in map
> assert 3 === map.size()
> {code}
> # change {{isCase}} to {{containsKey}}:
> {code:groovy}
> assert 'a' in map
> assert 'b' in map
> assert 'x' !in map
> assert 'z' in map
> assert 3 === map.size()
> // grep and switch behavior change (see below)
> {code}
> # ask user to test key set
> {code:groovy}
> assert 'a' in map.keySet()
> assert 'b' in map.keySet()
> assert 'x' !in map.keySet()
> assert 'z' !in map.keySet()
> assert 3 === map.size()
> {code}
> # provide {{@OperatorRename}} support:
> {code:groovy}
> @OperatorRename(isCase='containsKey')
> void test() {
> assert 'a' in map
> assert 'b' in map
> assert 'x' !in map
> assert 'z' !in map
> assert 3 === map.size()
> }
> {code}
> # remap operator {{in}} to {{isIn}} (or some such):
> {code:groovy}
> // DGMs:
> boolean isIn(Map map, Object key) {
> return map != null && map.containsKey(key);
> }
> boolean isIn(Object obj, Object value) {
> return InvokerHelper.invokeMethod(obj, "isCase", new Object[]{value});
> }
> assert 'a' in map
> assert 'b' in map
> assert 'x' !in map
> assert 'z' in map
> assert 3 === map.size()
> // behavior change for any type that provides "isIn"
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)