| Summary: | [editor][quick outline] PatternSyntaxException when typing '(' or ')' | ||||||
|---|---|---|---|---|---|---|---|
| Product: | [Modeling] TMF | Reporter: | Knut Wannheden <knut.wannheden> | ||||
| Component: | Xtext | Assignee: | Jan Koehnlein <jan> | ||||
| Status: | CLOSED FIXED | QA Contact: | |||||
| Severity: | minor | ||||||
| Priority: | P3 | CC: | jan | ||||
| Version: | 2.0.0 | Flags: | jan:
indigo+
|
||||
| Target Milestone: | SR2 | ||||||
| Hardware: | All | ||||||
| OS: | All | ||||||
| Whiteboard: | |||||||
| Attachments: |
|
||||||
I'd vote for Pattern#quote() 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. 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 }. Re-assigning to Jan for review. Looks good. I deprivatized some methods, too. Thanks for the patch. Pushed to MASTER. Closing all bugs that were set to RESOLVED before Neon.0 Closing all bugs that were set to RESOLVED before Neon.0 |
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)