Hi for the first time, greetings.
I want to reorder elements of a group to default (defined) order. The group is defined as an unordered group:
VehicleSpec returns dpm::VehicleSpec:
{dpm::VehicleSpec}
'@Vehicle'
('('
(
('name:' name=EString)? &
(roads?='roads')? &
(sky?='sky')? &
(rivers?='rivers')? &
(space?='space')? &
(passengers+=Passenger )*
)
')')?
;
So this is valid code:
@Vehicle(
space sky roads rivers
name: aMiracle
)
Which I want to reorder in the editor to:
@Vehicle(
name: aMiracle
roads sky rivers space
)
I've tried to extend AbstractFormatter2 but it is not designed to make changes in the semantic model.
Another solution I've been working on was to use validator and quick fix mechanisms. I've managed to extend DefaultQuickfixProvider and I've written a simple working acceptor:
acceptor.accept(issue, 'reorder text' ,'apply default order', 'order.png',
new ISemanticModification() {
override apply(EObject element, IModificationContext context) throws Exception {
val vehicle = ((element as MyObject).vehicle as VehicleSpec)
val xtextDocument = context.xtextDocument`
var content = '''
@Vehicle(
«IF vehicle.name !== null»name: «vehicle.name»«ENDIF»
«IF vehicle.roads»roads«ENDIF»
«IF vehicle.sky»sky«ENDIF»
«IF vehicle.rivers»rivers«ENDIF»
«IF vehicle.space»space«ENDIF»
«IF vehicle.passengers.size>0»«vehicle.indices.generate»«ENDIF»
)
'''
xtextDocument.replace(issue.offset, issue.length, content )
}
}
)
But a fix is triggered by validation check which I have no idea how to write. I can only check e.g. can vehicle fly or swim but no iteration through the ordered list of elements or search through text representation. Can you give me some advice on where to start from or on a different approach?