[ 
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)

Reply via email to