【问题标题】:Xtend lambda expression overloading for Xtext QuickFix APIXtext QuickFix API 的 Xtend lambda 表达式重载
【发布时间】:2013-09-12 12:17:59
【问题描述】:

我正在使用 Xtend 为我的 Xtext 语言的 Eclipse UI 插件编写自定义 QuickFixes。这个想法是扩展org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider并使用调用org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptoraccept方法。

accept 有几个重载签名,包括:

  • void accept(Issue issue, String label, String description, String image, IModification modification)
  • void accept(Issue issue, String label, String description, String image, ISemanticModification semanticModification)

使用 Xtend 的 lambda 表达式语法很容易使用这些签名中的第一个:

@Fix(MyDSLValidator::INVALID_TYPE_NAME)
def removeInitialUnderscore(Issue issue, IssueResolutionAcceptor acceptor) {
    acceptor.accept(issue,
    "Remove initial underscore",
    "Remove initial underscore",
    'upcase.png')
    [
        context |
        context.xtextDocument.replace(issue.offset, 1, "")
    ]
}

Xtend 编译器生成以下 Java 代码:

public void removeInitialUnderscore(final Issue issue, final IssueResolutionAcceptor acceptor) {
  final IModification _function = new IModification() {
    public void apply(final IModificationContext context) throws Exception {
      IXtextDocument _xtextDocument = context.getXtextDocument();
      Integer _offset = issue.getOffset();
      _xtextDocument.replace((_offset).intValue(), 1, "");
    }
  };
  acceptor.accept(issue, 
    "Remove initial underscore", 
    "Remove initial underscore", 
    "upcase.png", _function);
}

现在我想编写第二个 QuickFix,它使用 ISemanticModification 而不是 IModification,这样我就可以访问底层 EMF 模型,而不仅仅是字符串。但是,我很难告诉 Xtend 编译器我想使用哪种方法重载:

@Fix(MyDSLValidator::MISSING_USAGE)
def addMissingUseStatement(Issue issue, IssueResolutionAcceptor acceptor) {
    acceptor.accept(issue,
    "Add missing use statement",
    "Add missing use statement",
    "upcase.png",
    [
        EObject element |
        (element.eContainer as MyContainer).usages.add(
                    (element as MyElement).myattr.eContainer as MyOtherContainer
                )
    ])
}

Xtend 总是认为我想传递 IModification 而不是 ISemanticModification 并在编译的 java 代码中产生错误,因为两个 apply 方法具有不同的签名,IModification 采用 IModificationContext 而 @ 987654337@ 接受EObject

@Fix(MyDSLValidator.MISSING_USAGE)
public void addMissingUseStatement(final Issue issue, final IssueResolutionAcceptor acceptor) {
  final IModification _function = new IModification() {
    public void apply(final IModificationContext element) throws Exception {
      EObject _eContainer = element.eContainer(); // COMPILE ERROR
      EList<Circuit> _usages = ((MyContainer) _eContainer).getUsages();
      MyAttr _myattr = ((MyAttr ) element).getMyattr();
      EObject _eContainer_1 = _myattr.eContainer();
      _usages.add(
        ((MyOtherContainer) _eContainer_1));
    }
  };
  acceptor.accept(issue, 
    "Add missing use statement", 
    "Add missing use statement", 
    "upcase.png", _function);
}

我如何告诉 Xtend 使用哪种重载?据我所知,不可能在 Xtend 中创建匿名对象,因此需要有另一种方法来调用 IssueResolutionAcceptor.accept 传递 ISemanticModification

【问题讨论】:

    标签: java eclipse lambda xtext xtend


    【解决方案1】:

    ISemanticModification 接受两个参数,而 IModification 只使用一个参数。要实现语义修改,您应该分别使用带有两个参数的 lambda:

    acceptor.accept(issue,
        "Add missing use statement",
        "Add missing use statement",
        "upcase.png") [ element, context |
          ..
        ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2014-09-12
      • 2015-03-19
      • 2014-06-19
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      相关资源
      最近更新 更多