eclipse-lsp4e / eclipse-lsp4e/lsp4e

LSSymbolsContentProvider populating the outline view freezes UI for minutes for large files.

Open
#703 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
85
Forks
69
Avg merge
8h 33m
Merged PRs (30d)
6

Description

Opening large json files results in UI freezes sometimes lasting for minutes caused by the org.eclipse.lsp4e.outline.LSSymbolsContentProvider. Maybe the number of items populated to the outline should limited or not all items should be added at the same time.

"main" #1 prio=6 os_prio=0 cpu=77390.62ms elapsed=1488.10s tid=0x000002b98cb78d70 nid=0x817c runnable  [0x000000ce59afc000]
   java.lang.Thread.State: RUNNABLE
        at org.eclipse.swt.internal.win32.OS.CallWindowProc(Native Method)
        at org.eclipse.swt.widgets.Tree.callWindowProc(Tree.java:1576)
        at org.eclipse.swt.widgets.Control.windowProc(Control.java:4844)
        at org.eclipse.swt.widgets.Tree.windowProc(Tree.java:6142)
        at org.eclipse.swt.widgets.Display.windowProc(Display.java:5022)
        at org.eclipse.swt.internal.win32.OS.SendMessage(Native Method)
        at org.eclipse.swt.widgets.Tree.createItem(Tree.java:2129)
        at org.eclipse.swt.widgets.TreeItem.<init>(TreeItem.java:180)
        at org.eclipse.swt.widgets.TreeItem.<init>(TreeItem.java:86)
        at org.eclipse.jface.viewers.TreeViewer.createNewRowPart(TreeViewer.java:767)
        at org.eclipse.jface.viewers.TreeViewer.newItem(TreeViewer.java:279)
        at org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:863)
        at org.eclipse.jface.viewers.AbstractTreeViewer.updateChildren(AbstractTreeViewer.java:2813)
        at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1971)
        at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:684)
        at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1947)
        at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1904)
        at org.eclipse.ui.navigator.CommonViewer.internalRefresh(CommonViewer.java:532)
        at org.eclipse.jface.viewers.StructuredViewer.lambda$3(StructuredViewer.java:1482)
        at org.eclipse.jface.viewers.StructuredViewer$$Lambda$484/0x0000000800604c98.run(Unknown Source)
        at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1398)
        at org.eclipse.jface.viewers.TreeViewer.preservingSelection(TreeViewer.java:365)
        at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1359)
        at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1482)
        at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:538)
        at org.eclipse.ui.navigator.CommonViewer.refresh(CommonViewer.java:352)
        at org.eclipse.ui.navigator.CommonViewer.refresh(CommonViewer.java:495)
        at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1418)
        at org.eclipse.lsp4e.outline.LSSymbolsContentProvider.lambda$3(LSSymbolsContentProvider.java:335)
        at org.eclipse.lsp4e.outline.LSSymbolsContentProvider$$Lambda$1460/0x0000000800be3058.run(Unknown Source)
        at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
        at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:132)
        - locked <0x000000077eef7980> (a org.eclipse.swt.widgets.RunnableLock)
        at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4029)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3645)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046)
        at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
        at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:643)
        at org.eclipse.ui.internal.Workbench$$Lambda$183/0x00000008002aea58.run(Unknown Source)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
        at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:550)
        at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:171)
        at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)
        at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@17.0.6/Native Method)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@17.0.6/NativeMethodAccessorImpl.java:77)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@17.0.6/DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(java.base@17.0.6/Method.java:568)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1467)
        at org.eclipse.equinox.launcher.Main.main(Main.java:1440)

   Locked ownable synchronizers:
        - None

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at org.eclipse.lsp4e.outline.LSSymbolsContentProvider, especially the refresh path reported at line 335, and compare it with the SWT/JFace stack trace in the issue. Reproduce with a large JSON file and inspect how outline items are populated. Done means the outline no longer freezes the UI for minutes while retaining useful large-file behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
desktop, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.