Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 346837

Summary: [editor][quick outline] PatternSyntaxException when typing '(' or ')'
Product: [Modeling] TMF Reporter: Knut Wannheden <knut.wannheden>
Component: XtextAssignee: Jan Koehnlein <jan>
Status: CLOSED FIXED QA Contact:
Severity: minor    
Priority: P3 CC: jan
Version: 2.0.0Flags: jan: indigo+
Target Milestone: SR2   
Hardware: All   
OS: All   
Whiteboard:
Attachments:
Description Flags
Fixe for bug 346837 sven.efftinge: iplog+

Description Knut Wannheden CLA 2011-05-23 05:14:40 EDT
When typing a character like '(' or ')' in the quick outline filter an exception is logged (see below) and the quick outline becomes unusable; i.e. it must be closed as changing the filter string has no effect and none of the nodes in the tree can be selected anymore.

Unfortunately org.eclipse.jdt.internal.ui.util.StringMatcher from JDT is internal. It could be copied (as was done for the CVS team provider) or we could fix our code (e.g. use Pattern#quote() in addition to String#replaceAll()).

java.util.regex.PatternSyntaxException: Unclosed group near index 3
(.*
   ^
	at java.util.regex.Pattern.error(Unknown Source)
	at java.util.regex.Pattern.accept(Unknown Source)
	at java.util.regex.Pattern.group0(Unknown Source)
	at java.util.regex.Pattern.sequence(Unknown Source)
	at java.util.regex.Pattern.expr(Unknown Source)
	at java.util.regex.Pattern.compile(Unknown Source)
	at java.util.regex.Pattern.<init>(Unknown Source)
	at java.util.regex.Pattern.compile(Unknown Source)
	at org.eclipse.xtext.ui.editor.outline.quickoutline.StringMatcher.getPattern(StringMatcher.java:35)
	at org.eclipse.xtext.ui.editor.outline.quickoutline.StringMatcher.match(StringMatcher.java:45)
	at org.eclipse.xtext.ui.editor.outline.quickoutline.QuickOutlinePopup$NamePatternFilter.select(QuickOutlinePopup.java:73)
	at org.eclipse.jface.viewers.ViewerFilter.filter(ViewerFilter.java:51)
	at org.eclipse.jface.viewers.StructuredViewer.getFilteredChildren(StructuredViewer.java:900)
	at org.eclipse.jface.viewers.AbstractTreeViewer.getSortedChildren(AbstractTreeViewer.java:601)
	at org.eclipse.jface.viewers.AbstractTreeViewer.updateChildren(AbstractTreeViewer.java:2581)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1867)
	at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:721)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1842)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1799)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1785)
	at org.eclipse.jface.viewers.StructuredViewer$7.run(StructuredViewer.java:1487)
	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1422)
	at org.eclipse.jface.viewers.TreeViewer.preservingSelection(TreeViewer.java:403)
	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1383)
	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1485)
	at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:537)
	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1444)
	at org.eclipse.xtext.ui.editor.outline.quickoutline.QuickOutlinePopup.stringMatcherUpdated(QuickOutlinePopup.java:248)
	at org.eclipse.xtext.ui.editor.outline.quickoutline.QuickOutlinePopup.setMatcherString(QuickOutlinePopup.java:242)
	at org.eclipse.xtext.ui.editor.outline.quickoutline.QuickOutlinePopup$5.modifyText(QuickOutlinePopup.java:220)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:173)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1058)
	at org.eclipse.swt.widgets.Text.wmCommandChild(Text.java:2526)
	at org.eclipse.swt.widgets.Control.WM_COMMAND(Control.java:4299)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4165)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
	at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method)
	at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2362)
	at org.eclipse.swt.widgets.Text.callWindowProc(Text.java:255)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4253)
	at org.eclipse.swt.widgets.Text.windowProc(Text.java:2170)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
	at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2459)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3655)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:620)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:575)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1408)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1384)
Comment 1 Jan Koehnlein CLA 2011-05-23 05:36:55 EDT
I'd vote for Pattern#quote()
Comment 2 Peter Friese CLA 2011-07-11 14:09:17 EDT
The problem with Pattern.quote() is that the entire pattern gets quoted, thus eliminating the entire pattern. I suggest to escape the other braces as well. A test showed that this should suffice for the situations mentioned above.
Comment 3 Peter Friese CLA 2011-07-11 14:12:46 EDT
Created attachment 199436 [details]
Fixe for bug 346837

The patch contains a test class for the cases mentioned in this bug (opening and closing braces, brackets and curlies) as well as some more "normal" situations. The fix works by escaping all braces, i.e. (, ), [, ], { and }.
Comment 4 Peter Friese CLA 2011-07-15 04:22:15 EDT
Re-assigning to Jan for review.
Comment 5 Jan Koehnlein CLA 2011-09-12 09:39:22 EDT
Looks good. I deprivatized some methods, too. Thanks for the patch. Pushed to MASTER.
Comment 6 Karsten Thoms CLA 2017-09-19 17:28:49 EDT
Closing all bugs that were set to RESOLVED before Neon.0
Comment 7 Karsten Thoms CLA 2017-09-19 17:39:57 EDT
Closing all bugs that were set to RESOLVED before Neon.0