This is an automated email from the ASF dual-hosted git repository.

dbalek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 9800f604ec VSCode: Various code completion enhancements. (#5963)
9800f604ec is described below

commit 9800f604ec27008c537a5505f7bfebd3c7908314
Author: Dusan Balek <[email protected]>
AuthorDate: Mon May 22 08:24:40 2023 +0200

    VSCode: Various code completion enhancements. (#5963)
---
 .../java/completion/JavaDocumentationTask.java     |   5 +
 .../editor/java/JavaCompletionCollector.java       |  12 ++-
 .../modules/editor/java/JavaHoverProvider.java     |   5 +-
 .../netbeans/modules/editor/java/Utilities.java    |  36 ++++++-
 .../modules/editor/java/GoToSupportTest.java       |   4 +-
 .../J2SEPlatformDefaultJavadocImpl.java            |   2 +-
 .../server/protocol/TextDocumentServiceImpl.java   |   2 +-
 .../java/lsp/server/protocol/ServerTest.java       |   6 +-
 .../queries/PlatformJavadocForBinaryQuery.java     |   5 +
 .../api/java/source/ui/ElementJavadoc.java         | 104 +++++++++++++++------
 10 files changed, 136 insertions(+), 45 deletions(-)

diff --git 
a/java/java.completion/src/org/netbeans/modules/java/completion/JavaDocumentationTask.java
 
b/java/java.completion/src/org/netbeans/modules/java/completion/JavaDocumentationTask.java
index fc8228c134..1ca8c0b205 100644
--- 
a/java/java.completion/src/org/netbeans/modules/java/completion/JavaDocumentationTask.java
+++ 
b/java/java.completion/src/org/netbeans/modules/java/completion/JavaDocumentationTask.java
@@ -89,6 +89,11 @@ public final class JavaDocumentationTask<T> extends BaseTask 
{
                 case ENUM_CONSTANT:
                 case FIELD:
                 case METHOD:
+                case LOCAL_VARIABLE:
+                case PARAMETER:
+                case EXCEPTION_PARAMETER:
+                case RESOURCE_VARIABLE:
+                case BINDING_VARIABLE:
                     documentation = (T)factory.create(controller, el, cancel);
             }
         }
diff --git 
a/java/java.editor/src/org/netbeans/modules/editor/java/JavaCompletionCollector.java
 
b/java/java.editor/src/org/netbeans/modules/editor/java/JavaCompletionCollector.java
index eb5c30c403..0b69d79d4e 100644
--- 
a/java/java.editor/src/org/netbeans/modules/editor/java/JavaCompletionCollector.java
+++ 
b/java/java.editor/src/org/netbeans/modules/editor/java/JavaCompletionCollector.java
@@ -41,6 +41,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
@@ -160,7 +161,10 @@ public class JavaCompletionCollector implements 
CompletionCollector {
                 JavaDocumentationTask<Future<String>> task = 
JavaDocumentationTask.create(offset, handle, new 
JavaDocumentationTask.DocumentationFactory<Future<String>>() {
                     @Override
                     public Future<String> create(CompilationInfo 
compilationInfo, Element element, Callable<Boolean> cancel) {
-                        return ElementJavadoc.create(compilationInfo, element, 
cancel).getTextAsync();
+                        ElementJavadoc doc = 
ElementJavadoc.create(compilationInfo, element, cancel);
+                        return ((CompletableFuture<String>) 
doc.getTextAsync()).thenApplyAsync(content -> {
+                            return Utilities.resolveLinks(content, doc);
+                        });
                     }
                 }, () -> false);
                 
ParserManager.parse(Collections.singletonList(Source.create(doc)), new 
UserTask() {
@@ -890,8 +894,10 @@ public class JavaCompletionCollector implements 
CompletionCollector {
                 }
                 cnt++;
                 String paramTypeName = Utilities.getTypeName(info, tm, false, 
desc.isVarArgs() && !tIt.hasNext()).toString();
-                String paramName = it.next().getSimpleName().toString();
-                label.append(paramTypeName).append(' ').append(paramName);
+                VariableElement var = it.next();
+                List<String> varNames = Utilities.varNamesSuggestions(tm, 
var.getKind(), Collections.emptySet(), null, null, info.getTypes(), 
info.getElements(), Collections.emptyList(), 
CodeStyle.getDefault(info.getFileObject()));
+                String paramName = varNames.isEmpty() ? 
var.getSimpleName().toString() : varNames.get(0);
+                label.append(paramName);
                 
insertText.append("${").append(cnt).append(":").append(paramName).append("}");
                 sortText.append(paramTypeName);
             }
diff --git 
a/java/java.editor/src/org/netbeans/modules/editor/java/JavaHoverProvider.java 
b/java/java.editor/src/org/netbeans/modules/editor/java/JavaHoverProvider.java
index 31ee21ef09..e77478e399 100644
--- 
a/java/java.editor/src/org/netbeans/modules/editor/java/JavaHoverProvider.java
+++ 
b/java/java.editor/src/org/netbeans/modules/editor/java/JavaHoverProvider.java
@@ -47,7 +47,10 @@ public class JavaHoverProvider implements HoverProvider {
             JavaDocumentationTask<CompletableFuture<String>> task = 
JavaDocumentationTask.create(offset, null, new 
JavaDocumentationTask.DocumentationFactory<CompletableFuture<String>>() {
                 @Override
                 public CompletableFuture<String> create(CompilationInfo 
compilationInfo, Element element, Callable<Boolean> cancel) {
-                    return (CompletableFuture<String>) 
ElementJavadoc.create(compilationInfo, element, cancel).getTextAsync();
+                    ElementJavadoc doc = 
ElementJavadoc.create(compilationInfo, element, cancel);
+                    return ((CompletableFuture<String>) 
doc.getTextAsync()).thenApplyAsync(content -> {
+                        return Utilities.resolveLinks(content, doc);
+                    });
                 }
             }, () -> false);
             ParserManager.parse(Collections.singletonList(Source.create(doc)), 
new UserTask() {
diff --git 
a/java/java.editor/src/org/netbeans/modules/editor/java/Utilities.java 
b/java/java.editor/src/org/netbeans/modules/editor/java/Utilities.java
index ef66a8d2c3..bb3e33fef9 100644
--- a/java/java.editor/src/org/netbeans/modules/editor/java/Utilities.java
+++ b/java/java.editor/src/org/netbeans/modules/editor/java/Utilities.java
@@ -44,12 +44,13 @@ import com.sun.source.util.Trees;
 import org.netbeans.api.java.source.support.ErrorAwareTreeScanner;
 
 import java.awt.Color;
+import java.net.URL;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.prefs.PreferenceChangeEvent;
 import java.util.prefs.PreferenceChangeListener;
 import java.util.prefs.Preferences;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import javax.lang.model.SourceVersion;
@@ -62,7 +63,6 @@ import javax.swing.text.JTextComponent;
 
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.editor.mimelookup.MimeLookup;
-import org.netbeans.api.editor.settings.SimpleValueNames;
 import org.netbeans.api.java.lexer.JavaTokenId;
 import org.netbeans.api.java.source.CodeStyle;
 import org.netbeans.api.java.source.CodeStyleUtils;
@@ -72,6 +72,7 @@ import org.netbeans.api.java.source.SourceUtils;
 import org.netbeans.api.java.source.TreeUtilities;
 import org.netbeans.api.java.source.TypeUtilities.TypeNameOptions;
 import org.netbeans.api.java.source.support.ReferencesCount;
+import org.netbeans.api.java.source.ui.ElementJavadoc;
 import org.netbeans.api.lexer.InputAttributes;
 import org.netbeans.api.lexer.Language;
 import org.netbeans.api.lexer.LanguagePath;
@@ -93,6 +94,7 @@ import org.openide.util.WeakListeners;
 public final class Utilities {
     
     private static final String ERROR = "<error>"; //NOI18N
+    private static final Pattern LINK_PATTERN = Pattern.compile("<a 
href='(\\*\\d+)'>(.*?)<\\/a>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
 
     private static boolean guessMethodArguments = 
CodeCompletionPanel.GUESS_METHOD_ARGUMENTS_DEFAULT;
     private static boolean autoPopupOnJavaIdentifierPart = 
CodeCompletionPanel.JAVA_AUTO_POPUP_ON_IDENTIFIER_PART_DEFAULT;
@@ -572,7 +574,11 @@ public final class Utilities {
                 if ("Iterator".equals(tn)) //NOI18N
                     al.add("it"); //NOI18N
                 while((tn = nextName(tn)).length() > 0) {
-                    al.add(tn);
+                    if (SourceVersion.isKeyword(tn)) {
+                        al.add('a' + tn.substring(0, 1).toUpperCase() + 
tn.substring(1));
+                    } else {
+                        al.add(tn);
+                    }
                     sb.append(tn.charAt(0));
                 }
                 if (sb.length() > 0) {
@@ -592,7 +598,11 @@ public final class Utilities {
                 if ("Iterator".equals(tn)) //NOI18N
                     al.add("it"); //NOI18N
                 while((tn = nextName(tn)).length() > 0) {
-                    al.add(tn);
+                    if (SourceVersion.isKeyword(tn)) {
+                        al.add('a' + tn.substring(0, 1).toUpperCase() + 
tn.substring(1));
+                    } else {
+                        al.add(tn);
+                    }
                     sb.append(tn.charAt(0));
                 }
                 if (iterable != null && types.isSubtype(type, iterable)) {
@@ -1066,6 +1076,24 @@ public final class Utilities {
         return found;
     }
 
+    static String resolveLinks(String content, ElementJavadoc doc) {
+        Matcher matcher = LINK_PATTERN.matcher(content);
+        String updatedContent = matcher.replaceAll(result -> {
+            if (result.groupCount() == 2) {
+                try {
+                    ElementJavadoc link = doc.resolveLink(result.group(1));
+                    URL url = link != null ? link.getURL() : null;
+                    if (url != null) {
+                        return "<a href='" + url.toString() + "'>" + 
result.group(2) + "</a>";
+                    }
+                } catch (Exception ex) {}
+                return result.group(2);
+            }
+            return result.group();
+        });
+        return updatedContent;
+    }
+
     private Utilities() {
     }
 }
diff --git 
a/java/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
 
b/java/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
index 7fe0dfe824..8deac6817b 100644
--- 
a/java/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
+++ 
b/java/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
@@ -1423,7 +1423,7 @@ public class GoToSupportTest extends NbTestCase {
         }, true, false);
 
         toolTip = toolTip.replace(source.toURI().toString(), "FILE");
-        assertEquals("<html><body><base href=\"FILE\"></base><font 
size='+0'><b><a href='*0'>test.&#x200B;Test.&#x200B;R</a></b></font>", toolTip);
+        assertEquals("<html><body><base href=\"FILE\"></base><font 
size='+0'><b><a href='*0'>test.&#x200B;Test.&#x200B;R</a></b></font><pre>int 
<b>ff</b></pre>", toolTip);
     }
 
     public void testRecords3() throws Exception {
@@ -1457,7 +1457,7 @@ public class GoToSupportTest extends NbTestCase {
         }, true, false);
 
         toolTip = toolTip.replace(source.toURI().toString(), "FILE");
-        assertEquals("<html><body><base href=\"FILE\"></base><font 
size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font>", toolTip);
+        assertEquals("<html><body><base href=\"FILE\"></base><font 
size='+0'><b><a href='*0'>test.&#x200B;Test</a></b></font><pre>public record 
<b>RR</b></pre>", toolTip);
     }
 
     public void testRecords4() throws Exception {
diff --git 
a/java/java.j2seplatform/src/org/netbeans/modules/java/j2seplatform/platformdefinition/J2SEPlatformDefaultJavadocImpl.java
 
b/java/java.j2seplatform/src/org/netbeans/modules/java/j2seplatform/platformdefinition/J2SEPlatformDefaultJavadocImpl.java
index 30369b12da..0cc007ec03 100644
--- 
a/java/java.j2seplatform/src/org/netbeans/modules/java/j2seplatform/platformdefinition/J2SEPlatformDefaultJavadocImpl.java
+++ 
b/java/java.j2seplatform/src/org/netbeans/modules/java/j2seplatform/platformdefinition/J2SEPlatformDefaultJavadocImpl.java
@@ -68,7 +68,7 @@ public final class J2SEPlatformDefaultJavadocImpl implements 
J2SEPlatformDefault
         if (now.isAfter(jdk9)) { // time traveler -> only java 8 doc for you
             int jdk = 9;
             for (LocalDate t = jdk9; t.isBefore(now); t = t.plusMonths(6)) {
-                OFFICIAL_JAVADOC.put(String.valueOf(jdk), 
"https://docs.oracle.com/javase/"; + jdk + "/docs/api/"); // NOI18N
+                OFFICIAL_JAVADOC.put(String.valueOf(jdk), 
"https://docs.oracle.com/en/java/javase/"; + jdk + "/docs/api/"); // NOI18N
                 jdk++;
             }
             OFFICIAL_JAVADOC.put(String.valueOf(jdk), 
"https://download.java.net/java/early_access/jdk"; + jdk + "/docs/api/"); // 
NOI18N Early access
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
index b268541495..8084aa3410 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
@@ -1942,7 +1942,7 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
             }
             missingFileDiscovered(uri);
         } catch (MalformedURLException ex) {
-            if (!uri.startsWith("untitled:")) {
+            if (!uri.startsWith("untitled:") && !uri.startsWith("jdt:")) {
                 LOG.log(Level.WARNING, "Invalid file URL: " + uri, ex);
             }
         }
diff --git 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
index 17e7841824..ca25bce6c7 100644
--- 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
+++ 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
@@ -400,7 +400,7 @@ public class ServerTest extends NbTestCase {
         assertEquals(Arrays.asList("Method:test() : void"), actualItems);
         assertEquals(null, actualCompletionItem.get(0).getDocumentation());
         CompletionItem resolvedItem = 
server.getTextDocumentService().resolveCompletionItem(actualCompletionItem.get(0)).get();
-        assertEquals("**[Test](*0)**\n" +
+        assertEquals("**Test**\n" +
                      "\n" +
                      "```\n" +
                      "public void test()\n" +
@@ -1386,9 +1386,7 @@ public class ServerTest extends NbTestCase {
         MarkupContent content = hover.getContents().getRight();
         assertNotNull(content);
         assertEquals(content.getKind(), "markdown");
-        assertEquals(content.getValue(), "**[](*0)**\n" +
-                "\n" +
-                "```\n" +
+        assertEquals(content.getValue(), "```\n" +
                 "public class Test\n" +
                 "extends Object\n" +
                 "```\n" +
diff --git 
a/java/java.platform/src/org/netbeans/modules/java/platform/queries/PlatformJavadocForBinaryQuery.java
 
b/java/java.platform/src/org/netbeans/modules/java/platform/queries/PlatformJavadocForBinaryQuery.java
index 8ec977ace2..39706bcf48 100644
--- 
a/java/java.platform/src/org/netbeans/modules/java/platform/queries/PlatformJavadocForBinaryQuery.java
+++ 
b/java/java.platform/src/org/netbeans/modules/java/platform/queries/PlatformJavadocForBinaryQuery.java
@@ -80,6 +80,11 @@ public class PlatformJavadocForBinaryQuery implements 
JavadocForBinaryQueryImple
                     candidates.add(jp);
                 }
             }
+            for (ClassPath.Entry entry : jp.getSourceFolders().entries()) {
+                if (binaryRoot.equals(entry.getURL())) {
+                    candidates.add(jp);
+                }
+            }
         }
         return candidates.isEmpty() ? null : new R(candidates);
     }
diff --git 
a/java/java.sourceui/src/org/netbeans/api/java/source/ui/ElementJavadoc.java 
b/java/java.sourceui/src/org/netbeans/api/java/source/ui/ElementJavadoc.java
index 6d1df08284..a23ad14caa 100644
--- a/java/java.sourceui/src/org/netbeans/api/java/source/ui/ElementJavadoc.java
+++ b/java/java.sourceui/src/org/netbeans/api/java/source/ui/ElementJavadoc.java
@@ -119,6 +119,7 @@ import javax.tools.SimpleJavaFileObject;
 import com.sun.source.tree.ImportTree;
 import com.sun.source.tree.Tree;
 import com.sun.source.util.JavacTask;
+import javax.lang.model.element.RecordComponentElement;
 import org.netbeans.api.java.queries.SourceLevelQuery;
 import org.netbeans.api.java.queries.SourceLevelQuery.Profile;
 import org.netbeans.api.java.source.ui.snippet.MarkupTagProcessor;
@@ -394,11 +395,15 @@ public class ElementJavadoc {
     public Action getGotoSourceAction() {
         return goToSource;
     }
-    
+
     private ElementJavadoc(CompilationInfo compilationInfo, Element element, 
final URL url, final Callable<Boolean> cancel) {
         this.cpInfo = compilationInfo.getClasspathInfo();
         this.fileObject = compilationInfo.getFileObject();
-        this.handle = element == null ? null : ElementHandle.create(element);
+        ElementHandle<Element> eh = null;
+        try {
+            eh = element == null ? null : ElementHandle.create(element);
+        } catch (IllegalArgumentException iae) {}
+        this.handle = eh;
         this.cancel = cancel;
         this.packageName = 
compilationInfo.getCompilationUnit().getPackageName() != null ? 
compilationInfo.getCompilationUnit().getPackageName().toString()
                                                                                
          : "";
@@ -406,6 +411,10 @@ public class ElementJavadoc {
         this.className = 
compilationInfo.getCompilationUnit().getSourceFile().getName().replaceFirst("[.][^.]+$",
 "");
 
         final StringBuilder header = getElementHeader(element, 
compilationInfo);
+        if (handle == null) {
+            this.content = 
CompletableFuture.completedFuture(header.toString());
+            return;
+        }
         try {
             //Optimisitic no http
             CharSequence doc = getElementDoc(element, compilationInfo, header, 
url, true);
@@ -465,22 +474,35 @@ public class ElementJavadoc {
     private StringBuilder getElementHeader(final Element element, final 
CompilationInfo info) {
         final StringBuilder sb = new StringBuilder();
         if (element != null) {
-            sb.append(getContainingClassOrPackageHeader(element, 
info.getElements(), info.getElementUtilities()));
             switch(element.getKind()) {
                 case METHOD:
                 case CONSTRUCTOR:
+                    sb.append(getContainingClassOrPackageHeader(element, 
info.getElements(), info.getElementUtilities()));
                     sb.append(getMethodHeader((ExecutableElement)element));
                     break;
                 case FIELD:
                 case ENUM_CONSTANT:
+                    sb.append(getContainingClassOrPackageHeader(element, 
info.getElements(), info.getElementUtilities()));
                     sb.append(getFieldHeader((VariableElement)element));
                     break;
+                case RECORD_COMPONENT:
+                    sb.append(getContainingClassOrPackageHeader(element, 
info.getElements(), info.getElementUtilities()));
+                    
sb.append(getRecordComponentHeader((RecordComponentElement)element));
+                    break;
                 case CLASS:
                 case INTERFACE:
                 case ENUM:
                 case ANNOTATION_TYPE:
+                case RECORD:
+                    sb.append(getContainingClassOrPackageHeader(element, 
info.getElements(), info.getElementUtilities()));
                     sb.append(getClassHeader((TypeElement)element));
                     break;
+                case LOCAL_VARIABLE:
+                case PARAMETER:
+                case EXCEPTION_PARAMETER:
+                case RESOURCE_VARIABLE:
+                    sb.append(getFieldHeader((VariableElement)element));
+                    break;
                 case PACKAGE:
                     sb.append(getPackageHeader((PackageElement)element));
                     break;
@@ -494,26 +516,25 @@ public class ElementJavadoc {
     
     private StringBuilder getContainingClassOrPackageHeader(Element el, 
Elements elements, ElementUtilities eu) {
         StringBuilder sb = new StringBuilder();
-        if (el.getKind() != ElementKind.PACKAGE && el.getKind() != 
ElementKind.MODULE) {
-            TypeElement cls = eu.enclosingTypeElement(el);
-            if (cls != null) {
-                switch(cls.getEnclosingElement().getKind()) {
-                    case ANNOTATION_TYPE:
-                    case CLASS:
-                    case ENUM:
-                    case INTERFACE:
-                    case PACKAGE:
-                        sb.append("<font size='+0'><b>"); //NOI18N
-                        createLink(sb, cls, 
makeNameLineBreakable(cls.getQualifiedName().toString()));
-                        sb.append("</b></font>"); //NOI18N)
-                }
-            } else {
-                PackageElement pkg = elements.getPackageOf(el);
-                if (pkg != null) {
+        TypeElement cls = eu.enclosingTypeElement(el);
+        if (cls != null) {
+            switch(cls.getKind()) {
+                case ANNOTATION_TYPE:
+                case CLASS:
+                case ENUM:
+                case INTERFACE:
+                case RECORD:
+                case PACKAGE:
                     sb.append("<font size='+0'><b>"); //NOI18N
-                    createLink(sb, pkg, 
makeNameLineBreakable(pkg.getQualifiedName().toString()));
+                    createLink(sb, cls, 
makeNameLineBreakable(cls.getQualifiedName().toString()));
                     sb.append("</b></font>"); //NOI18N)
-                }
+            }
+        } else {
+            PackageElement pkg = elements.getPackageOf(el);
+            if (pkg != null && !pkg.isUnnamed()) {
+                sb.append("<font size='+0'><b>"); //NOI18N
+                createLink(sb, pkg, 
makeNameLineBreakable(pkg.getQualifiedName().toString()));
+                sb.append("</b></font>"); //NOI18N)
             }
         }
         return sb;
@@ -615,6 +636,18 @@ public class ElementJavadoc {
         sb.append("</pre>"); //NOI18N
         return sb;
     }
+
+    private StringBuilder getRecordComponentHeader(RecordComponentElement 
rcdoc) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("<pre>"); //NOI18N
+        rcdoc.getAnnotationMirrors().forEach((annotationDesc) -> {
+            appendAnnotation(sb, annotationDesc, true);
+        });
+        appendType(sb, rcdoc.asType(), false, false, false);
+        sb.append(" <b>").append(rcdoc.getSimpleName()).append("</b>"); 
//NOI18N
+        sb.append("</pre>"); //NOI18N
+        return sb;
+    }
     
     private StringBuilder getClassHeader(TypeElement cdoc) {
         StringBuilder sb = new StringBuilder();
@@ -628,6 +661,10 @@ public class ElementJavadoc {
                     if (modifier == Modifier.FINAL)
                         continue;
                     break;
+                case RECORD:
+                    if (modifier == Modifier.FINAL || modifier == 
Modifier.STATIC)
+                        continue;
+                    break;
                 case INTERFACE:
                 case ANNOTATION_TYPE:
                     if (modifier == Modifier.ABSTRACT)
@@ -646,6 +683,9 @@ public class ElementJavadoc {
             case INTERFACE:
                 sb.append("interface "); //NOI18N
                 break;
+            case RECORD:
+                sb.append("record "); //NOI18N
+                break;
             default:
                 sb.append("class "); //NOI18N            
         }
@@ -662,7 +702,7 @@ public class ElementJavadoc {
             sb.append("&gt;"); //NOI18N
         }
         sb.append("</b>"); //NOi18N
-        if (cdoc.getKind() != ElementKind.ANNOTATION_TYPE) {
+        if (cdoc.getKind() != ElementKind.ANNOTATION_TYPE && cdoc.getKind() != 
ElementKind.RECORD) {
             TypeMirror supercls = cdoc.getSuperclass();
             if (supercls != null && supercls.getKind() != TypeKind.NONE) {
                 sb.append("<br>extends "); //NOI18N
@@ -689,7 +729,11 @@ public class ElementJavadoc {
         pdoc.getAnnotationMirrors().forEach((annotationDesc) -> {
             appendAnnotation(sb, annotationDesc, true);
         });
-        sb.append("package 
<b>").append(pdoc.getQualifiedName()).append("</b>"); //NOI18N
+        if (pdoc.isUnnamed()) {
+            sb.append("package <b>&lt;unnamed&gt;</b>"); //NOI18N
+        } else {
+            sb.append("package 
<b>").append(pdoc.getQualifiedName()).append("</b>"); //NOI18N
+        }
         sb.append("</pre>"); //NOI18N
         return sb;
     }
@@ -2126,12 +2170,14 @@ public class ElementJavadoc {
             if (docURL == null && goToSource == null) {
                 content.insert(0, "<base href=\"" + fo.toURL() + 
"\"></base>"); //NOI18N
             }
-            goToSource = new AbstractAction() {
-                @Override
-                public void actionPerformed(ActionEvent evt) {
-                    ElementOpen.open(fo, handle);
-                }
-            };
+            if (handle != null) {
+                goToSource = new AbstractAction() {
+                    @Override
+                    public void actionPerformed(ActionEvent evt) {
+                        ElementOpen.open(fo, handle);
+                    }
+                };
+            }
         }
         if (url != null) {
             docURL = url;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to