Lets say you have the following code in xTend:
class StackOverflowGenerator {
def generate()'''
«var counter = 0»
«FOR i : 0 ..<10»
Line Numnber: «i»
«counter = counter + 1»
«ENDFOR»
'''
}
This will generate output in the format:
Line Numnber: 0
1
Line Numnber: 1
2
Line Numnber: 2
3
Line Numnber: 3
...
How do I get xTend to not print the line with just the counter and only print the Line Number line such that the output looks like:
Line Numnber: 0
Line Numnber: 1
Line Numnber: 2
Line Numnber: 3
...
In Xtend, everything is an expression, so «counter = counter + 1»
evaluates to the result of the assignment, that's why it will be part of the string. So if you really want to perform a side effect in a template expression's for loop (which is strongly discouraged), do it in a block expression and return the empty string or null: «{ counter = counter + 1; "" }»
. Nevertheless, this is not too elegant, so you might want solve your problem in another way, as the other answers suggest.
In your example there is no use for counter
. So it is hard to guess what your real usecase is. In most cases some calculation based on i
is enought, eliminating counter
completely. Orionll's answer is pointing in that direction.
If however counter
is something which cannot be computed from i
but is some accumulated state, then the simplest thing is to extract that state into a custom class and to modify this state using void
methods. In this example the generated void setCounter(int)
method is used.
class Example {
def static void main(String[] args) {
println(generate)
}
def static generate() '''
«var state = new State(0)»
«FOR i : 0 ..< 10»
Line Numnber: «i»
«state.setCounter(state.counter + 1)»
«ENDFOR»
'''
}
class State {
@Property
var int counter
new(int counter){
this.counter = counter
}
}
«var counter = 0»
«FOR i : 0 ..<10»
Line Number: «counter = i»
«ENDFOR»
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With