From 6b3ec5efb880069409376466cbeaf79740d4f21e Mon Sep 17 00:00:00 2001 From: Neil C Smith Date: Fri, 1 Aug 2025 10:18:26 +0100 Subject: [PATCH 1/6] Update to DiscoClient 2.0.39 to use Disco API v3. --- java/java.disco/external/binaries-list | 4 ++-- ...0.24-license.txt => discoclient-2.0.39-license.txt} | 2 +- ...1.0.11-license.txt => jdktools-11.0.19-license.txt} | 2 +- java/java.disco/nbproject/project.properties | 6 +++--- java/java.disco/nbproject/project.xml | 10 +++++----- 5 files changed, 12 insertions(+), 12 deletions(-) rename java/java.disco/external/{discoclient-2.0.24-license.txt => discoclient-2.0.39-license.txt} (99%) rename java/java.disco/external/{jdktools-11.0.11-license.txt => jdktools-11.0.19-license.txt} (99%) diff --git a/java/java.disco/external/binaries-list b/java/java.disco/external/binaries-list index f3d2c7cae278..46ca05197f6b 100644 --- a/java/java.disco/external/binaries-list +++ b/java/java.disco/external/binaries-list @@ -15,5 +15,5 @@ # specific language governing permissions and limitations # under the License. 4FCCADF37F1C61A0895BAC3D42FE0C530438826C org.checkerframework:checker-qual:3.9.1 -CE10D968585304A7463430DD53254E6D6893DF16 io.foojay.api:discoclient:2.0.24 -F66F9FC72A84FCAB1579202728EE572BDBB46DD7 eu.hansolo:jdktools:11.0.11 +BB975ACE8403330DCC7ABF61A3142B0B59ADC755 io.foojay.api:discoclient:2.0.39 +AD117688D24FACCF74D3B76AFFFC2693C4F5D122 eu.hansolo:jdktools:11.0.19 diff --git a/java/java.disco/external/discoclient-2.0.24-license.txt b/java/java.disco/external/discoclient-2.0.39-license.txt similarity index 99% rename from java/java.disco/external/discoclient-2.0.24-license.txt rename to java/java.disco/external/discoclient-2.0.39-license.txt index 79773f548111..27a8d7052a1f 100644 --- a/java/java.disco/external/discoclient-2.0.24-license.txt +++ b/java/java.disco/external/discoclient-2.0.39-license.txt @@ -1,6 +1,6 @@ Name: DiscoClient Origin: Gerrit Grunwald -Version: 2.0.24 +Version: 2.0.39 License: Apache-2.0 Description: Library to access the Foojay.io Discovery API service. Origin: https://github.com/foojayio/discoclient diff --git a/java/java.disco/external/jdktools-11.0.11-license.txt b/java/java.disco/external/jdktools-11.0.19-license.txt similarity index 99% rename from java/java.disco/external/jdktools-11.0.11-license.txt rename to java/java.disco/external/jdktools-11.0.19-license.txt index d196305cda64..eaaeb3c28dab 100644 --- a/java/java.disco/external/jdktools-11.0.11-license.txt +++ b/java/java.disco/external/jdktools-11.0.19-license.txt @@ -1,6 +1,6 @@ Name: JDKTools Origin: Gerrit Grunwald -Version: 11.0.11 +Version: 11.0.19 License: Apache-2.0 Description: Collection of classes for working with OpenJDK related things. Origin: https://github.com/HanSolo/jdktools diff --git a/java/java.disco/nbproject/project.properties b/java/java.disco/nbproject/project.properties index 776da4542bed..235e9a840781 100644 --- a/java/java.disco/nbproject/project.properties +++ b/java/java.disco/nbproject/project.properties @@ -17,7 +17,7 @@ is.autoload=true release.external/checker-qual-3.9.1.jar=modules/ext/checker-qual-3.9.1.jar -release.external/jdktools-11.0.11.jar=modules/ext/jdktools-11.0.11.jar -release.external/discoclient-2.0.24.jar=modules/ext/discoclient-2.0.24.jar -javac.release=11 +release.external/jdktools-11.0.19.jar=modules/ext/jdktools-11.0.19.jar +release.external/discoclient-2.0.39.jar=modules/ext/discoclient-2.0.39.jar +javac.release=17 javac.compilerargs=-Xlint -Xlint:-serial diff --git a/java/java.disco/nbproject/project.xml b/java/java.disco/nbproject/project.xml index 774c8f0c0747..54424f273ce0 100644 --- a/java/java.disco/nbproject/project.xml +++ b/java/java.disco/nbproject/project.xml @@ -36,7 +36,7 @@ - 2.8.5 + 2.9.1 @@ -202,12 +202,12 @@ - ext/discoclient-2.0.24.jar - external/discoclient-2.0.24.jar + ext/discoclient-2.0.39.jar + external/discoclient-2.0.39.jar - ext/jdktools-11.0.11.jar - external/jdktools-11.0.11.jar + ext/jdktools-11.0.19.jar + external/jdktools-11.0.19.jar ext/checker-qual-3.9.1.jar From f11fa116c3e263fb1987b6871e9f58d2b744731a Mon Sep 17 00:00:00 2001 From: Eirik Bakke Date: Mon, 4 Aug 2025 10:38:21 -0400 Subject: [PATCH 2/6] Revert the 'deprecated' note for Compile on Save. --- .../src/org/netbeans/modules/maven/customizer/Bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/maven/src/org/netbeans/modules/maven/customizer/Bundle.properties b/java/maven/src/org/netbeans/modules/maven/customizer/Bundle.properties index 679d0bfdc4c2..80fc8d5b3dfe 100644 --- a/java/maven/src/org/netbeans/modules/maven/customizer/Bundle.properties +++ b/java/maven/src/org/netbeans/modules/maven/customizer/Bundle.properties @@ -141,7 +141,7 @@ HINT_ApplicationCoS=Classes compiled with the Compile on Save feature in t RunJarPanel.lblConfiguration.text=&Configuration: ActionMappings.txtPackagings.text= ActionMappings.lblPackagings.text=Supported Packagings: -CompilePanel.cbCompileOnSave.text=Compile on &Save (deprecated) +CompilePanel.cbCompileOnSave.text=Compile on &Save CompilePanel.lblJavaPlatform1.text=Target Release: CompilePanel.compilerPanel.border.title=Compiler Plugin CompilePanel.idePanel.border.title=IDE Settings From e4c724906cec12ba3a64d7915003bad526a13d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Svatopluk=20D=C4=9Bdic?= Date: Mon, 4 Aug 2025 20:30:20 +0200 Subject: [PATCH 3/6] Do not introspect static properties --- .../modules/gradle/tooling/NbProjectInfoBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java b/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java index 45538756a15a..fcf4d6fff2a4 100644 --- a/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java +++ b/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java @@ -307,7 +307,6 @@ private String getTaskInheritance(Task t) { "shouldRunAfter", "enabled", "description", - "vendor", "group" )); @@ -718,6 +717,11 @@ private void inspectObjectAndValues0(Class clazz, Object object, String prefix, if ((mp.getModifiers() & Modifier.PUBLIC) == 0) { continue; } + // ignore static properties for now. If needed, they must be exported somehow per-class and protected + // against recursion. + if ((mp.getModifiers() & Modifier.STATIC) != 0) { + continue; + } if (object != null) { // Provider must NOT be asked for a value, otherwise it might run a Task in order to compute // the value. From 4ff4c6c71c21a3de703650fecc58279d7abb4eb3 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 6 Aug 2025 09:26:45 +0200 Subject: [PATCH 4/6] [GITHUB-8296] Adding support for PatternCaseLabel --- .../modules/java/source/save/CasualDiff.java | 8 ++ .../api/java/source/gen/SwitchTest.java | 86 +++++++++++++------ 2 files changed, 68 insertions(+), 26 deletions(-) diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java b/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java index 5044922c335f..6af32429e3c4 100644 --- a/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java +++ b/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java @@ -105,6 +105,7 @@ import com.sun.tools.javac.tree.JCTree.JCOpens; import com.sun.tools.javac.tree.JCTree.JCPackageDecl; import com.sun.tools.javac.tree.JCTree.JCParens; +import com.sun.tools.javac.tree.JCTree.JCPatternCaseLabel; import com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree; import com.sun.tools.javac.tree.JCTree.JCProvides; import com.sun.tools.javac.tree.JCTree.JCRecordPattern; @@ -2096,6 +2097,10 @@ protected int diffConstantCaseLabel(JCConstantCaseLabel oldT, JCConstantCaseLabe return diffTree((JCTree) oldT.expr, (JCTree) newT.expr, bounds); } + protected int diffPatternCaseLabel(JCPatternCaseLabel oldT, JCPatternCaseLabel newT, int[] bounds) { + return diffTree(oldT.pat, newT.pat, bounds); + } + protected int diffCase(JCCase oldT, JCCase newT, int[] bounds) { int localPointer = bounds[0]; List oldPatterns = oldT.getLabels(); @@ -5873,6 +5878,9 @@ private int diffTreeImpl0(JCTree oldT, JCTree newT, JCTree parent /*used only fo case CONSTANTCASELABEL: retVal = diffConstantCaseLabel((JCConstantCaseLabel) oldT, (JCConstantCaseLabel) newT, elementBounds); break; + case PATTERNCASELABEL: + retVal = diffPatternCaseLabel((JCPatternCaseLabel)oldT, (JCPatternCaseLabel)newT, elementBounds); + break; case RECORDPATTERN: retVal = diffRecordPattern((JCRecordPattern) oldT, (JCRecordPattern) newT, elementBounds); break; diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchTest.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchTest.java index 252714d4332d..3ddd675bcf54 100644 --- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchTest.java +++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchTest.java @@ -21,10 +21,12 @@ import com.sun.source.tree.BlockTree; import com.sun.source.tree.CaseTree; import com.sun.source.tree.ExpressionTree; +import com.sun.source.tree.IdentifierTree; import com.sun.source.tree.IfTree; import com.sun.source.tree.StatementTree; import com.sun.source.tree.SwitchTree; import com.sun.source.tree.Tree.Kind; +import com.sun.source.tree.VariableTree; import com.sun.source.util.TreePath; import com.sun.tools.javac.tree.JCTree; import org.netbeans.api.java.source.support.ErrorAwareTreePathScanner; @@ -238,9 +240,6 @@ public void run(final WorkingCopy copy) throws IOException { } public void testCaseMultiTest() throws Exception { - if (!enhancedSwitchAvailable()) - return; - class TestCase { public final String caseText; public final BiFunction convertCase; @@ -369,9 +368,6 @@ public void run(CompilationController cc) throws Exception { } public void testStatement2Rule() throws Exception { - if (!enhancedSwitchAvailable()) - return; - testFile = new File(getWorkDir(), "Test.java"); String test = "public class Test {\n" + " void m(int p) {\n" + @@ -417,9 +413,6 @@ public void run(final WorkingCopy copy) throws IOException { } public void testRule2Statement() throws Exception { - if (!enhancedSwitchAvailable()) - return; - testFile = new File(getWorkDir(), "Test.java"); String test = "public class Test {\n" + " void m(int p) {\n" + @@ -467,9 +460,6 @@ public void run(final WorkingCopy copy) throws IOException { } public void testDefaultRewrite() throws Exception { - if (!enhancedSwitchAvailable()) - return; - testFile = new File(getWorkDir(), "Test.java"); String test = "public class Test {\n" + " void m(int p) {\n" + @@ -511,9 +501,6 @@ public void run(final WorkingCopy copy) throws IOException { } public void testStatement2RuleNoSpace() throws Exception { - if (!enhancedSwitchAvailable()) - return; - testFile = new File(getWorkDir(), "Test.java"); String test = "public class Test {\n" + " void m(int p) {\n" + @@ -561,9 +548,6 @@ public void run(final WorkingCopy copy) throws IOException { } public void testNestedSwitches() throws Exception { - if (!enhancedSwitchAvailable()) - return; - testFile = new File(getWorkDir(), "Test.java"); String test = "public class Test {\n" + " void m(int p) {\n" + @@ -613,14 +597,64 @@ public void run(final WorkingCopy copy) throws IOException { assertEquals(golden, res); } - private boolean enhancedSwitchAvailable() { - try { - Class.forName("com.sun.source.tree.CaseTree$CaseKind", false, JCTree.class.getClassLoader()); - return true; - } catch (ClassNotFoundException ex) { - //OK - return false; - } + //github issue 8296: + public void testPatternSwitch1() throws Exception { + testFile = new File(getWorkDir(), "Test.java"); + String test = """ + public class Test { + void m(Object o) { + switch (o) { + case String s -> s.getClass(); + } + } + } + """; + String golden = """ + public class Test { + void m(Object o) { + switch (o) { + case String nue -> nue.getClass(); + default -> { + } + } + } + } + """; + TestUtilities.copyStringToFile(testFile, test.replace("|", "")); + JavaSource src = getJavaSource(testFile); + Task task = new Task() { + public void run(final WorkingCopy copy) throws IOException { + if (copy.toPhase(Phase.RESOLVED).compareTo(Phase.RESOLVED) < 0) { + return; + } + final TreeMaker make = copy.getTreeMaker(); + new ErrorAwareTreePathScanner() { + @Override + public Void visitVariable(VariableTree node, Void p) { + if (node.getName().contentEquals("s")) { + copy.rewrite(node, make.setLabel(node, "nue")); + } + return super.visitVariable(node, p); + } + @Override + public Void visitIdentifier(IdentifierTree node, Void p) { + if (node.getName().contentEquals("s")) { + copy.rewrite(node, make.setLabel(node, "nue")); + } + return super.visitIdentifier(node, p); + } + @Override + public Void visitSwitch(SwitchTree node, Void p) { + copy.rewrite(node, make.addSwitchCase(node, make.Case(List.of(), make.Block(List.of(), false)))); + return super.visitSwitch(node, p); + } + }.scan(copy.getCompilationUnit(), null); + } + }; + src.runModificationTask(task).commit(); + String res = TestUtilities.copyFileToString(testFile); + //System.err.println(res); + assertEquals(golden, res); } // XXX I don't understand what these are used for From f2129631e43dfbc4cdba3aeb02e5b121bc8493c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Svatopluk=20D=C4=9Bdic?= Date: Wed, 6 Aug 2025 15:15:24 +0200 Subject: [PATCH 5/6] Avoid reaching to foojay service during project introspection --- .../netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java b/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java index fcf4d6fff2a4..d47d7096a08d 100644 --- a/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java +++ b/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NbProjectInfoBuilder.java @@ -307,7 +307,8 @@ private String getTaskInheritance(Task t) { "shouldRunAfter", "enabled", "description", - "group" + "group", + "toolchainDownloadUrls" // UpdateDaemonJvm fron org.gradle.toolchains.foojay-resolver-convention accesses online sevice for URLs )); private void detectTaskProperties(NbProjectInfoModel model) { From 53cbfd44175c6fc54c46169d98a63a8a72ec0ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Svatopluk=20D=C4=9Bdic?= Date: Wed, 6 Aug 2025 12:35:19 +0200 Subject: [PATCH 6/6] Avoid implicit reference to unserializable Project in (stored) arg provider --- .../tooling/NetBeansRunSinglePlugin.java | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NetBeansRunSinglePlugin.java b/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NetBeansRunSinglePlugin.java index 6bbd4a43b99c..e1e01c3aedee 100644 --- a/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NetBeansRunSinglePlugin.java +++ b/extide/gradle/netbeans-gradle-tooling/src/main/java/org/netbeans/modules/gradle/tooling/NetBeansRunSinglePlugin.java @@ -20,6 +20,7 @@ package org.netbeans.modules.gradle.tooling; import static java.util.Arrays.asList; +import java.util.List; import java.util.Set; import org.gradle.api.DefaultTask; import org.gradle.api.logging.Logger; @@ -76,15 +77,8 @@ private void configureJavaExec(Project project, JavaExec je) { je.setArgs(asList(project.property(RUN_SINGLE_ARGS).toString().split(" "))); } if (project.hasProperty(RUN_SINGLE_JVM_ARGS)) { - // Property jvmArgumentProviders should not be implemented as a lambda to allow execution optimizations. - // See https://docs.gradle.org/current/userguide/validation_problems.html#implementation_unknown - je.getJvmArgumentProviders().add(new CommandLineArgumentProvider() { - // Do not convert to lambda. - @Override - public Iterable asArguments() { - return asList(project.property(RUN_SINGLE_JVM_ARGS).toString().split(" ")); - } - }); + // do not use plain setter, as other Plugins may provide their own JVM flags + providers. + je.getJvmArgumentProviders().add(new JvmArgumentsHolder(asList(project.property(RUN_SINGLE_JVM_ARGS).toString().split(" ")))); } try { je.setStandardInput(System.in); @@ -112,4 +106,22 @@ private void addTask(Project project, Task runTask) { runSingle.configure((task) -> task.doFirst((action) -> project.getLogger().warn(DEPRECATE_RUN_SINGLE))); } + /** + * A simple holder to add JVM arguments on top of other args provide by other plugins. + * DO NOT store Project or other resource-bound references here, keep static. It is attached to a task + * as a provider and serialized/cached. See Micronaut Configuration + * Cache requirements. + */ + private static class JvmArgumentsHolder implements CommandLineArgumentProvider { + private final List jvmArguments; + + public JvmArgumentsHolder(List jvmArguments) { + this.jvmArguments = jvmArguments; + } + + @Override + public Iterable asArguments() { + return jvmArguments; + } + } }