RFR: JDK-8242478: compiler implementation for records (Second Preview)
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Fri May 1 12:23:58 UTC 2020
Hi Vicente,
good work - some comments below:
* I think Tagir is right - consider code like this:
void m() {
enum Foo { A, B };
}
surely we want this to fail if you compile it w/o --enable-preview ?
* Check.java
"if (implicitlyStatic || (flags & STATIC) != 0) {"
Don't you already have the "staticOrImplicitlyStatic" var for this?
* Symbol.java
Note that javac already has the capability of tracking if a type is a
varargs type - see this code in Type.java
public ArrayType makeVarargs() {
return new ArrayType(elemtype, tsym, metadata) {
@Override
public boolean isVarargs() {
return true;
}
};
}
In other words, from the element type, if you call 'makeVarargs' you
will get a special ArrayType whose isVarargs() will return true. I think
that could be used to drop the new boolean flag and make the code
generally tighter.
* Attr.java
We already have a compiler diagnostic for when you try to override a
method with weaker access:
# 0: message segment, 1: set of flag or string
compiler.err.override.weaker.access=\
{0}\n\
attempting to assign weaker access privileges; was {1}
I think the wording for the new diagnostic for when you use stronger
access could be borrowed from this one? (e.g. take the above diagnostic
and replace weaker with stronger?)
* LocalStaticDeclaration
Since you are there, you might want to also add in the template some
missing cases:
* instance initializer
* constructor
* static method
I know some of the underlying code is shared - but better be safe than
sorry.
Cheers
Maurizio
On 30/04/2020 16:10, Vicente Romero wrote:
> Hi all,
>
> Please review the patch for the second preview of records at [1], the
> bug entry is at [2] the related spec can be found at [3], the JEP is
> at [4]. This patch implements the following changes:
>
> - local enums and interfaces, along with local records
> - removed possibility of final modifier for record components
> - removed requirement that canonical constructor must be public. Any
> access modifier must provide at least as much access as the record
> class. If a canonical constructor is implicitly declared, then its
> access modifier is the same as the record class
> - check that there is a iff relation between a varargs record
> component and the corresponding parameter in the canonical constructor
> so:
>
> record R(int... i) { R(int... i) {...}} is allowed but:
> record R(int... i) { R(int[] i) {...}} is not
>
> - new case for using @Override annotation to declare that a method is
> an accessor method for a record component
>
> These are the main changes, plus:
> - there is one liner change to java.io.ObjectStreamClass, this is
> related to the fact that now the canonical record don't necessarily
> has to be public thus the use of Class::getDeclaredConstructor
> - there is a one liner change concerning the flags of the generated
> toString method, this is a bug fix, toString didn't have the same
> flags as hashCode and equals
> - I have added several tests to enforce other rules in the spec like
> the one saying that in a compact constructor fields have to be
> initialized in the same order in which the corresponding record
> component has been declared, plus some additional tests
> - test RecordCompilationTests is executed twice now, first in a mode
> that is equivalent to the original test and then using an "empty"
> annotation processor. This is because some regressions have been
> discovered in the past when an annotation processor is present. I have
> also made some changes to the libraries this test uses.
>
> Thanks,
> Vicente
>
> [1] http://cr.openjdk.java.net/~vromero/8242478/webrev.00
> [2] https://bugs.openjdk.java.net/browse/JDK-8242478
> [3]
> http://cr.openjdk.java.net/~gbierman/records2/20200428/specs/records-jls.html
> [4] https://bugs.openjdk.java.net/browse/JDK-8242303
More information about the amber-dev
mailing list