Xtend : Avis sur le code généré
Bonjour,
Lors d'un de mes tests sur Xtend j'ai remarqué que certaines classes généré avait l'annotation @SuppressWarnings("all").
Du coup, je me suis permis des les retirer juste pour voir ce qu'elles cachaient...
Citation:
The value of the local variable other is not used
Or le code généré associé se trouve être les méthodes hashCode() et equals() dans le cas où la classe n'a pas d'attribut propre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| /**
* Copyright (c) 2012 itemis AG (http://www.itemis.eu) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package example4;
import example4.ContentNode;
import org.eclipse.xtend.lib.annotations.Data;
import org.eclipse.xtext.xbase.lib.Pure;
import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
@Data
@SuppressWarnings("all")
public class B extends ContentNode {
@Override
@Pure
public int hashCode() {
final int prime = 31; // Ici déclaration de prime qui n'est jamais utilisé... Donc warning
int result = super.hashCode();
return result;
}
@Override
@Pure
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
if (!super.equals(obj))
return false;
B other = (B) obj; // Ici déclaration de other qui n'est jamais utilisé... Donc warning
return true;
}
@Override
@Pure
public String toString() {
String result = new ToStringBuilder(this)
.addAllFields()
.toString();
return result;
}
} |
Je trouve le warning risible, mais cela met le doute sur la qualité du code généré en général.
De même, dans les exemples présentés ont a :
Code:
1 2 3
| @Test def void numberOfActionMovies() {
assertEquals(828, movies.filter[categories.contains('Action')].size)
} |
Lorsqu'on compile vers du code Java 1.8 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Functions.Function0;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.Functions.Function2;
import org.eclipse.xtext.xbase.lib.IntegerRange;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.IteratorExtensions;
import org.eclipse.xtext.xbase.lib.ListExtensions;
@Test
public void numberOfActionMovies() {
final Function1<Movie, Boolean> _function = (Movie it) -> {
Set<String> _categories = it.getCategories();
return Boolean.valueOf(_categories.contains("Action"));
};
Iterable<Movie> _filter = IterableExtensions.<Movie>filter(this.movies, _function);
int _size = IterableExtensions.size(_filter);
Assert.assertEquals(828, _size);
} |
On constate qu'on a une utilisation à la librairie Xtext, alors que seul le standard java aurait dû être appeler.
Le code que j'aurai écris en Java 1.8 (Pas de Xtext) :
Code:
1 2 3 4 5 6
|
Assert.assertEquals(828,
this.movies.stream()
.filter(movie -> movie.getCategories()
.contains("Action"))
.count()); |
Divergence entre Xtend et standard Java ?
:fleche: Quel est votre avis sur ?
Cordialement,
Patrick Kolodziejczyk.
Note : Les exemples viennent du projet "Xtend Introductory Examples" livré avec le plugin Eclipse.