You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "A. Lepe (Jira)" <ji...@apache.org> on 2023/07/07 09:40:00 UTC
[jira] [Updated] (GROOVY-11119) String and Pattern conflict
[ https://issues.apache.org/jira/browse/GROOVY-11119?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
A. Lepe updated GROOVY-11119:
-----------------------------
Description:
I'm not sure if its a bug or I am doing something wrong, but it is a little bit strange:
Consider the following class:
{code:java}
// code placeholder
@CompileStatic
static class Search {
private String keyword
private Pattern pattern
private int code = 0
void setCriteria(String keyword) {
this.keyword = keyword
code = 1
}
void setCriteria(Pattern pattern) {
this.pattern = pattern
code = 2
}
int getCode() {
return code
}
}
{code}
Now if you execute:
{code:java}
// code placeholder
String kw = "something"
assert new Search(
criteria: kw
).code == 1
Pattern p = ~/\w+/
assert p instanceof Pattern
assert new Search(
criteria: p
).code == 2 // fails as value returned is 1{code}
It fails as it is calling the `setCriteria(String)` instead of `setCriteria(Pattern)`. I'm not sure if that is the expected behavior.
One thing to note is that the above code works without issues when compiling dynamically.
Another strange behavior is that if `setCriteria(Pattern)` is declared before `setCriteria(String)`, it fails to compile:
{code:java}
// code placeholder
@CompileStatic
static class Search {
private String keyword
private Pattern pattern
private int code = 0
// Pattern before String:
void setCriteria(Pattern pattern) {
this.pattern = pattern
code = 2
}
void setCriteria(String keyword) {
this.keyword = keyword
code = 1
}
int getCode() {
return code
}
}
new Search(
criteria: "hello" // <---- will fail here
){code}
The error thrown is:
{noformat}
Cannot cast object 'hello' with class 'java.lang.String' to class 'java.util.regex.Pattern'{noformat}
Again, without `@CompileStatic` works fine.
It seems to happen in all Groovy versions (2.X, 3.X and 4.X).
NOTE: I maintain a library which is developed with Groovy, but that can be used from Java or Kotlin, for that reason I need to support `Pattern` class outside Groovy.
I have created a testing code in case you need it:
[https://gitlab.com/intellisrc/groovy-bugs/-/tree/string-pattern]
was:
I'm not sure if its a bug or I am doing something wrong, but it is a little bit strange:
Consider the following class:
{code:java}
// code placeholder
@CompileStatic
static class Search {
private String keyword
private Pattern pattern
private int code = 0
void setCriteria(String keyword) {
this.keyword = keyword
code = 1
}
void setCriteria(Pattern pattern) {
this.pattern = pattern
code = 2
}
int getCode() {
return code
}
}
{code}
Now if you execute:
{code:java}
// code placeholder
String kw = "something"
assert new Search(
criteria: kw
).code == 1
Pattern p = ~/\w+/
assert p instanceof Pattern
assert new Search(
criteria: p
).code == 2 // fails as value returned is 1{code}
It fails as it is calling the `setCriteria(String)` instead of `setCriteria(Pattern)`. I'm not sure if that is the expected behavior.
One thing to note is that the above code works without issues when compiling dynamically.
Another strange behavior is that if `setCriteria(Pattern)` is declared before `setCriteria(String)`, it fails to compile:
{code:java}
// code placeholder
@CompileStatic
static class Search {
private String keyword
private Pattern pattern
private int code = 0
// Pattern before String:
void setCriteria(Pattern pattern) {
this.pattern = pattern
code = 2
}
void setCriteria(String keyword) {
this.keyword = keyword
code = 1
}
int getCode() {
return code
}
}
new Search(
criteria: "hello" // <---- will fail here
){code}
The error thrown is:
{noformat}
Cannot cast object 'hello' with class 'java.lang.String' to class 'java.util.regex.Pattern'{noformat}
Again, without `@CompileStatic` works fine.
It seems to happen in all Groovy versions (2.X, 3.X and 4.X).
NOTE: I maintain a library which is developed in Groovy, but that can be used from Groovy or Kotlin, for that reason I need to support `Pattern` class outside Groovy.
I have created a testing code in case you need it:
https://gitlab.com/intellisrc/groovy-bugs/-/tree/string-pattern
> String and Pattern conflict
> ---------------------------
>
> Key: GROOVY-11119
> URL: https://issues.apache.org/jira/browse/GROOVY-11119
> Project: Groovy
> Issue Type: Bug
> Components: regular expressions, Static compilation
> Affects Versions: 2.5.22, 3.0.18, 4.0.13
> Environment: Ubuntu 22.04
> Java 11
> Reporter: A. Lepe
> Priority: Minor
>
> I'm not sure if its a bug or I am doing something wrong, but it is a little bit strange:
> Consider the following class:
>
> {code:java}
> // code placeholder
> @CompileStatic
> static class Search {
> private String keyword
> private Pattern pattern
> private int code = 0
> void setCriteria(String keyword) {
> this.keyword = keyword
> code = 1
> }
> void setCriteria(Pattern pattern) {
> this.pattern = pattern
> code = 2
> }
> int getCode() {
> return code
> }
> }
> {code}
> Now if you execute:
> {code:java}
> // code placeholder
> String kw = "something"
> assert new Search(
> criteria: kw
> ).code == 1
> Pattern p = ~/\w+/
> assert p instanceof Pattern
> assert new Search(
> criteria: p
> ).code == 2 // fails as value returned is 1{code}
> It fails as it is calling the `setCriteria(String)` instead of `setCriteria(Pattern)`. I'm not sure if that is the expected behavior.
>
> One thing to note is that the above code works without issues when compiling dynamically.
> Another strange behavior is that if `setCriteria(Pattern)` is declared before `setCriteria(String)`, it fails to compile:
>
> {code:java}
> // code placeholder
> @CompileStatic
> static class Search {
> private String keyword
> private Pattern pattern
> private int code = 0
> // Pattern before String:
> void setCriteria(Pattern pattern) {
> this.pattern = pattern
> code = 2
> }
> void setCriteria(String keyword) {
> this.keyword = keyword
> code = 1
> }
> int getCode() {
> return code
> }
> }
> new Search(
> criteria: "hello" // <---- will fail here
> ){code}
> The error thrown is:
> {noformat}
> Cannot cast object 'hello' with class 'java.lang.String' to class 'java.util.regex.Pattern'{noformat}
> Again, without `@CompileStatic` works fine.
>
> It seems to happen in all Groovy versions (2.X, 3.X and 4.X).
> NOTE: I maintain a library which is developed with Groovy, but that can be used from Java or Kotlin, for that reason I need to support `Pattern` class outside Groovy.
> I have created a testing code in case you need it:
> [https://gitlab.com/intellisrc/groovy-bugs/-/tree/string-pattern]
--
This message was sent by Atlassian Jira
(v8.20.10#820010)