eclipse-jdt / eclipse.jdt.core

Eclipse Public License 2.0
169 stars 133 forks source link

DefaultCodeFormatter: ArrayIndexOutOfBoundsException in CommentsPreparator. #3372

Open basilevs opened 4 days ago

basilevs commented 4 days ago

Following Java file produces an exception when invoking auto-format (on save or explicitly). The key to reproduce is a missing curly brace, that is properly highlighted as a warning.


/**
 * Wrapper for checked exceptions to be used in API's without checked exceptions
 * support Example:
 * 
 * <pre>
 * {@code
 * interface IWriter {
 *   void write() throws IOException;
 * }
 * 
 * ...
 * 
 * void writeWithErrors() throws IOException {
 *   Stream<IWriter> data = ... ;
 *   try {
 *     data.forEach(CheckedExceptionWrapper.wrapRunnable(IWriter::write));
 *   } catch (CheckedExceptionWrapper e) {
 *     e.rethrow(IOException.class); // Unpacks and throws original IOException
 *     throw e; // Another (not IOException) checked exception happened, can't extract, throw as is. 
 *   }
 * }
 * </pre>
 */
public final class Test2 extends IllegalStateException {

}
eclipse.buildId=4.34.0.20241121-0709
java.version=23.0.1
java.vendor=Eclipse Adoptium
BootLoader constants: OS=macosx, ARCH=aarch64, WS=cocoa, NL=en_GE
Framework arguments:  -product org.eclipse.epp.package.committers.product -keyring /Users/vasiligulevich/.eclipse_keyring
Command-line arguments:  -os macosx -ws cocoa -arch aarch64 -product org.eclipse.epp.package.committers.product -keyring /Users/vasiligulevich/.eclipse_keyring

org.eclipse.e4.ui.workbench
Error
Sat Nov 30 22:22:18 GMT+04:00 2024
Execution exception for: ParameterizedCommand(Command(org.eclipse.jdt.ui.edit.text.java.format,Format,
        Format the selected text,
        Category(org.eclipse.jdt.ui.category.source,Source,Java Source Actions,true),
        WorkbenchHandlerServiceHandler("org.eclipse.jdt.ui.edit.text.java.format"),
        ,,true),null) in 
    context chain: WorkbenchContext -> TrimmedWindowImplContext -> PerspectiveImpl (org.eclipse.pde.ui.PDEPerspective) Context -> PartImpl (org.eclipse.e4.ui.compatibility.editor)  removeOnHide org.eclipse.jdt.ui.CompilationUnitEditorContext

org.eclipse.core.commands.ExecutionException: While executing the action, an exception occurred
    at org.eclipse.jface.commands.ActionHandler.execute(ActionHandler.java:129)
    at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:98)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:299)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:233)
    at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:174)
    at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:165)
    at org.eclipse.core.commands.Command.executeWithChecks(Command.java:488)
    at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:485)
    at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:204)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:308)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:569)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:644)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:439)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:96)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:91)
    at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1219)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4655)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1622)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1645)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1630)
    at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1659)
    at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1655)
    at org.eclipse.swt.widgets.Canvas.sendKeyEvent(Canvas.java:522)
    at org.eclipse.swt.widgets.Control.doCommandBySelector(Control.java:1052)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:6443)
    at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method)
    at org.eclipse.swt.internal.cocoa.NSResponder.interpretKeyEvents(NSResponder.java:59)
    at org.eclipse.swt.widgets.Composite.keyDown(Composite.java:607)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:6289)
    at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
    at org.eclipse.swt.widgets.Widget.callSuper(Widget.java:239)
    at org.eclipse.swt.widgets.Widget.windowSendEvent(Widget.java:2372)
    at org.eclipse.swt.widgets.Shell.windowSendEvent(Shell.java:2502)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:6401)
    at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
    at org.eclipse.swt.widgets.Display.applicationSendEvent(Display.java:5705)
    at org.eclipse.swt.widgets.Display.applicationProc(Display.java:5845)
    at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method)
    at org.eclipse.swt.internal.cocoa.NSApplication.sendEvent(NSApplication.java:117)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4000)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1151)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1042)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
    at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:663)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:570)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:178)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:208)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:143)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:109)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:439)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:271)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:668)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:605)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1481)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 626 out of bounds for length 626
    at org.eclipse.jdt.internal.formatter.CommentsPreparator.addSubstituteWraps(CommentsPreparator.java:1331)
    at org.eclipse.jdt.internal.formatter.CommentsPreparator.endVisit(CommentsPreparator.java:624)
    at org.eclipse.jdt.core.dom.Javadoc.accept0(Javadoc.java:234)
    at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:3312)
    at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.prepareComments(DefaultCodeFormatter.java:426)
    at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.prepareFormattedCode(DefaultCodeFormatter.java:228)
    at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.format(DefaultCodeFormatter.java:183)
    at org.eclipse.jdt.internal.formatter.DefaultCodeFormatter.format(DefaultCodeFormatter.java:167)
    at org.eclipse.jdt.internal.corext.util.CodeFormatterUtil.reformat(CodeFormatterUtil.java:361)
    at org.eclipse.jdt.internal.ui.text.java.JavaFormattingStrategy.format(JavaFormattingStrategy.java:75)
    at org.eclipse.jface.text.formatter.MultiPassContentFormatter.formatMaster(MultiPassContentFormatter.java:197)
    at org.eclipse.jface.text.formatter.MultiPassContentFormatter.format(MultiPassContentFormatter.java:143)
    at org.eclipse.jface.text.source.SourceViewer.doOperation(SourceViewer.java:1045)
    at org.eclipse.jface.text.source.projection.ProjectionViewer.doOperation(ProjectionViewer.java:1468)
    at org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer.doOperation(JavaSourceViewer.java:164)
    at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor$AdaptedSourceViewer.doOperation(CompilationUnitEditor.java:206)
    at org.eclipse.ui.texteditor.TextOperationAction.lambda$0(TextOperationAction.java:130)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67)
    at org.eclipse.ui.texteditor.TextOperationAction.run(TextOperationAction.java:130)
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:474)
    at org.eclipse.jface.commands.ActionHandler.execute(ActionHandler.java:124)
    ... 61 more

Environment: Eclipse for Commiters Version: 2024-12 RC1 (4.34.0 RC1) Build id: 20241121-0709 org.eclipse.jdt.core 3.40.0.v20241113-1039

jukzi commented 2 days ago

@mateusz-matela Looks like the code is from you, can you take a look?