Home » Modeling » TMF (Xtext) » How to execute two different types of resolution in same unit of work?
How to execute two different types of resolution in same unit of work? [message #959108] |
Fri, 26 October 2012 13:06 |
Cristiano Gavião Messages: 279 Registered: July 2009 |
Senior Member |
|
|
Hi,
I'm trying to create a quickfix that does two different types of changes in same unit of work. One is based in semantic and the other based in the offset.
I follow the DefaultQuickfixProvider's createLinkingIssueResolutions method, but using a xtextDocument.modify(new IUnitOfWork.Void<XtextResource>() instead.
I tried something like the code below. I use the ISemanticModification to add the offset change :
public void createQualifiedNameIssueResolutions(final Issue issue,
final IssueResolutionAcceptor issueResolutionAcceptor) {
final IModificationContext modificationContext = getModificationContextFactory()
.createModificationContext(issue);
final IXtextDocument xtextDocument = modificationContext
.getXtextDocument();
if (xtextDocument == null)
return;
xtextDocument.modify(new IUnitOfWork.Void<XtextResource>() {
@Override
public void process(XtextResource state) throws Exception {
EObject target = state.getEObject(issue.getUriToProblem()
.fragment());
EReference reference = getUnresolvedEReference(issue, target);
if (reference == null)
return;
String issueString = xtextDocument.get(issue.getOffset(),
issue.getLength());
String simpleName = getQualifiedNameConverter()
.toQualifiedName(issueString).getLastSegment()
.toString();
createImportResolution(target, issueString, issue,
issueResolutionAcceptor, issueString, simpleName);
}
});
}
protected void createImportResolution(final EObject target,
final String issueString, final Issue issue,
final IssueResolutionAcceptor issueResolutionAcceptor,
final String importText, final String simpleName) {
issueResolutionAcceptor.accept(issue, label, description,
null, new ISemanticModification() {
public void apply(EObject element,IModificationContext context) throws Exception {
IXtextDocument xtextDocument = context.getXtextDocument();
xtextDocument.replace(issue.getOffset(),issue.getLength(), simpleName);
ComponentTemplateLibrary library = EcoreUtil2.getContainerOfType(
element, ComponentTemplateLibrary.class);
Import importobj = ComponentTemplateLibraryDslFactory.eINSTANCE.createImport();
IJvmTypeProvider typeProvider = typeProviderFactory.findOrCreateTypeProvider(library.eResource().getResourceSet());
JvmType jvmType = typeProvider.findTypeByName(importText); importobj.setImportedType(jvmType); library.getImports().add(importobj);
}
}
});
With the two change I'm getting the error below. When I comment one of the two changes, the execution for both is normal.
!STACK 0
org.eclipse.emf.common.util.WrappedException: java.lang.RuntimeException: org.eclipse.text.edits.MalformedTreeException: End position lies outside document range
at org.eclipse.xtext.ui.editor.quickfix.IssueResolution.apply(IssueResolution.java:82)
at org.eclipse.xtext.ui.editor.quickfix.QuickAssistCompletionProposal.apply(QuickAssistCompletionProposal.java:32)
at org.eclipse.xtext.ui.editor.hover.AnnotationWithQuickFixesHover$AnnotationInformationControl.apply(AnnotationWithQuickFixesHover.java:525)
at org.eclipse.xtext.ui.editor.hover.AnnotationWithQuickFixesHover$AnnotationInformationControl.access$2(AnnotationWithQuickFixesHover.java:502)
at org.eclipse.xtext.ui.editor.hover.AnnotationWithQuickFixesHover$AnnotationInformationControl$5.widgetSelected(AnnotationWithQuickFixesHover.java:496)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4134)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1458)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1481)
at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1531)
at org.eclipse.swt.widgets.Link.textView_clickOnLink_atIndex(Link.java:117)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:5807)
at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
at org.eclipse.swt.widgets.Widget.callSuper(Widget.java:221)
at org.eclipse.swt.widgets.Widget.mouseDownSuper(Widget.java:1093)
at org.eclipse.swt.widgets.Widget.mouseDown(Widget.java:1085)
at org.eclipse.swt.widgets.Control.mouseDown(Control.java:2538)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:5493)
at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
at org.eclipse.swt.widgets.Widget.callSuper(Widget.java:221)
at org.eclipse.swt.widgets.Widget.windowSendEvent(Widget.java:2102)
at org.eclipse.swt.widgets.Shell.windowSendEvent(Shell.java:2299)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:5557)
at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
at org.eclipse.swt.widgets.Display.applicationSendEvent(Display.java:5002)
at org.eclipse.swt.widgets.Display.applicationProc(Display.java:5151)
at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method)
at org.eclipse.swt.internal.cocoa.NSApplication.sendEvent(NSApplication.java:128)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3616)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1029)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:923)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
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:353)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
at org.eclipse.equinox.launcher.Main.main(Main.java:1414)
Caused by: java.lang.RuntimeException: org.eclipse.text.edits.MalformedTreeException: End position lies outside document range
at org.eclipse.xtext.ui.editor.model.edit.ReconcilingUnitOfWork.exec(ReconcilingUnitOfWork.java:46)
at org.eclipse.xtext.ui.editor.model.edit.ReconcilingUnitOfWork.exec(ReconcilingUnitOfWork.java:1)
at org.eclipse.xtext.util.concurrent.AbstractReadWriteAcces.modify(AbstractReadWriteAcces.java:49)
at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.modify(XtextDocument.java:181)
at org.eclipse.xtext.ui.editor.model.XtextDocument.internalModify(XtextDocument.java:90)
at org.eclipse.xtext.ui.editor.model.XtextDocument.modify(XtextDocument.java:83)
at org.eclipse.xtext.ui.editor.model.edit.SemanticModificationWrapper.apply(SemanticModificationWrapper.java:31)
at org.eclipse.xtext.ui.editor.quickfix.IssueResolution.apply(IssueResolution.java:80)
... 51 more
Caused by: org.eclipse.text.edits.MalformedTreeException: End position lies outside document range
at org.eclipse.text.edits.TextEditProcessor.checkIntegrityDo(TextEditProcessor.java:178)
at org.eclipse.text.edits.TextEdit.dispatchCheckIntegrity(TextEdit.java:743)
at org.eclipse.text.edits.TextEditProcessor.performEdits(TextEditProcessor.java:151)
at org.eclipse.text.edits.TextEdit.apply(TextEdit.java:711)
at org.eclipse.text.edits.TextEdit.apply(TextEdit.java:735)
at org.eclipse.xtext.ui.editor.model.edit.ReconcilingUnitOfWork.exec(ReconcilingUnitOfWork.java:42)
... 58 more
Could someone point me how could I accomplish this?
thanks
Cristiano
|
|
|
Re: How to execute two different types of resolution in same unit of work? [message #960505 is a reply to message #959108] |
Sat, 27 October 2012 14:47 |
Sebastian Zarnekow Messages: 3118 Registered: July 2009 |
Senior Member |
|
|
Cristiano,
that's not possible. You have to perform the complete changes in one and
the same way, e.g. everything based on the text or everything based on
the semantic model. Otherwise the produced text edits will not be in sync.
Regards,
Sebastian
--
Looking for professional support for Xtext, Xtend or Eclipse Modeling?
Go visit: http://xtext.itemis.com
Am 26.10.12 15:06, schrieb Cristiano Gaviao:
> Hi,
>
> I'm trying to create a quickfix that does two different types of changes
> in same unit of work. One is based in semantic and the other based in
> the offset.
>
> I follow the DefaultQuickfixProvider's createLinkingIssueResolutions
> method, but using a xtextDocument.modify(new
> IUnitOfWork.Void<XtextResource>() instead. I tried something like the
> code below. I use the ISemanticModification to add the offset change :
>
> public void createQualifiedNameIssueResolutions(final Issue issue,
> final IssueResolutionAcceptor issueResolutionAcceptor) {
> final IModificationContext modificationContext =
> getModificationContextFactory()
> .createModificationContext(issue);
> final IXtextDocument xtextDocument = modificationContext
> .getXtextDocument();
> if (xtextDocument == null)
> return;
> xtextDocument.modify(new IUnitOfWork.Void<XtextResource>() {
> @Override
> public void process(XtextResource state) throws Exception {
> EObject target = state.getEObject(issue.getUriToProblem()
> .fragment());
> EReference reference = getUnresolvedEReference(issue, target);
> if (reference == null)
> return;
> String issueString = xtextDocument.get(issue.getOffset(),
> issue.getLength());
> String simpleName = getQualifiedNameConverter()
> .toQualifiedName(issueString).getLastSegment()
> .toString();
> createImportResolution(target, issueString, issue,
> issueResolutionAcceptor, issueString, simpleName);
> }
> });
> }
>
>
>
> protected void createImportResolution(final EObject target,
> final String issueString, final Issue issue,
> final IssueResolutionAcceptor issueResolutionAcceptor,
> final String importText, final String simpleName) {
> issueResolutionAcceptor.accept(issue, label, description,
> null, new ISemanticModification() {
>
> public void apply(EObject element,IModificationContext context) throws
> Exception {
> IXtextDocument xtextDocument = context.getXtextDocument();
> xtextDocument.replace(issue.getOffset(),issue.getLength(), simpleName);
> ComponentTemplateLibrary library = EcoreUtil2.getContainerOfType(
> element, ComponentTemplateLibrary.class);
> Import importobj =
> ComponentTemplateLibraryDslFactory.eINSTANCE.createImport();
>
> IJvmTypeProvider typeProvider =
> typeProviderFactory.findOrCreateTypeProvider(library.eResource().getResourceSet());
>
> JvmType jvmType = typeProvider.findTypeByName(importText);
> importobj.setImportedType(jvmType);
> library.getImports().add(importobj);
> }
> }
> });
>
>
>
> With the two change I'm getting the error below. When I comment one of
> the two changes, the execution for both is normal.
> !STACK 0
> org.eclipse.emf.common.util.WrappedException:
> java.lang.RuntimeException:
> org.eclipse.text.edits.MalformedTreeException: End position lies outside
> document range
> at
> org.eclipse.xtext.ui.editor.quickfix.IssueResolution.apply(IssueResolution.java:82)
>
> at
> org.eclipse.xtext.ui.editor.quickfix.QuickAssistCompletionProposal.apply(QuickAssistCompletionProposal.java:32)
>
> at
> org.eclipse.xtext.ui.editor.hover.AnnotationWithQuickFixesHover$AnnotationInformationControl.apply(AnnotationWithQuickFixesHover.java:525)
>
> at
> org.eclipse.xtext.ui.editor.hover.AnnotationWithQuickFixesHover$AnnotationInformationControl.access$2(AnnotationWithQuickFixesHover.java:502)
>
> at
> org.eclipse.xtext.ui.editor.hover.AnnotationWithQuickFixesHover$AnnotationInformationControl$5.widgetSelected(AnnotationWithQuickFixesHover.java:496)
>
> at
> org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
> at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
> at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4134)
> at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1458)
> at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1481)
> at org.eclipse.swt.widgets.Widget.sendSelectionEvent(Widget.java:1531)
> at
> org.eclipse.swt.widgets.Link.textView_clickOnLink_atIndex(Link.java:117)
> at org.eclipse.swt.widgets.Display.windowProc(Display.java:5807)
> at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
> at org.eclipse.swt.widgets.Widget.callSuper(Widget.java:221)
> at org.eclipse.swt.widgets.Widget.mouseDownSuper(Widget.java:1093)
> at org.eclipse.swt.widgets.Widget.mouseDown(Widget.java:1085)
> at org.eclipse.swt.widgets.Control.mouseDown(Control.java:2538)
> at org.eclipse.swt.widgets.Display.windowProc(Display.java:5493)
> at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
> at org.eclipse.swt.widgets.Widget.callSuper(Widget.java:221)
> at org.eclipse.swt.widgets.Widget.windowSendEvent(Widget.java:2102)
> at org.eclipse.swt.widgets.Shell.windowSendEvent(Shell.java:2299)
> at org.eclipse.swt.widgets.Display.windowProc(Display.java:5557)
> at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
> at
> org.eclipse.swt.widgets.Display.applicationSendEvent(Display.java:5002)
> at org.eclipse.swt.widgets.Display.applicationProc(Display.java:5151)
> at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method)
> at
> org.eclipse.swt.internal.cocoa.NSApplication.sendEvent(NSApplication.java:128)
>
> at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3616)
> at
> org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1029)
>
> at
> org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
>
> at
> org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:923)
>
> at
> org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
>
> at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588)
> at
> org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
>
> at
> org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543)
> at
> org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
> at
> org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
>
> 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:353)
>
> at
> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
>
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>
> at java.lang.reflect.Method.invoke(Method.java:597)
> at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
> at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
> at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
> at org.eclipse.equinox.launcher.Main.main(Main.java:1414)
> Caused by: java.lang.RuntimeException:
> org.eclipse.text.edits.MalformedTreeException: End position lies outside
> document range
> at
> org.eclipse.xtext.ui.editor.model.edit.ReconcilingUnitOfWork.exec(ReconcilingUnitOfWork.java:46)
>
> at
> org.eclipse.xtext.ui.editor.model.edit.ReconcilingUnitOfWork.exec(ReconcilingUnitOfWork.java:1)
>
> at
> org.eclipse.xtext.util.concurrent.AbstractReadWriteAcces.modify(AbstractReadWriteAcces.java:49)
>
> at
> org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.modify(XtextDocument.java:181)
>
> at
> org.eclipse.xtext.ui.editor.model.XtextDocument.internalModify(XtextDocument.java:90)
>
> at
> org.eclipse.xtext.ui.editor.model.XtextDocument.modify(XtextDocument.java:83)
>
> at
> org.eclipse.xtext.ui.editor.model.edit.SemanticModificationWrapper.apply(SemanticModificationWrapper.java:31)
>
> at
> org.eclipse.xtext.ui.editor.quickfix.IssueResolution.apply(IssueResolution.java:80)
>
> ... 51 more
> Caused by: org.eclipse.text.edits.MalformedTreeException: End position
> lies outside document range
> at
> org.eclipse.text.edits.TextEditProcessor.checkIntegrityDo(TextEditProcessor.java:178)
>
> at
> org.eclipse.text.edits.TextEdit.dispatchCheckIntegrity(TextEdit.java:743)
> at
> org.eclipse.text.edits.TextEditProcessor.performEdits(TextEditProcessor.java:151)
>
> at org.eclipse.text.edits.TextEdit.apply(TextEdit.java:711)
> at org.eclipse.text.edits.TextEdit.apply(TextEdit.java:735)
> at
> org.eclipse.xtext.ui.editor.model.edit.ReconcilingUnitOfWork.exec(ReconcilingUnitOfWork.java:42)
>
> ... 58 more
>
>
> Could someone point me how could I accomplish this?
>
> thanks
>
> Cristiano
|
|
| |
Goto Forum:
Current Time: Thu Mar 28 15:54:12 GMT 2024
Powered by FUDForum. Page generated in 0.02799 seconds
|