2

ワークスペースのプロジェクトの1つでファイルを開くとうまく機能するXtextベースのプラグインを作成しました。ただし、ワークスペースの外で([ファイル]-> [ファイルを開く...]を使用して)ファイルを開くと、一部の機能が正しく機能しません。

  • 構文の色付けはできますが、構文エラーは発生しません。
  • クイックフィックスオプションが機能しないのは、おそらくcontext.getXtextDocument()返品nullとクイックフィックスの提案に依存しているためです。

私が見逃しているものは他にもあるかもしれませんが、コンテンツアシスト、ホバー定義、オカレンスマーキングなど、他のほとんどの機能は正常に機能します。

ワークスペースを作成する方法はありますか?外部ソースファイルは内部ファイルと同じように動作しますか?または、Xtextを「だまして」、ファイルが現在のプロジェクトの内部にあることを、たとえばプロジェクトからプログラムでプログラムで作成するなどして、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 に答える