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...
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 :The value of the local variable other is not used
Je trouve le warning risible, mais cela met le doute sur la qualité du code généré en général.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
De même, dans les exemples présentés ont a :
Code Xtend : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 @Test def void numberOfActionMovies() { assertEquals(828, movies.filter[categories.contains('Action')].size) }
Lorsqu'on compile vers du code Java 1.8 :
On constate qu'on a une utilisation à la librairie Xtext, alors que seul le standard java aurait dû être appeler.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Le code que j'aurai écris en Java 1.8 (Pas de Xtext) :
Divergence entre Xtend et standard Java ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Assert.assertEquals(828, this.movies.stream() .filter(movie -> movie.getCategories() .contains("Action")) .count());
Quel est votre avis sur ?
Cordialement,
Patrick Kolodziejczyk.
Note : Les exemples viennent du projet "Xtend Introductory Examples" livré avec le plugin Eclipse.
Partager