diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/CodeConfig.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/CodeConfig.xtend
index e178f944e..4be1f8b49 100644
--- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/CodeConfig.xtend
+++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/CodeConfig.xtend
@@ -8,6 +8,7 @@
package org.eclipse.xtext.xtext.generator
import com.google.inject.Injector
+import java.nio.charset.Charset
import java.text.SimpleDateFormat
import java.util.Date
import java.util.List
@@ -15,7 +16,6 @@ import org.eclipse.xtend.lib.annotations.Accessors
import org.eclipse.xtext.util.Strings
import org.eclipse.xtext.util.XtextVersion
import org.eclipse.xtext.xtext.generator.model.annotations.IClassAnnotation
-import java.nio.charset.Charset
/**
* Configuration object for generated code.
diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/GeneratedJavaFileAccess.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/GeneratedJavaFileAccess.xtend
index 4c3f096fc..f2df3e634 100644
--- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/GeneratedJavaFileAccess.xtend
+++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/GeneratedJavaFileAccess.xtend
@@ -4,7 +4,6 @@ import java.util.List
import org.eclipse.xtend.lib.annotations.Accessors
import org.eclipse.xtend2.lib.StringConcatenationClient
import org.eclipse.xtext.xtext.generator.CodeConfig
-import org.eclipse.xtext.xtext.generator.model.JavaFileAccess.JavaTypeAwareStringConcatenation
import org.eclipse.xtext.xtext.generator.model.annotations.IClassAnnotation
/**
@@ -49,7 +48,7 @@ class GeneratedJavaFileAccess extends JavaFileAccess {
}
private def getClassAnnotations() {
- annotations + codeConfig.classAnnotations.filter[appliesTo(this)]
+ (annotations + codeConfig.classAnnotations.filter[appliesTo(this)]).toSet
}
override getInternalContent() '''
diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/GeneratedClassAnnotation.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/GeneratedClassAnnotation.xtend
index e9e5f8c25..05fba1630 100644
--- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/GeneratedClassAnnotation.xtend
+++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/GeneratedClassAnnotation.xtend
@@ -69,5 +69,13 @@ class GeneratedClassAnnotation implements IClassAnnotation {
override toString() {
generate.toString
}
+
+ override equals(Object obj) {
+ return obj instanceof GeneratedClassAnnotation
+ }
+
+ override hashCode() {
+ return class.name.hashCode;
+ }
}
diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/IClassAnnotation.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/IClassAnnotation.xtend
index d088092f3..637633b6b 100644
--- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/IClassAnnotation.xtend
+++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/IClassAnnotation.xtend
@@ -7,6 +7,7 @@
*******************************************************************************/
package org.eclipse.xtext.xtext.generator.model.annotations
+import java.lang.annotation.Repeatable
import org.eclipse.xtext.xtext.generator.XtextGenerator
import org.eclipse.xtext.xtext.generator.model.JavaFileAccess
import org.eclipse.xtext.xtext.generator.model.TypeReference
@@ -14,6 +15,12 @@ import org.eclipse.xtext.xtext.generator.model.TypeReference
/**
* Class annotations can be added to the {@link XtextGenerator} workflow component in order
* to configure specific Java annotations to be added to each generated class.
+ *
+ * Make sure that you implement {@link Object#equals(Object)} and {@link Object#hashCode()} to fulfill following contract
+ *
+ * - If the underlying Annotation is {@link Repeatable} then the methods should behave like in {@link Object}.
+ * - If the underlying Annotation is NOT {@link Repeatable} then {@link Object#equals(Object)} should return true for all instances and {@link Object#hashCode()} should return the same value for all instances
+ *
*/
interface IClassAnnotation {
diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/SingletonClassAnnotation.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/SingletonClassAnnotation.xtend
index 9f05c3b3b..72a274f33 100644
--- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/SingletonClassAnnotation.xtend
+++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/SingletonClassAnnotation.xtend
@@ -31,4 +31,12 @@ class SingletonClassAnnotation implements IClassAnnotation {
override toString() {
generate.toString
}
+
+ override equals(Object obj) {
+ return obj instanceof SingletonClassAnnotation
+ }
+
+ override hashCode() {
+ return class.name.hashCode;
+ }
}
diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/SuppressWarningsAnnotation.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/SuppressWarningsAnnotation.xtend
index d574da782..28c8a4629 100644
--- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/SuppressWarningsAnnotation.xtend
+++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/model/annotations/SuppressWarningsAnnotation.xtend
@@ -41,5 +41,14 @@ class SuppressWarningsAnnotation implements IClassAnnotation {
override toString() {
generate.toString
- }
+ }
+
+ override equals(Object obj) {
+ return obj instanceof SuppressWarningsAnnotation
+ }
+
+ override hashCode() {
+ return class.name.hashCode;
+ }
+
}
diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/GeneratedJavaFileAccess.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/GeneratedJavaFileAccess.java
index 82f2abe62..7bb1c1a67 100644
--- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/GeneratedJavaFileAccess.java
+++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/GeneratedJavaFileAccess.java
@@ -2,6 +2,7 @@ package org.eclipse.xtext.xtext.generator.model;
import com.google.common.collect.Iterables;
import java.util.List;
+import java.util.Set;
import java.util.function.Consumer;
import org.eclipse.xtend.lib.annotations.Accessors;
import org.eclipse.xtend2.lib.StringConcatenation;
@@ -65,12 +66,12 @@ public class GeneratedJavaFileAccess extends JavaFileAccess {
return _xblockexpression;
}
- private Iterable getClassAnnotations() {
+ private Set getClassAnnotations() {
final Function1 _function = (IClassAnnotation it) -> {
return Boolean.valueOf(it.appliesTo(this));
};
Iterable _filter = IterableExtensions.filter(this.codeConfig.getClassAnnotations(), _function);
- return Iterables.concat(this.annotations, _filter);
+ return IterableExtensions.toSet(Iterables.concat(this.annotations, _filter));
}
@Override
@@ -79,7 +80,7 @@ public class GeneratedJavaFileAccess extends JavaFileAccess {
_builder.append(this.typeComment);
_builder.newLineIfNotEmpty();
{
- Iterable _classAnnotations = this.getClassAnnotations();
+ Set _classAnnotations = this.getClassAnnotations();
for(final IClassAnnotation annot : _classAnnotations) {
CharSequence _generate = annot.generate();
_builder.append(_generate);
diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/GeneratedClassAnnotation.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/GeneratedClassAnnotation.java
index 772360a26..5641fe081 100644
--- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/GeneratedClassAnnotation.java
+++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/GeneratedClassAnnotation.java
@@ -80,6 +80,16 @@ public class GeneratedClassAnnotation implements IClassAnnotation {
return this.generate().toString();
}
+ @Override
+ public boolean equals(final Object obj) {
+ return (obj instanceof GeneratedClassAnnotation);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.getClass().getName().hashCode();
+ }
+
@Pure
public boolean isIncludeDate() {
return this.includeDate;
diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/IClassAnnotation.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/IClassAnnotation.java
index 02160a9df..485f0f8ef 100644
--- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/IClassAnnotation.java
+++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/IClassAnnotation.java
@@ -7,6 +7,7 @@
*/
package org.eclipse.xtext.xtext.generator.model.annotations;
+import java.lang.annotation.Repeatable;
import org.eclipse.xtext.xtext.generator.XtextGenerator;
import org.eclipse.xtext.xtext.generator.model.JavaFileAccess;
import org.eclipse.xtext.xtext.generator.model.TypeReference;
@@ -14,6 +15,12 @@ import org.eclipse.xtext.xtext.generator.model.TypeReference;
/**
* Class annotations can be added to the {@link XtextGenerator} workflow component in order
* to configure specific Java annotations to be added to each generated class.
+ *
+ * Make sure that you implement {@link Object#equals(Object)} and {@link Object#hashCode()} to fulfill following contract
+ *
+ * - If the underlying Annotation is {@link Repeatable} then the methods should behave like in {@link Object}.
+ * - If the underlying Annotation is NOT {@link Repeatable} then {@link Object#equals(Object)} should return true for all instances and {@link Object#hashCode()} should return the same value for all instances
+ *
*/
@SuppressWarnings("all")
public interface IClassAnnotation {
diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/SingletonClassAnnotation.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/SingletonClassAnnotation.java
index 5428b90d2..f01adb3c1 100644
--- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/SingletonClassAnnotation.java
+++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/SingletonClassAnnotation.java
@@ -36,4 +36,14 @@ public class SingletonClassAnnotation implements IClassAnnotation {
public String toString() {
return this.generate().toString();
}
+
+ @Override
+ public boolean equals(final Object obj) {
+ return (obj instanceof SingletonClassAnnotation);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.getClass().getName().hashCode();
+ }
}
diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/SuppressWarningsAnnotation.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/SuppressWarningsAnnotation.java
index e176500ab..b5bcd7407 100644
--- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/SuppressWarningsAnnotation.java
+++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/model/annotations/SuppressWarningsAnnotation.java
@@ -61,6 +61,16 @@ public class SuppressWarningsAnnotation implements IClassAnnotation {
return this.generate().toString();
}
+ @Override
+ public boolean equals(final Object obj) {
+ return (obj instanceof SuppressWarningsAnnotation);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.getClass().getName().hashCode();
+ }
+
@Pure
public String getSuppress() {
return this.suppress;