[ https://issues.apache.org/jira/browse/GROOVY-11222?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jochen Theodorou reassigned GROOVY-11222: ----------------------------------------- Assignee: Jochen Theodorou > Cannot parse methods that return types starting with lowercase letters > ---------------------------------------------------------------------- > > Key: GROOVY-11222 > URL: https://issues.apache.org/jira/browse/GROOVY-11222 > Project: Groovy > Issue Type: Bug > Components: parser > Affects Versions: 5.0.0-alpha-2, 4.0.15 > Reporter: Lyuben Atanasov > Assignee: Jochen Theodorou > Priority: Major > > According to the language specification, it is allowed to have class names > that start with a lowercase letter: > {quote}Identifiers start with a letter, a dollar or an underscore. They > cannot start with a number. > A letter can be in the following ranges: > * 'a' to 'z' (lowercase ascii letter) > * 'A' to 'Z' (uppercase ascii letter) > * '\u00C0' to '\u00D6' > * '\u00D8' to '\u00F6' > * '\u00F8' to '\u00FF' > * '\u0100' to '\uFFFE'{quote} > This is the same as in Java. > Defining types that start with lowercase letters works fine. As far as I can > tell, I can also use such types as method arguments. What I cannot do, is to > have methods that return types starting with lowercase letters. > Here's a failing example: > {code:groovy} > public class person { > private String firstName; > private String lastName; > > person(String firstName, String lastName) { > this.firstName = firstName; > this.lastName = lastName; > } > } > public class PersonFactory { > public person createPerson(String firstName, String lastName) { > return new person(firstName, lastName); > } > > } > {code} > When parsing this code, it fails with the following error: > {noformat} > Script_b41cda4fe6804e170255542089871d79.groovy: 13: Unexpected input: '(' @ > line 13, column 31. > public person createPerson(String firstName, String lastName) { > ^ > 1 error > {noformat} > If I change the class name to start with a capital letter, everything works: > {code:groovy} > public class Person { > private String firstName; > private String lastName; > > Person(String firstName, String lastName) { > this.firstName = firstName; > this.lastName = lastName; > } > } > public class PersonFactory { > public Person createPerson(String firstName, String lastName) { > return new Person(firstName, lastName); > } > > } > {code} > So it looks like there is a discrepancy between the language specification > and the grammar definition. I looked into the grammar and managed to extract > the following relevant lines from it, which should make the issue evident: > {code:java} > methodDeclaration[int t, int ct] > : modifiersOpt typeParameters? (returnType[$ct] nls)? > methodName formalParameters > ( > DEFAULT nls elementValue > | > (nls THROWS nls qualifiedClassNameList)? > (nls methodBody)? > )? > ; > > returnType[int ct] > : > standardType > | VOID > ; > > standardType > options { baseContext = type; } > : annotationsOpt > ( > primitiveType > | > standardClassOrInterfaceType > ) > emptyDimsOpt > ; > > standardClassOrInterfaceType > options { baseContext = classOrInterfaceType; } > : qualifiedStandardClassName typeArguments? > ; > > qualifiedStandardClassName > : qualifiedNameElements className (DOT className)* > ; > > className > : CapitalizedIdentifier > ; > {code} > Here, it is allowed only to have a CapitalizedIdentifier as the class name. > There is an obvious simple fix: > {code:java} > className > : CapitalizedIdentifier | Identifier > ; > {code} > This should make the parser work in the same way as expected after reading > the language spec. I am not sure, however, whether this won't break anything > else. > In order to avoid any unnecessary discussions about naming conventions: I am > aware that by convention it is not OK to start a type name with anything > other than a capital letter, but there are valid cases where it is desired to > have such names (e.g. generated code based on external input, DSLs). -- This message was sent by Atlassian Jira (v8.20.10#820010)