From b5055c9affc9cad423158f719a7e19d76f7d9010 Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Fri, 3 Feb 2017 09:35:55 +0100 Subject: [PATCH] Respect @Repeatable property of Annotations in the Xtext Generator. Fixes #270 Signed-off-by: Christian Dietrich --- .../eclipse/xtext/xtext/generator/CodeConfig.xtend | 2 +- .../generator/model/GeneratedJavaFileAccess.xtend | 3 +-- .../model/annotations/GeneratedClassAnnotation.xtend | 8 ++++++++ .../model/annotations/IClassAnnotation.xtend | 7 +++++++ .../model/annotations/SingletonClassAnnotation.xtend | 8 ++++++++ .../annotations/SuppressWarningsAnnotation.xtend | 11 ++++++++++- .../generator/model/GeneratedJavaFileAccess.java | 7 ++++--- .../model/annotations/GeneratedClassAnnotation.java | 10 ++++++++++ .../generator/model/annotations/IClassAnnotation.java | 7 +++++++ .../model/annotations/SingletonClassAnnotation.java | 10 ++++++++++ .../model/annotations/SuppressWarningsAnnotation.java | 10 ++++++++++ 11 files changed, 76 insertions(+), 7 deletions(-) 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 + * */ 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;