IDEA-363069 javadoc: render values with a format string

#IDEA-363069 Fixed

GitOrigin-RevId: 4291e202aa89da6e41caaa62b2ecda2e89cb2dbc
This commit is contained in:
Louis Vignier
2026-02-17 00:08:34 +00:00
committed by intellij-monorepo-bot
parent 301e2ad923
commit 2c816a5f35
5 changed files with 17 additions and 2 deletions
@@ -124,6 +124,7 @@ import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.PsiWildcardType;
import com.intellij.psi.SyntaxTraverser;
import com.intellij.psi.impl.JavaConstantExpressionEvaluator;
import com.intellij.psi.impl.source.javadoc.PsiDocFormatString;
import com.intellij.psi.impl.source.javadoc.PsiDocMethodOrFieldRef;
import com.intellij.psi.impl.source.javadoc.PsiSnippetDocTagImpl;
import com.intellij.psi.impl.source.tree.ElementType;
@@ -2429,6 +2430,7 @@ public class JavaDocInfoGenerator {
private void generateValueValue(PsiInlineDocTag tag, StringBuilder buffer, PsiElement element) {
String text = getRefText(tag.getDataElements());
PsiDocFormatString formatString = PsiTreeUtil.findChildOfType(element, PsiDocFormatString.class);
PsiField valueField = null;
if (text.isEmpty()) {
if (myElement instanceof PsiField) valueField = (PsiField)myElement;
@@ -2453,11 +2455,16 @@ public class JavaDocInfoGenerator {
if (valueField != null) {
PsiExpression initializer = valueField.getInitializer();
value = DumbService.isDumb(myProject) ? null : JavaConstantExpressionEvaluator.computeConstantExpression(initializer, false);
if (formatString != null) {
value = String.format(formatString.getText(), value);
}
else if (value instanceof String) {
value = '"' + value.toString() + '"';
}
}
if (value != null) {
String valueText = StringUtil.escapeXmlEntities(value.toString());
if (value instanceof String) valueText = '"' + valueText + '"';
if (valueField.equals(myElement)) {
buffer.append(valueText); // don't generate link to itself
}
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class="bottom"><icon src="AllIcons.Nodes.Class">&nbsp;<a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></div><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span></pre></div><div class='content'> The value of B is <a href="psi_element://A#B">"a&lt;b"</a>. </div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class="bottom"><icon src="AllIcons.Nodes.Class">&nbsp;<a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></div><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span></pre></div><div class='content'> The value of B is <a href="psi_element://A#B">&quot;a&lt;b&quot;</a>. </div><table class='sections'></table>
@@ -0,0 +1 @@
<html><head><base href="placeholder"></head><body><div class="bottom"><icon src="AllIcons.Nodes.Class">&nbsp;<a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></div><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span></pre></div><div class='content'> The value of PI is <a href="psi_element://A#PI">3.142</a>. </div><table class='sections'></table>
@@ -0,0 +1,6 @@
class A {
public static double PI = 3.14159;
/** The value of PI is {@value %.3f #PI}. */
public static void JAVADOC_ME() { someCode(); }
}
@@ -92,6 +92,7 @@ public class JavaDocInfoGeneratorTest extends JavaCodeInsightTestCase {
public void testFieldValue() { doTestField(); }
public void testValueInMethod() { doTestMethod(); }
public void testValueInMethodNoHash() { doTestMethod(); }
public void testValueWithFormat() { doTestMethod(); }
public void testEscapingStringValue() { doTestMethod(); }
public void testIdeadev2326() { doTestMethod(); }
public void testMethodTypeParameter() { doTestMethod(); }