netbeans icon indicating copy to clipboard operation
netbeans copied to clipboard

Convert to text block hint does not work inside Annotations

Open adparts opened this issue 1 year ago • 1 comments

Apache NetBeans version

Apache NetBeans 22

What happened

Clicking this code hint: image

Does not change anything in the editor. This hint does not work when the string is the Annotation default value.

Language / Project Type / NetBeans Component

No response

How to reproduce

Use this (nonsense) code and click the convert to text block hint:

    @SuppressWarnings("This is an example\n"
            + "that does not work\n"
            + "converting to a text block")
    public static void main(String[] args) {

    }

Did this work correctly in an earlier version?

No / Don't know

Operating System

Fedora Core 40

JDK

21

Apache NetBeans packaging

Apache NetBeans Snap Package

Anything else

No response

Are you willing to submit a pull request?

No

adparts avatar Aug 07 '24 16:08 adparts

javac is likely inserting "value =" as synthetic tree which causes trouble in the diff.

java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 24
	at org.netbeans.modules.java.source.pretty.CharBuffer.append0(CharBuffer.java:110)
	at org.netbeans.modules.java.source.pretty.CharBuffer.append(CharBuffer.java:128)
	at org.netbeans.modules.java.source.pretty.VeryPretty.print(VeryPretty.java:265)
	at org.netbeans.modules.java.source.pretty.VeryPretty.visitLiteral(VeryPretty.java:1907)
	at com.sun.tools.javac.tree.JCTree$JCLiteral.accept(JCTree.java:2732)
	at org.netbeans.modules.java.source.pretty.VeryPretty.doAccept(VeryPretty.java:415)
	at org.netbeans.modules.java.source.pretty.VeryPretty.print(VeryPretty.java:284)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl0(CasualDiff.java:5552)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl(CasualDiff.java:5500)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5427)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5398)
	at org.netbeans.modules.java.source.save.CasualDiff.diffAssign(CasualDiff.java:2606)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl0(CasualDiff.java:5690)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTreeImpl(CasualDiff.java:5500)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5427)
	at org.netbeans.modules.java.source.save.CasualDiff.diffTree(CasualDiff.java:5410)
	at org.netbeans.modules.java.source.save.CasualDiff.diff(CasualDiff.java:353)
	at org.netbeans.api.java.source.WorkingCopy.processCurrentCompilationUnit(WorkingCopy.java:907)
	at org.netbeans.api.java.source.WorkingCopy.getChanges(WorkingCopy.java:1321)
	at org.netbeans.api.java.source.JavaSource$1.run(JavaSource.java:672)
	at org.netbeans.api.java.source.JavaSource$1.run(JavaSource.java:661)
	at org.netbeans.api.java.source.JavaSource$MultiTask.run(JavaSource.java:504)
	at org.netbeans.modules.parsing.impl.TaskProcessor.callUserTask(TaskProcessor.java:586)
	at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:197)
	at org.netbeans.modules.parsing.api.ParserManager$UserTaskAction.run(ParserManager.java:180)
	at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:181)
	at org.netbeans.modules.parsing.impl.TaskProcessor$2.call(TaskProcessor.java:178)
	at org.netbeans.modules.masterfs.filebasedfs.utils.FileChangedManager.priorityIO(FileChangedManager.java:153)
	at org.netbeans.modules.masterfs.providers.ProvidedExtensions.priorityIO(ProvidedExtensions.java:335)
	at org.netbeans.modules.parsing.nb.DataObjectEnvFactory.runPriorityIO(DataObjectEnvFactory.java:118)
	at org.netbeans.modules.parsing.impl.Utilities.runPriorityIO(Utilities.java:67)
	at org.netbeans.modules.parsing.impl.TaskProcessor.runUserTask(TaskProcessor.java:178)
	at org.netbeans.modules.parsing.api.ParserManager.parse(ParserManager.java:83)
	at org.netbeans.api.java.source.JavaSource.runUserActionTaskImpl(JavaSource.java:454)
	at org.netbeans.api.java.source.JavaSource.runUserActionTask(JavaSource.java:425)
	at org.netbeans.api.java.source.JavaSource.runModificationTask(JavaSource.java:680)
	at org.netbeans.modules.java.hints.spiimpl.JavaFixImpl.implement(JavaFixImpl.java:73)
[catch] at org.netbeans.modules.editor.hints.HintsUI$1.run(HintsUI.java:810)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1403)
	at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
	at org.openide.util.lookup.Lookups.executeWith(Lookups.java:287)
	at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2018)

I checked where the -1 was coming from and its from here:

	at org.netbeans.modules.java.source.pretty.CharBuffer.trimTo(CharBuffer.java:214)
	at org.netbeans.modules.java.source.pretty.CharBuffer.eatAwayChars(CharBuffer.java:263)
	at org.netbeans.modules.java.source.pretty.VeryPretty.eatChars(VeryPretty.java:2931)
	at org.netbeans.modules.java.source.save.CasualDiff.copyTo(CasualDiff.java:6171)
	at org.netbeans.modules.java.source.save.CasualDiff.copyTo(CasualDiff.java:6155)
	at org.netbeans.modules.java.source.save.CasualDiff.diffAssign(CasualDiff.java:2605)

which brings us to this: https://github.com/apache/netbeans/blob/8cab2aeccdae1386d0383ac8eec91c8f9f3edbaa/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java#L6163-L6171

and further down the stack: https://github.com/apache/netbeans/blob/8cab2aeccdae1386d0383ac8eec91c8f9f3edbaa/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java#L2587-L2605

unfortunately I don't have a lot of experience in this area, but this looks like to be the cause for it. cc @lahodaj

mbien avatar Oct 09 '24 07:10 mbien