You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by hlerebours <gi...@git.apache.org> on 2017/12/18 19:55:24 UTC

[GitHub] groovy pull request #645: DefaultGroovyMethods bug fix: Set.intersect(Iterab...

GitHub user hlerebours opened a pull request:

    https://github.com/apache/groovy/pull/645

    DefaultGroovyMethods bug fix: Set.intersect(Iterable) throwing if the iterable is bigger than the set

    

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/criteo-forks/groovy master

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/groovy/pull/645.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #645
    
----
commit 345d274849d9ab2dc5c85324a5711c6ed921f560
Author: Hugues Lerebours <h....@criteo.com>
Date:   2017-12-18T19:46:22Z

    DefaultGroovyMethods: intersect allocates the size of the smallest operand

commit 93e738ab388e9f3f6515b030aacd500ad29c79af
Author: Hugues Lerebours <h....@criteo.com>
Date:   2017-12-18T19:48:22Z

    DefaultGroovyMethods fix: intersect's return type depends on lhs type
    
    [Set].intersect([Iterable]) returns a Set, as the signature says it does,
    instead of throwing a ClassCastException if the Iterable is bigger
    than the Set

----


---

[GitHub] groovy pull request #645: DefaultGroovyMethods bug fix: Set.intersect(Iterab...

Posted by paulk-asert <gi...@git.apache.org>.
Github user paulk-asert commented on a diff in the pull request:

    https://github.com/apache/groovy/pull/645#discussion_r158594944
  
    --- Diff: subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/completion/ImportsSyntaxCompletor.groovy ---
    @@ -105,12 +105,12 @@ class ImportsSyntaxCompletor implements IdentifierCompletor {
                     Class clazz = shell.interp.evaluate([className]) as Class
                     if (clazz != null) {
                         List<String> clazzSymbols = ReflectionCompletor.getPublicFieldsAndMethods(clazz, '')*.value
    -                    List<String> importedSymbols;
    +                    Collection<String> importedSymbols
                         if (symbolName == '*') {
    -                        importedSymbols = clazzSymbols;
    +                        importedSymbols = clazzSymbols
                         } else {
                             Set<String> acceptableMatches = [symbolName, symbolName + '(', symbolName + '()']
    -                        importedSymbols = acceptableMatches.intersect(clazzSymbols)
    +                        importedSymbols = (acceptableMatches as Collection).intersect(clazzSymbols)
    --- End diff --
    
    Was changing this file needed?


---

[GitHub] groovy pull request #645: DefaultGroovyMethods bug fix: Set.intersect(Iterab...

Posted by asfgit <gi...@git.apache.org>.
Github user asfgit closed the pull request at:

    https://github.com/apache/groovy/pull/645


---

[GitHub] groovy pull request #645: DefaultGroovyMethods bug fix: Set.intersect(Iterab...

Posted by hlerebours <gi...@git.apache.org>.
Github user hlerebours commented on a diff in the pull request:

    https://github.com/apache/groovy/pull/645#discussion_r158601211
  
    --- Diff: subprojects/groovy-groovysh/src/main/groovy/org/codehaus/groovy/tools/shell/completion/ImportsSyntaxCompletor.groovy ---
    @@ -105,12 +105,12 @@ class ImportsSyntaxCompletor implements IdentifierCompletor {
                     Class clazz = shell.interp.evaluate([className]) as Class
                     if (clazz != null) {
                         List<String> clazzSymbols = ReflectionCompletor.getPublicFieldsAndMethods(clazz, '')*.value
    -                    List<String> importedSymbols;
    +                    Collection<String> importedSymbols
                         if (symbolName == '*') {
    -                        importedSymbols = clazzSymbols;
    +                        importedSymbols = clazzSymbols
                         } else {
                             Set<String> acceptableMatches = [symbolName, symbolName + '(', symbolName + '()']
    -                        importedSymbols = acceptableMatches.intersect(clazzSymbols)
    +                        importedSymbols = (acceptableMatches as Collection).intersect(clazzSymbols)
    --- End diff --
    
    Yes, because intersect() being called on a Set, it returns a Set now, not a List. So without this change, the assignment to importedSymbols throws a ClassCastException.
    
    About the cast of the Set to Collection, it was just for the call to intersect() to not be ambiguous, for there were two candidates: intersect(Set, Iterable) and intersect(Collection, Collection), the first one just calling the latter.


---