Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
a194364
Update NOTICE to 2026
ebarboni Jan 23, 2026
194efdf
Merge pull request #9156 from ebarboni/notice2026
ebarboni Jan 28, 2026
1a5a46f
Fix possible CCE during auto completion of invalid code
mbien Jan 29, 2026
53fc45b
Fix and disable masterfs lockfile test which is failing since 17u18
mbien Jan 30, 2026
d374b91
Fix possible NPE in ModuleInfoSelector
mbien Feb 2, 2026
dedef60
Merge pull request #9178 from mbien/fix-lockfile-test-again
mbien Feb 2, 2026
9e5a53d
README: Update pre-apache repo link
mbien Feb 2, 2026
5c3228f
StaticImport hint should support records and other class kinds
mbien Jan 29, 2026
669d5d9
javadoc renderer: fix snippet rendering in deprecated sections
mbien Jan 29, 2026
3111d54
java.api.common: Fix missing resource LBL_TestModuleFolder_DialogTitle
matthiasblaesing Feb 2, 2026
efc29c9
Merge pull request #9183 from mbien/readme-update-historic-repo-link_…
ebarboni Feb 3, 2026
60a4647
Merge pull request #9185 from matthiasblaesing/fix_missing_resource
ebarboni Feb 3, 2026
d99e9fc
Merge pull request #9181 from mbien/module-info-selector-npe_delivery
ebarboni Feb 4, 2026
e016873
Merge pull request #9173 from mbien/completion-cce_delivery
ebarboni Feb 4, 2026
fb954d4
Merge pull request #9175 from mbien/doc-code-blocks_delivery
ebarboni Feb 4, 2026
5f03712
Merge pull request #9174 from mbien/static-import-hint-for-records_de…
ebarboni Feb 4, 2026
ee3db7d
Only open Favorites when a file is first opened for editing.
neilcsmith-net Feb 4, 2026
0aef505
Make initial opening of the Favorites tab easier to brand in platform.
neilcsmith-net Feb 4, 2026
2313c20
Merge pull request #9186 from neilcsmith-net/gh8908rev
ebarboni Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion NOTICE
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Apache NetBeans
Copyright 2017-2025 The Apache Software Foundation
Copyright 2017-2026 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,8 @@ This gives you just few log entries including the initial checkin and
change of the file headers to Apache. But then the magic comes:

```bash
$ git remote add emilian https://github.com/emilianbold/netbeans-releases.git
$ git fetch emilian # this takes a while, the history is huge!
$ git remote add archive https://github.com/codelerity/netbeans-releases.git
$ git fetch archive # this takes a while, the history is huge!
$ git replace 6daa72c98 32042637 # the 1st donation
$ git replace 6035076ee 32042637 # the 2nd donation
```
Expand All @@ -174,6 +174,6 @@ $ git log platform/uihandler/arch.xml
$ git blame platform/uihandler/arch.xml
```

Many thanks to Emilian Bold who converted the ancient history to his
[Git repository](https://github.com/emilianbold/netbeans-releases)
and made the magic possible!
You can browse the archived repo [here](https://github.com/codelerity/netbeans-releases).

Many thanks to Emilian Bold who created the original archive repository.
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ TITLE_InvalidRoot=Invalid Source Roots
LBL_SourceFolder_DialogTitle=Add Source Folder
LBL_TestFolder_DialogTitle=Add Test Folder
LBL_ModuleFolder_DialogTitle=Add Module Folder
LBL_TestFolder_DialogTitle=Add Test Module Folder
LBL_TestModuleFolder_DialogTitle=Add Test Module Folder
LBL_InvalidRoot=Already used package folders:
MNE_InvalidRoot=A
AD_InvalidRoot=N/A
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5996,7 +5996,7 @@ private Set<? extends TypeMirror> getSmartTypesImpl(Env env) throws IOException
path = new TreePath(path, mid);
TypeMirror typeMirror = controller.getTrees().getTypeMirror(path);
final ExecutableType midTM = typeMirror != null && typeMirror.getKind() == TypeKind.EXECUTABLE ? (ExecutableType) typeMirror : null;
final ExecutableElement midEl = midTM == null ? null : (ExecutableElement) controller.getTrees().getElement(path);
final ExecutableElement midEl = midTM != null && controller.getTrees().getElement(path) instanceof ExecutableElement ee ? ee : null;
switch (mid.getKind()) {
case MEMBER_SELECT: {
String name = ((MemberSelectTree) mid).getIdentifier().toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,9 @@ HINT_SerialVersionUID_Generated=Add generated serialVersionUID
FieldForUnusedParamCustomizer.finalFields.text=<html>Fields are <code>final</code></html>
ACSD_Final_Fields=Make fields created by this hint final.

DSC_StaticImport=Convert a static method/field/enum-field reference to use a static import. Feedback to <a href="http://www.netbeans.org/issues/show_bug.cgi?id=89258">http://www.netbeans.org/issues/show_bug.cgi?id=89258</a>
DSC_StaticImport=<html>Convert a static method/field/enum-field reference to use a static import.\
<p><code>Math.abs(-1)</code> -> <code>abs(-1)</code></p><html>

DN_StaticImport=Static imports
ERR_StaticImport=Convert to static import
HINT_StaticImport=Convert {0} to static import
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import com.sun.source.tree.Tree;
import com.sun.source.tree.Tree.Kind;
import com.sun.source.util.TreePath;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
Expand All @@ -42,7 +41,6 @@
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Types;
import org.netbeans.api.java.source.CompilationInfo;
import org.netbeans.api.java.source.ElementUtilities;
import org.netbeans.api.java.source.GeneratorUtilities;
import org.netbeans.api.java.source.TreeMaker;
import org.netbeans.api.java.source.TreePathHandle;
Expand Down Expand Up @@ -77,36 +75,36 @@
*
* @author Sam Halliday
* @author markiewb
* @see <a href="http://www.netbeans.org/issues/show_bug.cgi?id=89258">RFE 89258</a>
* @see <a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html>Static Imports</a>
* @see <a href="https://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html>Static Imports</a>
*/
@Hint(category="rules15", displayName="#DN_StaticImport", description="#DSC_StaticImport", severity=Severity.HINT, enabled=false, suppressWarnings={"", "StaticImport"},
minSourceVersion = "5")
public class StaticImport {

private static final Set<ElementKind> SUPPORTED_TYPES = EnumSet.of(ElementKind.METHOD, ElementKind.ENUM_CONSTANT, ElementKind.FIELD);

@TriggerTreeKind(Kind.MEMBER_SELECT)
public static List<ErrorDescription> run(HintContext ctx) {
CompilationInfo info = ctx.getInfo();
TreePath treePath = ctx.getPath();

Element e = info.getTrees().getElement(treePath);
EnumSet<ElementKind> supportedTypes = EnumSet.of(ElementKind.METHOD, ElementKind.ENUM_CONSTANT, ElementKind.FIELD);
if (e == null || !e.getModifiers().contains(Modifier.STATIC) || !supportedTypes.contains(e.getKind())) {
if (e == null || !e.getModifiers().contains(Modifier.STATIC) || !SUPPORTED_TYPES.contains(e.getKind())) {
return null;
}

if (ElementKind.METHOD == e.getKind()) {
TreePath mitp = treePath.getParentPath();
if (mitp == null || mitp.getLeaf().getKind() != Kind.METHOD_INVOCATION) {
return null;
}
return null;
}
if (((MethodInvocationTree) mitp.getLeaf()).getMethodSelect() != treePath.getLeaf()) {
return null;
}
return null;
}
List<? extends Tree> typeArgs = ((MethodInvocationTree) mitp.getLeaf()).getTypeArguments();
if (typeArgs != null && !typeArgs.isEmpty()) {
return null;
}
return null;
}
}
Element enclosingEl = e.getEnclosingElement();
if (enclosingEl == null) {
Expand All @@ -122,7 +120,7 @@ public static List<ErrorDescription> run(HintContext ctx) {
return null;
}
Element klass = info.getTrees().getElement(cc);
if (klass == null || klass.getKind() != ElementKind.CLASS) {
if (klass == null || !klass.getKind().isDeclaredType()) {
return null;
}
String fqn = null;
Expand All @@ -143,7 +141,7 @@ public static List<ErrorDescription> run(HintContext ctx) {
if (ctx.isCanceled()) {
return null;
}
return Collections.singletonList(ed);
return List.of(ed);
}

public static final class FixImpl extends JavaFix {
Expand Down Expand Up @@ -189,31 +187,18 @@ protected void performRewrite(TransformationContext ctx) throws Exception {
return;
}
CompilationUnitTree cut = (CompilationUnitTree) copy.resolveRewriteTarget(copy.getCompilationUnit());
CompilationUnitTree nue = GeneratorUtilities.get(copy).addImports(cut, Collections.singleton(e));
CompilationUnitTree nue = GeneratorUtilities.get(copy).addImports(cut, Set.of(e));
copy.rewrite(cut, nue);
}

}

/**
* @param info
* @return true if the source level supports the static import language feature
*/
private static boolean supportsStaticImports(CompilationInfo info) {
return info.getSourceVersion().compareTo(SourceVersion.RELEASE_5) >= 0;
}

// returns true if a METHOD is enclosed in element with simple name sn
private static boolean hasMethodWithSimpleName(CompilationInfo info, Element element, final String sn) {
Iterable<? extends Element> members =
info.getElementUtilities().getMembers(element.asType(), new ElementUtilities.ElementAcceptor() {

@Override
public boolean accept(Element e, TypeMirror type) {
return e.getKind() == ElementKind.METHOD && e.getSimpleName().toString().equals(sn);
}
});
return members.iterator().hasNext();
return info.getElementUtilities().getMembers(
element.asType(),
(elem, type) -> elem.getKind() == ElementKind.METHOD && elem.getSimpleName().toString().equals(sn)
).iterator().hasNext();
}

/**
Expand Down Expand Up @@ -266,7 +251,7 @@ private static boolean hasStaticImportSimpleNameClash(CompilationInfo info, Stri
*/
private static boolean isSubTypeOrInnerOfSubType(CompilationInfo info, Element t1, Element t2) {
boolean isSubtype = info.getTypes().isSubtype(t1.asType(), t2.asType());
boolean isInnerClass = t1.getEnclosingElement().getKind() == ElementKind.CLASS;
boolean isInnerClass = t1.getEnclosingElement().getKind().isDeclaredType();
return isSubtype || (isInnerClass && info.getTypes().isSubtype(t1.getEnclosingElement().asType(), t2.asType()));
}

Expand All @@ -278,15 +263,12 @@ private static boolean isSubTypeOrInnerOfSubType(CompilationInfo info, Element t
* methods in klass (which may be an inner or static class).
*/
private static boolean hasMethodNameClash(CompilationInfo info, Element klass, String simpleName) {
assert klass != null;
assert klass.getKind() == ElementKind.CLASS;

// check the members and inherited members of the klass
if (hasMethodWithSimpleName(info, klass, simpleName)) {
return true;
}
Element klassEnclosing = klass.getEnclosingElement();
return (klassEnclosing != null && klassEnclosing.getKind() == ElementKind.CLASS && hasMethodWithSimpleName(info, klassEnclosing, simpleName));
return klassEnclosing != null && klassEnclosing.getKind().isDeclaredType() && hasMethodWithSimpleName(info, klassEnclosing, simpleName);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@ public void testStaticImportHint1() throws Exception {
String golden = "package test; import static java.lang.Math.abs; public class Test { public Test() { abs(1); } }";
performFixTest(test, golden);
}

public void testStaticImportHint1_InRecord() throws Exception {
String test = "package test; public record Test(int n) { public Test { Math.|abs(n); } }";
String golden = "package test; import static java.lang.Math.abs; public record Test(int n) { public Test { abs(n); } }";
performFixTest(test, golden, 17);
}

public void testStaticImportHint2() throws Exception {
String test = "package test; public class Test { public Test() { Test.get|Logger(); } public static void getLogger() { } }";
Expand Down Expand Up @@ -161,17 +167,22 @@ public void testIgnoreClass() throws Exception {
performAnalysisTest(test);
}

private void performFixTest(String test, String golden) throws Exception {
performFixTest(test, golden, 8);
}

// test is single line source code for test.Test, | in the member select, space before
// golden is the output to test against
// sn is the simple name of the static method
private void performFixTest(String test, String golden) throws Exception {
private void performFixTest(String test, String golden, int level) throws Exception {
int offset = test.indexOf("|");
assertTrue(offset != -1);
int end = test.indexOf("(", offset) - 1;
assertTrue(end > 0);
int start = test.lastIndexOf(" ", offset) + 1;
assertTrue(start > 0);
HintTest.create()
.sourceLevel(level)
.input(test.replace("|", ""))
.run(StaticImport.class)
.findWarning("0:" + start + "-0:" + end + ":hint:" + NbBundle.getMessage(StaticImport.class, "ERR_StaticImport"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,7 @@ private StringBuilder getElementDoc(final Element element, final CompilationInfo
});
sb.append("<p>"); //NOI18N
if (doc.containsKey(DocTree.Kind.DEPRECATED)) {
sb.append("<b>").append(NbBundle.getMessage(ElementJavadoc.class, "JCD-deprecated")).append("</b> <i>").append(doc.get(DocTree.Kind.DEPRECATED)).append("</i><p>"); //NOI18N
sb.append("<b>").append(NbBundle.getMessage(ElementJavadoc.class, "JCD-deprecated")).append("</b> <div style=\"font-style: italic\">").append(doc.get(DocTree.Kind.DEPRECATED)).append("</div><p>"); //NOI18N
}
if (doc.containsKey(null)) {
sb.append(doc.get(null));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -514,8 +514,7 @@ public ClassPath getActiveClassPath() {
if(moduleInfoFile.exists()) {
FileObject moduleInfo = FileUtil.toFileObject(moduleInfoFile);
String sourceLevel = SourceLevelQuery.getSourceLevel2(moduleInfo).getSourceLevel();
String ide_jdkvers = System.getProperty("java.version"); //NOI18N
if(!sourceLevel.startsWith("1.") && !ide_jdkvers.startsWith("1.")) { //NOI18N
if (sourceLevel != null && !sourceLevel.startsWith("1.")) { //NOI18N
// both sourceLevel and ideJDK are 9+
ret = hasModuleInfoCP.get();
}
Expand Down
2 changes: 1 addition & 1 deletion nbbuild/notice-stub.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Apache NetBeans
Copyright 2017-2025 The Apache Software Foundation
Copyright 2017-2026 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,6 @@ OpenIDE-Module-Long-Description=Favorites module enables you to create a view of

# Options Export
Favorites.Options.Export.displayName=Favorites

# Automatically open when first file opened for editing
Favorites.openOnFirstFile=true
36 changes: 28 additions & 8 deletions platform/favorites/src/org/netbeans/modules/favorites/Module.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,24 +32,35 @@
import org.netbeans.swing.plaf.LFCustoms;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject;
import org.openide.util.NbBundle;
import org.openide.util.NbPreferences;
import org.openide.windows.Mode;
import org.openide.windows.OnShowing;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;

/**
* For lifecycle tasks.
*
* @author mbien
*/
public final class Module {

private static final String INITIAL_OPEN_DONE_KEY = "initial-open-done"; //NOI18N
private static final String INITIAL_OPEN_BRANDING_KEY = "Favorites.openOnFirstFile"; //NOI18N

private Module() {}

@OnShowing
public final static class EDTInit implements Runnable {

private final boolean openOnFirstFile;

public EDTInit() {
openOnFirstFile = Boolean.parseBoolean(
NbBundle.getMessage(Module.class, INITIAL_OPEN_BRANDING_KEY));
}

@Override
public void run() {
registerFavAppenderFunction();
Expand All @@ -73,19 +84,23 @@ private void registerFavAppenderFunction() {
UIManager.put(LFCustoms.FILECHOOSER_SHORTCUTS_FILESFUNCTION, favAppender);
}

// very first on-editor-open event will also open the Favorites tab
// very first file editor opened will also open the Favorites tab
private void attachFirstEditorOpenListener() {
if (!openOnFirstFile) {
return;
}
Preferences prefs = NbPreferences.forModule(Module.class);
if (prefs.getBoolean(INITIAL_OPEN_DONE_KEY, false)) {
return;
}
WindowManager wm = WindowManager.getDefault();
wm.addPropertyChangeListener(new PropertyChangeListener() {
TopComponent.Registry registry = TopComponent.getRegistry();
registry.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("activeMode".equals(evt.getPropertyName()) //NOI18N
&& evt.getNewValue() instanceof Mode mode
&& wm.isEditorMode(mode)) {
if (TopComponent.Registry.PROP_TC_OPENED.equals(evt.getPropertyName())
&& evt.getNewValue() instanceof TopComponent tc
&& hasFileReference(tc)
&& WindowManager.getDefault().isEditorTopComponent(tc)) {
try {
Tab favTab = Tab.findDefault();
if (favTab != null && !favTab.wasOpened() && !favTab.isOpened()) {
Expand All @@ -95,13 +110,18 @@ public void propertyChange(PropertyChangeEvent evt) {
prefs.putBoolean(INITIAL_OPEN_DONE_KEY, true);
PropertyChangeListener thisListener = this;
SwingUtilities.invokeLater(() -> {
wm.removePropertyChangeListener(thisListener);
registry.removePropertyChangeListener(thisListener);
});
}
}

}
});
}

private boolean hasFileReference(TopComponent tc) {
return tc.getLookup().lookup(DataObject.class) != null;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package org.netbeans.modules.masterfs.filebasedfs.fileobjects;

import java.awt.GraphicsEnvironment;
import java.io.File;

import java.io.IOException;
Expand All @@ -26,6 +27,7 @@
import java.util.List;
import java.util.Stack;
import org.netbeans.junit.NbTestCase;
import org.netbeans.junit.RandomlyFails;
import org.netbeans.modules.masterfs.filebasedfs.FileBasedFileSystem;
import org.netbeans.modules.masterfs.filebasedfs.naming.FileNaming;
import org.netbeans.modules.masterfs.filebasedfs.naming.NamingFactory;
Expand All @@ -49,6 +51,7 @@ public StatFilesTest(String testName) {

@Override
protected void setUp() throws java.lang.Exception {
GraphicsEnvironment.isHeadless(); // may cause file reads in a static initializer on linux
FileObjectFactory.WARNINGS = false;
clearWorkDir();
testFile = new File(getWorkDir(), "testLockFile.txt");
Expand Down Expand Up @@ -151,6 +154,7 @@ public void testGetChildrenCaches() throws IOException {
monitor.getResults().assertResult(1, StatFiles.READ);
}

@RandomlyFails // JDK update releases caused failures
public void testLockFile() throws IOException {
FileObject fobj = getFileObject(testFile);
monitor.reset();
Expand Down
Loading