JDK-8225052 : javax.lang.model support for records
Type:Sub-task
Component:core-libs
Sub-Component:javax.lang.model
Priority:P4
Status:Resolved
Resolution:Fixed
Submitted:2019-05-30
Updated:2024-04-16
Resolved:2019-12-04
The Version table provides details related to the release that this issue/RFE will be addressed.
Unresolved : Release in which this issue/RFE will be addressed. Resolved: Release in which this issue/RFE has been resolved. Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.
Suggestion: it might be nice to put MANDATED on the necessary parameters when the "default" constructor is defined implicitly, as in
record R(int r) {
R { System.out.println("create an R"); }
}
07-08-2019
Re: previous comment: it looks like the MANDATED flag may be set when needed, in TypeEnter
$ grep RECORD.*MANDATED src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java
MethodDef(make.Modifiers(Flags.PUBLIC | Flags.RECORD | Flags.MANDATED),
MethodDef(make.Modifiers(Flags.PUBLIC | Flags.RECORD | Flags.FINAL | Flags.MANDATED),
MethodDef(make.Modifiers(Flags.PUBLIC | Flags.RECORD | Flags.FINAL | Flags.MANDATED),
MethodDef(make.Modifiers(Flags.PRIVATE | Flags.RECORD | Flags.FINAL | Flags.MANDATED),
07-08-2019
The current implementation conflates a member being required to be provided with Origin.MANDATED, since it ignores the possibility that the member may have been explicitly defined. This applies to all executable members.
Here's the relevant code in JavacElements.getOrigin.
if ((sym.flags() & (Flags.RECORD | Flags.MANDATED)) != 0)
return Origin.MANDATED;
Since we already have a MANDATED flag, we should ensure the flag is set on members of a record that were declared implicitly, and remove Flags.RECORD from that expression.