2

我编写了一个基于 Xtext 的插件,当我在工作区的一个项目中打开文件时,它运行良好;但是,当我在工作区外打开文件时(通过文件 -> 打开文件...),某些功能无法正常工作:

  • 我得到语法着色,但没有语法错误。
  • Quickfix 选项不起作用,可能是因为context.getXtextDocument()退货null,我依靠它来提出我的 quickfix 建议。

我可能还缺少其他东西,但大多数其他功能,例如内容辅助、悬停定义、事件标记等,都可以正常工作。

有没有办法可以使工作区外部源文件的行为与内部文件相同?或者,是否有一种解决方法可以让我“欺骗”Xtext,以某种方式说服它该文件是当前项目的内部文件,例如通过以编程方式从项目创建指向它的链接?

这是关于工作空间外部文件行为的相关问题,但是我成功打开这些文件就好了,只是某些功能不起作用。

4

1 回答 1

2

据我所知,目前没有办法让工作区外部源文件的行为与内部文件相同。

以下是验证失败的解决方法:

  • 在 xxx.ui 插件中,XxxUiModule.java 添加

    public Class<? extends IResourceForEditorInputFactory> bindIResourceForEditorInputFactory() {
        return MyJavaClassPathResourceForIEditorInputFactory.class;
    }
    
    @Override
    public Class<? extends IXtextEditorCallback> bindIXtextEditorCallback() {
        return MyNatureAddingEditorCallback.class;
    }
    
  • 创建 MyJavaClassPathResourceForIEditorInputFactory.java

    // Reenable validation
    public class MyJavaClassPathResourceForIEditorInputFactory extends JavaClassPathResourceForIEditorInputFactory {
    
        @Override
        protected Resource createResource(java.net.URI uri) {
            XtextResource resource = (XtextResource) super.createResource(uri);
            resource.setValidationDisabled(false);
            return resource;
        }
    }
    
  • 创建 MyNatureAddingEditorCallback.java

    // With reenabled validation the syntax validation starts to work only after the first change made
    // Run the validation manually to show the syntax errors straight away
    // - CheckMode.ALL below should be probably changed to something else to improve the performance
    public class MyNatureAddingEditorCallback extends NatureAddingEditorCallback {
        @Inject
        private IResourceValidator resourceValidator;
        @Inject 
        private MarkerCreator markerCreator;
        @Inject
        private MarkerTypeProvider markerTypeProvider;
        @Inject
        private IssueResolutionProvider issueResolutionProvider;
    
        @Override
        public void afterCreatePartControl(XtextEditor editor) {
            super.afterCreatePartControl(editor);
            validate(editor);
        }
    
        private void validate(XtextEditor xtextEditor) {
            if (xtextEditor == null) {
                return;
            }
            if (xtextEditor.getInternalSourceViewer() == null) {
                return;
            }
            IValidationIssueProcessor issueProcessor;
            IXtextDocument xtextDocument = xtextEditor.getDocument();
            IResource resource = xtextEditor.getResource();
            if(resource != null)
                issueProcessor = new MarkerIssueProcessor(resource, markerCreator, markerTypeProvider);
            else
                issueProcessor = new AnnotationIssueProcessor(xtextDocument, xtextEditor.getInternalSourceViewer().getAnnotationModel(), issueResolutionProvider);
            ValidationJob validationJob = new ValidationJob(resourceValidator, xtextDocument, issueProcessor,
                    CheckMode.ALL); // Consider changing the CheckMode here
            validationJob.schedule();
        }
    }
    

另请参阅相应的错误报告: https ://bugs.eclipse.org/bugs/show_bug.cgi?id=388399

于 2013-03-12T12:39:13.507 回答