问题描述:
单行或多行注释的默认缩进并不总是正常工作。正面临以下问题。
重要提示:
请告诉我们已经存在的eclipse Xtext票证,如果这是一个已知问题。或任何stackoverflow线程解释为什么会发生这种情况。基于IFormmatter2的格式化程序中可能编码错误的原因。另外,请进一步阅读,非常感谢有用的提示,可以帮助我们找到解决方案的解决方案。
进一步说明:
“默认缩进”意味着:
applyHiddenRegionFormatting
,createCommentReplacer
或操纵评论的任何其他相关方法。 SL_COMMENT
和ML_COMMENT
的终端规则保持不变,如下(取自 Terminals.xtext ):
terminal ML_COMMENT : '/*' -> '*/';
terminal SL_COMMENT : '//' !('\n'|'\r')* ('\r'? '\n')?;
对于以任何形式操纵评论,也没有其他已知的更改。
AbstractFormatter2的当前用法/行为理解w.r.t.缩进如下,如果不正确,请更正。
给定一个EObject,可以使用以下方法集中为包含的IHiddenRegion(s)和ISemanticRegion(s)的文本设置缩进:
EObject.interior().indent[]
Interior.(ISemanticRegion_Start, ISemanticRegion_End).indent[]
,其中ISemanticRegion_Start
& ISemanticRegion_End
用于分别包含在EObject中的关键字“{”和“}”。Document.set(IHiddenRegion_Start, IHiddenRegion_End).indent[]
,其中IHiddenRegion_Start
是ISemanticRegion_Start
的下一个隐藏区域(如上所述),IHiddenRegion_End
是ISemanticRegion_End
的前一个隐藏区域(如如上所述)。对于'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和评论包含在英语中。提前致谢。
答案 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»''')
}
}