Xtext 2.10(AbstractFormatter2):单行或多行注释的缩进并不总是正确的

时间:2017-08-08 12:11:34

标签: java xtext xtend

问题描述:

单行或多行注释的默认缩进并不总是正常工作。正面临以下问题。

  • 单行注释的缩进如果还没有,则永远不会有效 至少在它们前面的空间或标签。
  • 单行或多行注释的缩进如果它们是设置了缩进减少的IHiddenRegion的一部分,则从不起作用。目前的理解是,相应IHiddenRegion的格式化程序将增加其中包含的注释的缩进,然后将为即将发生的严格交替的IHiddenRegion(s)或IsemanticRegion(s)设置缩进的整体减少。

重要提示:

请告诉我们已经存在的eclipse Xtext票证,如果这是一个已知问题。或任何stackoverflow线程解释为什么会发生这种情况。基于IFormmatter2的格式化程序中可能编码错误的原因。另外,请进一步阅读,非常感谢有用的提示,可以帮助我们找到解决方案的解决方案。

进一步说明:

“默认缩进”意味着:

  • 不会覆盖方法applyHiddenRegionFormattingcreateCommentReplacer或操纵评论的任何其他相关方法。
  • SL_COMMENTML_COMMENT的终端规则保持不变,如下(取自 Terminals.xtext ):

    terminal ML_COMMENT : '/*' -> '*/'; terminal SL_COMMENT : '//' !('\n'|'\r')* ('\r'? '\n')?;

  • 对于以任何形式操纵评论,也没有其他已知的更改。

AbstractFormatter2的当前用法/行为理解w.r.t.缩进如下,如果不正确,请更正。

给定一个EObject,可以使用以下方法集中为包含的IHiddenRegion(s)和ISemanticRegion(s)的文本设置缩进:

  1. EObject.interior().indent[]
  2. Interior.(ISemanticRegion_Start, ISemanticRegion_End).indent[],其中ISemanticRegion_Start& ISemanticRegion_End用于分别包含在EObject中的关键字“{”和“}”。
  3. Document.set(IHiddenRegion_Start, IHiddenRegion_End).indent[],其中IHiddenRegion_StartISemanticRegion_Start的下一个隐藏区域(如上所述),IHiddenRegion_EndISemanticRegion_End的前一个隐藏区域(如如上所述)。
  4. 对于'2'和'3',目前的理解是,对于所有严格交替IHiddenRegion(s)ISemanticRegion(s)的缩进将增加,这将在两个ISemanticRegions之间(在'2'的情况下或在两个IHiddenRegions之间(在'3'的情况下,将包括两个开始和结束边界IHiddenRegions)。

    使用上述任何方法时,注释的缩进显示完全相同的行为。还请告知是否总是需要覆盖某些方法来正确处理注释的格式。或者为处理注释提供的默认实现就足够了。

    例如,我们项目中格式化程序的行为和域模型示例(org.eclipse.xtext.example.domainmodel)中用于注释缩进的行为是相同的。因此,在下面的示例DSL中提供来自域模型示例的注释,以便易于与其相关联。

    带有评论的示例域模型DSL:

    package p1 {
        /*
         * ml one 
         */
        // sl 11
    // sl 12
        package p2 {
        }
        // sl two
        package p3 {
        }
        // sl three
        /*
         * ml two 
         */
        /*
         * ml three 
         */
        package p4 {
        }
    // sl four
    /*
     * ml four 
     */
    /*
     * ml five 
     */
    }
    

    在上面的示例中,注释“sl 12”是不正确的缩进情况(1)的示例。并且注释“sl four”和“ml four”是情况(2)的示例。正如一开始所解释的那样。注释“sl 11”是单行注释的右缩进的示例,当前面至少有一个空格或制表符时。多行注释的缩进也可以在它们前面没有空格或制表符的情况下正常工作。

    其他要点:

    • 还测试了是否使用语法访问来获取对所需ISemanticRegions的访问权限,即EObject.regionFor.ruleCall()而不是Eobject.regionFor.keyword(),但结果是相同的。< / LI>
    • 同样在域模型示例中,格式化程序扩展XbaseFormatter,而我们项目中的格式化程序扩展AbstractFormatter2,但两个格式化程序的结果也相同w.r.t.评论。由此产生的DSL和评论包含在英语中。

    提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试此解决方法

class DomainmodelFormatter extends XbaseFormatter {

    override ITextReplacer createCommentReplacer(IComment comment) {
    var EObject grammarElement=comment.getGrammarElement() 
    if (grammarElement instanceof AbstractRule) {
        var String ruleName=((grammarElement as AbstractRule)).getName() 
        if (ruleName.startsWith("ML")) return new MultilineCommentReplacer(comment,Character.valueOf('*').charValue) 
        if (ruleName.startsWith("SL")) {
            if (comment.getLineRegions().get(0).getIndentation().getLength() > 0) 
                return new SinglelineDocCommentReplacer(comment,"//")  
            else 
                return new SinglelineCommentReplacer(comment,"//") {

                    override configureWhitespace(WhitespaceReplacer leading, WhitespaceReplacer trailing) {
                        // do nothing
                    }

                    override createReplacements(ITextReplacerContext context) {
                        return context
                    }

                }
            }
        }
        var String elementName=new GrammarElementTitleSwitch().showQualified().showRule().doSwitch(grammarElement) 
        throw new IllegalStateException('''No «ITextReplacer.getSimpleName()» configured for «elementName»''')
    }
}