@Beta public abstract class AbstractJavaFormatter extends AbstractFormatter2
This is an abstract base class for language-specific formatters, intended to be extended with a java class.
It is working very much like AbstractFormatter2 but does support additional methods to simplify java
formatter code.
the "_format" methods are called by reflection. The name is important as well as there are exactly two arguments
whereas the first one is of the element type you like to format and the second one of type
IFormattableDocument. The methods should be protected.
Example code for a java formatter:
import static org.xtext.example.mydsl.myDsl.MyDslPackage.Literals.*;
public class MyDslFormatter2 extends AbstractJavaFormatter {
protected void _format(Model model, IFormattableDocument doc) {
for (Parent parent : model.getParents())
doc.format(parent);
}
protected void _format(Parent parent, IFormattableDocument doc) {
doc.prepend(regionFor(parent).keyword("parent"), this::noSpace);
doc.append(regionFor(parent).keyword("parent"), this::oneSpace);
doc.append(regionFor(parent).feature(PARENT__NAME), this::oneSpace);
doc.prepend(regionFor(parent).keyword("{"), this::oneSpace);
doc.append(regionFor(parent).keyword("{"), this::newLine);
doc.interior(regionFor(parent).keyword("{"), regionFor(parent).keyword("}"), this::indent);
doc.append(regionFor(parent).keyword("}"), it -> it.setNewLines(1, 1, 2));
for (Child child : parent.getChildren())
doc.format(child);
}
protected void _format(Child child, IFormattableDocument doc) {
doc.append(regionFor(child).keyword("child"), this::oneSpace);
doc.append(regionFor(child).feature(CHILD__NAME), this::newLine);
}
}
This is suitable for the following grammar:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Model: parents+=Parent*;
Parent: 'parent' name=ID '!' ('{' children+=Child* '}')?;
Child: 'child' name=ID;
| Modifier and Type | Class and Description |
|---|---|
protected class |
AbstractJavaFormatter.EObjectErrorHandler |
textRegionExtensions| Constructor and Description |
|---|
AbstractJavaFormatter() |
| Modifier and Type | Method and Description |
|---|---|
protected ISemanticRegionsFinder |
allRegionsFor(org.eclipse.emf.ecore.EObject semanticElement) |
protected java.lang.Iterable<ISemanticRegion> |
allSemanticRegions(org.eclipse.emf.ecore.EObject semanticElement) |
protected void |
autowrap(IHiddenRegionFormatter hrf)
Configure autowrap.
|
protected org.eclipse.xtext.util.PolymorphicDispatcher<java.lang.Void> |
createPolymorhicDispatcher()
Override if you like to specify formatting methods in different way then default (using annotations or similar).
|
void |
format(java.lang.Object child,
IFormattableDocument document)
Implement this method to create a language-specific formatter.
|
protected org.eclipse.emf.ecore.EObject |
grammarElement(org.eclipse.emf.ecore.EObject semanticElement) |
protected void |
highPriority(IHiddenRegionFormatter hrf)
When merging, treat this configuration with a high priority.
|
protected ISemanticRegionFinder |
immediatelyFollowing(org.eclipse.emf.ecore.EObject semanticElement) |
protected ISemanticRegionFinder |
immediatelyPreceding(org.eclipse.emf.ecore.EObject semanticElement) |
protected void |
indent(IHiddenRegionFormatter hrf) |
protected boolean |
isMultiline(org.eclipse.emf.ecore.EObject semanticElement) |
protected void |
lowPriority(IHiddenRegionFormatter hrf)
When merging, treat this configuration with a low priority.
|
protected void |
newLine(IHiddenRegionFormatter hrf)
Forces a line break in this hidden region.
|
protected IHiddenRegion |
nextHiddenRegion(org.eclipse.emf.ecore.EObject semanticElement) |
protected void |
noAutowrap(IHiddenRegionFormatter hrf)
Suppresses auto wrap in this hidden region.
|
protected void |
noIndentation(IHiddenRegionFormatter hrf)
Resets the indentation level to zero.
|
protected void |
noSpace(IHiddenRegionFormatter hrf)
Format this hidden region with using no space (zero characters).
|
protected void |
oneSpace(IHiddenRegionFormatter hrf)
One space is added at this hidden region.
|
protected IHiddenRegion |
previousHiddenRegion(org.eclipse.emf.ecore.EObject semanticElement) |
protected ISemanticRegionsFinder |
regionFor(org.eclipse.emf.ecore.EObject semanticElement) |
protected IEObjectRegion |
regionForEObject(org.eclipse.emf.ecore.EObject semanticElement) |
protected java.lang.Iterable<ISemanticRegion> |
semanticRegions(org.eclipse.emf.ecore.EObject semanticElement) |
_format, _format, _format, _format, createCommentReplacer, createFormattableRootDocument, createFormattableSubDocument, createHiddenRegionFormatter, createHiddenRegionFormatter, createHiddenRegionFormatting, createHiddenRegionFormattingMerger, createHiddenRegionReplacer, createTextReplacerContext, createTextReplacerMerger, createWhitespaceReplacer, format, getPreference, getPreferences, getRequest, getTextRegionAccess, handleTraceMissing, initalize, initialize, isInRequestedRange, postProcess, reset, shouldFormatpublic void format(java.lang.Object child,
IFormattableDocument document)
AbstractFormatter2format in class AbstractFormatter2child - An XtextResource or an object for from your semantic model.document - The document to collect and execute ITextReplacers.protected org.eclipse.xtext.util.PolymorphicDispatcher<java.lang.Void> createPolymorhicDispatcher()
protected ISemanticRegionsFinder allRegionsFor(org.eclipse.emf.ecore.EObject semanticElement)
protected java.lang.Iterable<ISemanticRegion> allSemanticRegions(org.eclipse.emf.ecore.EObject semanticElement)
protected org.eclipse.emf.ecore.EObject grammarElement(org.eclipse.emf.ecore.EObject semanticElement)
protected ISemanticRegionFinder immediatelyFollowing(org.eclipse.emf.ecore.EObject semanticElement)
protected ISemanticRegionFinder immediatelyPreceding(org.eclipse.emf.ecore.EObject semanticElement)
protected boolean isMultiline(org.eclipse.emf.ecore.EObject semanticElement)
protected IHiddenRegion nextHiddenRegion(org.eclipse.emf.ecore.EObject semanticElement)
protected IHiddenRegion previousHiddenRegion(org.eclipse.emf.ecore.EObject semanticElement)
protected ISemanticRegionsFinder regionFor(org.eclipse.emf.ecore.EObject semanticElement)
protected IEObjectRegion regionForEObject(org.eclipse.emf.ecore.EObject semanticElement)
protected java.lang.Iterable<ISemanticRegion> semanticRegions(org.eclipse.emf.ecore.EObject semanticElement)
protected void autowrap(IHiddenRegionFormatter hrf)
protected void noAutowrap(IHiddenRegionFormatter hrf)
protected void highPriority(IHiddenRegionFormatter hrf)
lowPriority(IHiddenRegionFormatter)protected void lowPriority(IHiddenRegionFormatter hrf)
highPriority(IHiddenRegionFormatter)protected void noIndentation(IHiddenRegionFormatter hrf)
protected void indent(IHiddenRegionFormatter hrf)
protected void newLine(IHiddenRegionFormatter hrf)
protected void noSpace(IHiddenRegionFormatter hrf)
protected void oneSpace(IHiddenRegionFormatter hrf)