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...
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 : 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;
  }
}
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 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 :
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);
  }
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 : 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());
Divergence entre Xtend et standard Java ?

Quel est votre avis sur ?

Cordialement,
Patrick Kolodziejczyk.

Note : Les exemples viennent du projet "Xtend Introductory Examples" livré avec le plugin Eclipse.