Skip to content

Commit 23babec

Browse files
authored
When referring to record constructor use type Javadoc if none exists (#3084)
- modify JavadocHover.internalGetHoverInfo() to check when there is a single JavaElement that is a record constructor that has no Javadoc and in that case get hover info for the parent record type - add new tests to JavadocHoverTests - fixes #2832
1 parent 6ff7d81 commit 23babec

2 files changed

Lines changed: 104 additions & 2 deletions

File tree

org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/hover/JavadocHoverTests.java

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.eclipse.jdt.core.IField;
4545
import org.eclipse.jdt.core.IJavaElement;
4646
import org.eclipse.jdt.core.IJavaProject;
47+
import org.eclipse.jdt.core.IMethod;
4748
import org.eclipse.jdt.core.ISourceRange;
4849
import org.eclipse.jdt.core.ISourceReference;
4950
import org.eclipse.jdt.core.IType;
@@ -370,6 +371,99 @@ record FooBar(String foo, String bar) {}
370371
}
371372
}
372373

374+
@Test
375+
public void testRecordConstructor1() throws Exception {
376+
// https://github.com/eclipse-jdt/eclipse.jdt.ui/issues/931
377+
String source=
378+
"""
379+
package p;
380+
public class X {}
381+
/**
382+
* A foo bar.
383+
* @param foo The foo.
384+
* @param bar The bar.
385+
*/
386+
record FooBar(String foo, String bar) {
387+
public FooBar {
388+
if (foo == null) {
389+
foo = "abc";
390+
}
391+
}
392+
}
393+
""";
394+
ICompilationUnit cu= getWorkingCopy("/TestSetupProject/src/p/X.java", source, null);
395+
assertNotNull("TestClass.java", cu);
396+
397+
IType recordType= cu.getType("FooBar");
398+
boolean found= false;
399+
for (IJavaElement member : recordType.getChildren()) {
400+
if (member.getElementName().equals("FooBar")) {
401+
assertTrue("not a constructor", member instanceof IMethod method && method.isConstructor());
402+
found= true;
403+
IJavaElement[] elements= { member };
404+
ISourceRange range= ((ISourceReference) member).getNameRange();
405+
// copy logic from JavadocHover
406+
if (elements.length == 1 && elements[0] instanceof IMethod method && method.isConstructor()
407+
&& method.getJavadocRange() == null && method.getParent() instanceof IType type && type.isRecord()) {
408+
elements[0]= method.getParent();
409+
}
410+
JavadocBrowserInformationControlInput hoverInfo= JavadocHover.getHoverInfo(elements, cu, new Region(range.getOffset(), range.getLength()), null);
411+
String actualHtmlContent= hoverInfo.getHtml();
412+
int index= actualHtmlContent.indexOf("A foo bar.");
413+
assertNotEquals("Expected HTML not found, instead found : " + actualHtmlContent, -1, index);
414+
}
415+
}
416+
assertTrue("constructor not found", found);
417+
}
418+
419+
@Test
420+
public void testRecordConstructor2() throws Exception {
421+
// https://github.com/eclipse-jdt/eclipse.jdt.ui/issues/931
422+
String source=
423+
"""
424+
package p;
425+
public class X {}
426+
/**
427+
* A foo bar.
428+
* @param foo The foo.
429+
* @param bar The bar.
430+
*/
431+
record FooBar(String foo, String bar) {
432+
/**
433+
* Foobar constructor
434+
*/
435+
public FooBar {
436+
if (foo == null) {
437+
foo = "abc";
438+
}
439+
}
440+
}
441+
""";
442+
ICompilationUnit cu= getWorkingCopy("/TestSetupProject/src/p/X.java", source, null);
443+
assertNotNull("TestClass.java", cu);
444+
445+
IType recordType= cu.getType("FooBar");
446+
boolean found= false;
447+
for (IJavaElement member : recordType.getChildren()) {
448+
if (member.getElementName().equals("FooBar")) {
449+
assertTrue("not a constructor", member instanceof IMethod method && method.isConstructor());
450+
found= true;
451+
IJavaElement[] elements= { member };
452+
ISourceRange range= ((ISourceReference) member).getNameRange();
453+
// copy logic from JavadocHover
454+
if (elements.length == 1 && elements[0] instanceof IMethod method && method.isConstructor()
455+
&& method.getJavadocRange() == null && method.getParent() instanceof IType type && type.isRecord()) {
456+
elements[0]= method.getParent();
457+
}
458+
JavadocBrowserInformationControlInput hoverInfo= JavadocHover.getHoverInfo(elements, cu, new Region(range.getOffset(), range.getLength()), null);
459+
String actualHtmlContent= hoverInfo.getHtml();
460+
int index= actualHtmlContent.indexOf("Foobar constructor");
461+
assertNotEquals("Expected HTML not found, instead found : " + actualHtmlContent, -1, index);
462+
}
463+
}
464+
assertTrue("constructor not found", found);
465+
}
466+
373467
@Test
374468
public void testLinkTagWithHttp_01() throws Exception {
375469
String source=

org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/JavadocHover.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2024 IBM Corporation and others.
2+
* Copyright (c) 2000, 2026 IBM Corporation and others.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the Eclipse Public License 2.0
@@ -89,6 +89,7 @@
8989
import org.eclipse.jdt.core.IPackageFragment;
9090
import org.eclipse.jdt.core.IPackageFragmentRoot;
9191
import org.eclipse.jdt.core.ISourceReference;
92+
import org.eclipse.jdt.core.IType;
9293
import org.eclipse.jdt.core.ITypeParameter;
9394
import org.eclipse.jdt.core.ITypeRoot;
9495
import org.eclipse.jdt.core.JavaCore;
@@ -708,7 +709,14 @@ private JavadocBrowserInformationControlInput internalGetHoverInfo(ITextViewer t
708709
IJavaElement[] elements= JavaCore.callReadOnly(() -> getJavaElementsAt(textViewer, hoverRegion));
709710
if (elements == null || elements.length == 0)
710711
return null;
711-
712+
try {
713+
if (elements.length == 1 && elements[0] instanceof IMethod method && method.isConstructor()
714+
&& method.getJavadocRange() == null && method.getParent() instanceof IType type && type.isRecord()) {
715+
elements[0]= method.getParent();
716+
}
717+
} catch (JavaModelException e) {
718+
// do nothing
719+
}
712720
return getHoverInfo(elements, getEditorInputJavaElement(), hoverRegion, null);
713721
}
714722

0 commit comments

Comments
 (0)