--- layout: post title: Xtext 2.6.0 Release Notes date: 2014-05-21 09:30:28 categories: releasenotes ---
Version 2.6 got many bug fixes and performance improvements (full bugzilla list). The new features are:
A gradle plug-in for easy integration of the Xtext-based languages in any Gradle-based Java projects is now available.
The gradle plug-in is hosted at github.
All ou need to do is to add the plugin to your build classpath:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.xtext:xtext-gradle-plugin:0.0.2'
}
}
Add your languages to the xtextTooling configuration
dependencies {
xtextTooling 'org.example:org.example.hero.core:3.3.3'
xtextTooling 'org.example:org.example.villain.core:6.6.6'
}
Add code that your models compile against to the xtext configuration. If you use the Java plugin, this configuration will automatically contain everything from compile and testCompile. So in many cases this can be omitted.
dependencies {
xtext 'com.google.guava:guava:15.0'
}
Configure your languages
xtext {
version = '2.5.3' // the current default, can be omitted
encoding = 'UTF-8' //the default, can be omitted
/* Java sourceDirs are added automatically,
* so you only need this element if you have
* additional source directories to add
*/
sources {
srcDir 'src/main/heroes'
srcDir 'src/main/villains'
}
languages{
heroes {
setup = 'org.example.hero.core.HeroStandaloneSetup'
consumesJava = true
outputs {
DEFAULT_OUTPUT.dir = 'build/heroes'
SIDEKICKS.dir = 'build/sidekicks'
}
}
villains {
setup = 'org.example.villain.core.VillainStandaloneSetup'
//equivalent to DEFAULT_OUTPUT.dir
output.dir = 'build/villains'
}
}
}
Syntactic predicates are used to solve ambiguities in grammars. Sometimes the predicate needs to be set on a more complex rule call, which might involve consuming a great number of tokens.
With traditional syntactic predicates using the => operator, the parser would need to match all of those tokens in order to make te decision. The new operator ->
tells the parser to only look at the first token and make the decision based on that, which is sufficient in most cases. As a result the parser is faster and does better error recovery.
The synchronized expression works basically like Java's synchronized statement.
synchronized(lock) {
// do stuff
}
But of course it is an expression, as everything in Xtend/Xbase. So you can write the following as well:
someMethodCall(synchronized(lock) { ... })
The switch expression now supports a kind of fall through. Here's an example
switch myOperator {
case '+',
case '-' : handlePlusMinus()
case '*',
case '/' : handleDivMultiply()
default : throw new IllegalStateException
}
Xtend now supports compound assignment operators.
var i = 0 i += 42
Compound operators work on overloaded operators as well. That is you don't need to declare '+=' if you have '+' defined. Example:
var distance = 15.km distance += 5.km
Postfix operators for incrementing and decrementing numbers have been added.
var i = 0
while (condition()) {
i++
}
The traditional for-loop from Java is now available in Xtend, too.
for (var i = 0; i < 99; i++) {
println(''+i+' bottles of beer on the wall.')
}
Instead of writing
@SurpressWarnings(#["unused", "unchecked"])
you can write
@SurpressWarnings("unused", "unchecked")
In addition to go to declaration, you can now navigate to existing implementations of a method. It works just like in JDT
In a debug session, when hovering over a local variable or a visible field, the popo up shows the inspection tree of the hovered value.
The declaration hover now includes the annotations.
For large Android projects there is a need to have as little code packaged as possible. Usually this is achieved by proguarding cour code and the dependencies during the build. For people who find that tedious and want to work with a reduced lib from the get go, we offer a treeshaken version of the library, which is only 300k small.
The library can be downloaded from maven central.