antlr / antlr/stringtemplate4

Support for Java records

Open
#313 2 comments 3 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
1k
Forks
234
PR merge metrics
No merged PRs in 30d

Description

Java 14 introduced the `record` keyword, which allows the creation of a lightweight "class" which really only holds data, similar to a `struct` in C for example. StringTemplate does not support records because the way records define fields/method is different.

Say I have a record `Person` (with the equivalent class after it) defined as

```java
/*
* Lightweight Person record, only one line.
*/
public record Person(String name, int age) {
// Nothing inside
}

/*
* This class is equivalent to the record above, but much more code needs to be written.
*/
public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String name() {
return this.name;
}

public int age() {
return this.age;
}
}
```

The record will have two methods, `name()`, and `age()`, for getting the name and age fields.

```java
Person person = new Person("John Doe", 30);
assert "John Doe".equals(person.name()) && person.age() == 30;
```

---

Related to #302, the fields of a record are private, and the methods do not follow StringTemplate's `findMember` method search pattern of `getField`, `isField`, and `hasField`:

```java
// try getXXX and isXXX properties, look up using reflection
String methodSuffix = Character.toUpperCase(memberName.charAt(0)) +
memberName.substring(1, memberName.length());

member = tryGetMethod(clazz, "get" + methodSuffix);
if (member == null) {
member = tryGetMethod(clazz, "is" + methodSuffix);
if (member == null) {
member = tryGetMethod(clazz, "has" + methodSuffix);
}
}

if (member == null) {
// try for a visible field
member = tryGetField(clazz, memberName);
}
```

The addition of a `tryGetMethod(clazz, memberName)` would solve this because the methods of a record are public. Or, fix the issue of #302, but doing this would help as well.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.