Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java 21: Pattern Matching + StringTemplate JEP-430 + Unnamed JEP-445 #935

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from

Conversation

npeters
Copy link

@npeters npeters commented Oct 3, 2023

Before this PR

May error on parsing Java 21 file.

After this PR

Support of different JEP of Java 21 and preview

  • JEP-430 StringTemplates
  • JEP-440 Record Patterns
  • JEP-441 Pattern Matching switch (with guard)
  • JEP-443 Unamed Pattern

Possible downsides?

Build

  • I added a independent gradle module to build all Java 21 code but the gradle do not support to build groovy code with java 21: it should be first compile with java 17 and you can compile the project with java 21 😞
  • I added a hack on palantir-java-format gradle script to copy all the java 21 class file on the jar. 😞
  • Need to add --enable-preview with Java 21.

Code

  • "StringTemplates" was really hard to support: I did some change on JavaInput.java and visitStringTemplate. The complexity of this part is really to high.
  • I copy and past "visitCase" from Java14 file and the guard param.

@palantirtech
Copy link
Member

Thanks for your interest in palantir/palantir-java-format, @npeters! Before we can accept your pull request, you need to sign our contributor license agreement - just visit https://cla.palantir.com/ and follow the instructions. Once you sign, I'll automatically update this pull request.

@changelog-app
Copy link

changelog-app bot commented Oct 3, 2023

Generate changelog in changelog/@unreleased

What do the change types mean?
  • feature: A new feature of the service.
  • improvement: An incremental improvement in the functionality or operation of the service.
  • fix: Remedies the incorrect behaviour of a component of the service in a backwards-compatible way.
  • break: Has the potential to break consumers of this service's API, inclusive of both Palantir services
    and external consumers of the service's API (e.g. customer-written software or integrations).
  • deprecation: Advertises the intention to remove service functionality without any change to the
    operation of the service itself.
  • manualTask: Requires the possibility of manual intervention (running a script, eyeballing configuration,
    performing database surgery, ...) at the time of upgrade for it to succeed.
  • migration: A fully automatic upgrade migration task with no engineer input required.

Note: only one type should be chosen.

How are new versions calculated?
  • ❗The break and manual task changelog types will result in a major release!
  • 🐛 The fix changelog type will result in a minor release in most cases, and a patch release version for patch branches. This behaviour is configurable in autorelease.
  • ✨ All others will result in a minor version release.

Type

  • Feature
  • Improvement
  • Fix
  • Break
  • Deprecation
  • Manual task
  • Migration

Description

Java 21: Pattern Matching + StringTemplate JEP-430 + Unnamed JEP-445

Check the box to generate changelog(s)

  • Generate changelog entry

@npeters
Copy link
Author

npeters commented Oct 3, 2023

The build is so painful... I push all the jar / idea-plugin https://github.com/npeters/palantir-java-format/releases/tag/java21-draft.

@npeters
Copy link
Author

npeters commented Oct 3, 2023

link to #934 #933 #931

@kittech0
Copy link

great job, now gotta wait for approval

Copy link
Contributor

@koppor koppor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was going to use palantir-java-format and saw this PR. I read through and commented on code changes appearing unusual to me. Feel free to use or to ignore - I am not affiliated with the project, just some Java project lead.

build.gradle Outdated
Comment on lines 48 to 52
sourceCompatibility = 11
targetCompatibility = 11
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would keep as is - and remove the "duplicate" settings in the sub projects.

Comment on lines 11 to 12
java{
sourceCompatibility = 11
targetCompatibility = 11
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be removed (because configured globally)

Comment on lines 54 to 64
java{
sourceCompatibility = 11
targetCompatibility = 11
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be removed (because configured globally)

Comment on lines 5 to 9
java{
sourceCompatibility = 11
targetCompatibility = 11
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be removed (because configured globally)

java{
sourceCompatibility = 11
targetCompatibility = 11
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be removed (because configured globally)

if (stringFragmentKind) {
stringFragmentEndPos = t.endPos();
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove empty line

@@ -394,6 +394,7 @@ protected void handleModule(boolean first, CompilationUnitTree node) {}

/** Skips over extra semi-colons at the top-level, or in a class member declaration lists. */
protected void dropEmptyDeclarations() {

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove empty line

import a.A;;
import a.A;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why was the test input changed?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

";;" is not valid on java 21.
"Disallow Extra Semicolons Between "import" Statements"
https://www.oracle.com/java/technologies/javase/21-relnote-issues.html#JDK-8027682

I was not able to disable the test only for Java21

package foo;;
package foo;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why was the test input changed?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

";;" is not valid on java 21.
"Disallow Extra Semicolons Between "import" Statements"
https://www.oracle.com/java/technologies/javase/21-relnote-issues.html#JDK-8027682

I was not able to disable the test only for Java21

Void r = scan(node.getDeconstructor(), unused);
token("(");

// r = scanAndReduceVoid(, unused, r);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this comment mean?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I remove it

@talios
Copy link

talios commented Nov 5, 2023

Has there been any progress on this PR? Would love to see a new release supporting Java 21.

@CRogers
Copy link
Contributor

CRogers commented Nov 17, 2023

Thanks for submitting this PR - although we're unlikely to be able review it/actually support Java 21 in palantir-java-format by the end of the year. There's a significant amount of other work we need to do on our internal repos (currently ongoing) before we can start using Java 21 source features and these take priority. Unfortunately, we are quite resource constrained at the moment.

Until then, you may be able to use something like jitpack (https://jitpack.io/) if it is allowed by your organisation to use this commit hash until we are in a place to review/merging/supporting it.

@koppor
Copy link
Contributor

koppor commented Nov 20, 2023

The build is so painful... I push all the jar / idea-plugin npeters/palantir-java-format@java21-draft (release).

Is there also a chance for the gradle plugin? I also hit some issues and would like to test if the modification works with https://github.com/JabRef/jabref/blob/39569344d4051ac958e4fc5edda89866d0706498/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java#L63. (which is issue #952)



switch (something){
case Integer i when i > 10-> System.out.println(i.toString());
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the #952 should be fix and the test is here

@npeters
Copy link
Author

npeters commented Nov 20, 2023

yes, the PR should manage the #952. It is part of 'JEP-441 Pattern Matching switch (with guard)' .
There are already a test on the guard: sample is I961.

@wb459
Copy link

wb459 commented Feb 21, 2024

@CRogers Is there any news regarding when the team will have the capacity to review this PR?

@bmarwell
Copy link

bmarwell commented Mar 3, 2024

Thanks for submitting this PR - although we're unlikely to be able review it/actually support Java 21 in palantir-java-format by the end of the year.

End of WHICH year? 😄
Jokes aside – can you nominate more maintainers? A few ASF projects like maven use palantir and we would like to have property formatted source code. Maybe one of them could get access to palantir PRs and releases?

@talios
Copy link

talios commented Apr 7, 2024

In relation to this - StringTemplates as we currently no them are 100% dead and will not be in JDK 23, even under --enable-preview: https://mail.openjdk.org/pipermail/amber-spec-experts/2024-April/004106.html

@anbonifacio
Copy link

Maybe a smaller scope would be easier to review? What about limiting the support to the new pattern matching features like case null, defaut ->?

@koppor
Copy link
Contributor

koppor commented Apr 8, 2024

As far as I understand the whole setting, the whole endeavor is blocked by the release of version 2.0 of the IntelliJ Gradle Plugin, because of the fix JetBrains/intellij-platform-gradle-plugin#1494 is needed.

(Source: #997)

@npeters
Copy link
Author

npeters commented Apr 27, 2024

@koppor How can I assist you?
This PR seems too complex to merge and I understand.
Perhaps a better approach would be as follows:

  1. Create one pull request with a Gradle configuration build that includes multi-compilation tasks and multi-test task, each targeting a specific JDK version.
  2. Submit another pull request containing the Java code and associated tests

@koppor If you agree with this plan. I can try to do it.

@npeters
Copy link
Author

npeters commented Apr 27, 2024

@talios thank you for the point. We need to create a InputAstVisitor class for each java version.

@xHyroM
Copy link

xHyroM commented May 12, 2024

How it's looking?

@RealYusufIsmail
Copy link

Yo, any updates in regard to the following changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet