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.​Test.​R</a></b></font>", toolTip);
+ assertEquals("<html><body><base href=\"FILE\"></base><font
size='+0'><b><a href='*0'>test.​Test.​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.​Test</a></b></font>", toolTip);
+ assertEquals("<html><body><base href=\"FILE\"></base><font
size='+0'><b><a href='*0'>test.​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(">"); //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><unnamed></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