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