Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 346837 - [editor][quick outline] PatternSyntaxException when typing '(' or ')'
Summary: [editor][quick outline] PatternSyntaxException when typing '(' or ')'
Status: CLOSED FIXED
Alias: None
Product: TMF
Classification: Modeling
Component: Xtext (show other bugs)
Version: 2.0.0   Edit
Hardware: All All
: P3 minor (vote)
Target Milestone: SR2   Edit
Assignee: Jan Koehnlein CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-05-23 05:14 EDT by Knut Wannheden CLA
Modified: 2017-09-19 17:39 EDT (History)
1 user (show)

See Also:
jan: indigo+


Attachments
Fixe for bug 346837 (4.12 KB, patch)
2011-07-11 14:12 EDT, Peter Friese CLA
sven.efftinge: iplog+
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
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