@@ -1742,11 +1742,14 @@ public String apply(String name) {
1742
1742
}
1743
1743
});
1744
1744
1745
+ // NOTE: We can't use this optimization for classes generated by ValueResolverGenerator because we cannot easily
1746
+ // map a target class to a specific set of generated classes
1745
1747
ExistingValueResolvers existingValueResolvers = liveReloadBuildItem .getContextObject (ExistingValueResolvers .class );
1746
1748
if (existingValueResolvers == null ) {
1747
1749
existingValueResolvers = new ExistingValueResolvers ();
1748
1750
liveReloadBuildItem .setContextObject (ExistingValueResolvers .class , existingValueResolvers );
1749
1751
}
1752
+ Set <String > generatedValueResolvers = new HashSet <>();
1750
1753
1751
1754
ValueResolverGenerator .Builder builder = ValueResolverGenerator .builder ()
1752
1755
.setIndex (index ).setClassOutput (classOutput );
@@ -1770,15 +1773,11 @@ public Function<FieldInfo, String> apply(ClassInfo clazz) {
1770
1773
Set <DotName > controlled = new HashSet <>();
1771
1774
Map <DotName , AnnotationInstance > uncontrolled = new HashMap <>();
1772
1775
for (TemplateDataBuildItem data : templateData ) {
1773
- processTemplateData (data , controlled , uncontrolled , builder , existingValueResolvers , applicationClassPredicate );
1776
+ processTemplateData (data , controlled , uncontrolled , builder );
1774
1777
}
1775
1778
1776
1779
for (ImplicitValueResolverBuildItem implicit : implicitClasses ) {
1777
1780
DotName implicitClassName = implicit .getClazz ().name ();
1778
- if (existingValueResolvers .contains (implicitClassName )) {
1779
- // A non-application value resolver already generated
1780
- continue ;
1781
- }
1782
1781
if (controlled .contains (implicitClassName )) {
1783
1782
LOGGER .debugf ("Implicit value resolver for %s ignored: class is annotated with @TemplateData" ,
1784
1783
implicitClassName );
@@ -1790,24 +1789,23 @@ public Function<FieldInfo, String> apply(ClassInfo clazz) {
1790
1789
continue ;
1791
1790
}
1792
1791
builder .addClass (implicit .getClazz (), implicit .getTemplateData ());
1793
- existingValueResolvers .add (implicitClassName , applicationClassPredicate );
1794
1792
}
1795
1793
1796
1794
ValueResolverGenerator generator = builder .build ();
1797
1795
generator .generate ();
1798
-
1799
- Set <String > generatedValueResolvers = new HashSet <>();
1800
1796
generatedValueResolvers .addAll (generator .getGeneratedTypes ());
1801
1797
1802
1798
ExtensionMethodGenerator extensionMethodGenerator = new ExtensionMethodGenerator (index , classOutput );
1803
1799
Map <DotName , Map <String , List <TemplateExtensionMethodBuildItem >>> classToNamespaceExtensions = new HashMap <>();
1804
1800
Map <String , DotName > namespaceToClass = new HashMap <>();
1805
1801
1806
1802
for (TemplateExtensionMethodBuildItem templateExtension : templateExtensionMethods ) {
1807
- if (existingValueResolvers .contains (templateExtension .getMethod ())) {
1803
+ String generatedValueResolverClass = existingValueResolvers .getGeneratedClass (templateExtension .getMethod ());
1804
+ if (generatedValueResolverClass != null ) {
1805
+ // A ValueResolver of a non-application class was already generated
1806
+ generatedValueResolvers .add (generatedValueResolverClass );
1808
1807
continue ;
1809
1808
}
1810
- existingValueResolvers .add (templateExtension .getMethod (), applicationClassPredicate );
1811
1809
1812
1810
if (templateExtension .hasNamespace ()) {
1813
1811
// Group extension methods declared on the same class by namespace
@@ -1835,8 +1833,10 @@ public Function<FieldInfo, String> apply(ClassInfo clazz) {
1835
1833
namespaceMethods .add (templateExtension );
1836
1834
} else {
1837
1835
// Generate ValueResolver per extension method
1838
- extensionMethodGenerator .generate (templateExtension .getMethod (), templateExtension .getMatchName (),
1836
+ String generatedClass = extensionMethodGenerator .generate (templateExtension .getMethod (),
1837
+ templateExtension .getMatchName (),
1839
1838
templateExtension .getMatchNames (), templateExtension .getMatchRegex (), templateExtension .getPriority ());
1839
+ existingValueResolvers .add (templateExtension .getMethod (), generatedClass , applicationClassPredicate );
1840
1840
}
1841
1841
}
1842
1842
@@ -1853,6 +1853,10 @@ public Function<FieldInfo, String> apply(ClassInfo clazz) {
1853
1853
try (NamespaceResolverCreator namespaceResolverCreator = extensionMethodGenerator
1854
1854
.createNamespaceResolver (priorityEntry .getValue ().get (0 ).getMethod ().declaringClass (),
1855
1855
nsEntry .getKey (), priorityEntry .getKey ())) {
1856
+ for (TemplateExtensionMethodBuildItem extensionMethod : priorityEntry .getValue ()) {
1857
+ existingValueResolvers .add (extensionMethod .getMethod (), namespaceResolverCreator .getClassName (),
1858
+ applicationClassPredicate );
1859
+ }
1856
1860
try (ResolveCreator resolveCreator = namespaceResolverCreator .implementResolve ()) {
1857
1861
for (TemplateExtensionMethodBuildItem method : priorityEntry .getValue ()) {
1858
1862
resolveCreator .addMethod (method .getMethod (), method .getMatchName (), method .getMatchNames (),
@@ -1901,28 +1905,25 @@ public Function<FieldInfo, String> apply(ClassInfo clazz) {
1901
1905
*/
1902
1906
static class ExistingValueResolvers {
1903
1907
1904
- final Set <String > identifiers = new HashSet <>();
1905
-
1906
- boolean contains (DotName className ) {
1907
- return identifiers .contains (className .toString ());
1908
- }
1908
+ final Map <String , String > identifiersToGeneratedClass = new HashMap <>();
1909
1909
1910
1910
boolean contains (MethodInfo extensionMethod ) {
1911
- return identifiers .contains (extensionMethod .declaringClass ().toString () + "#" + extensionMethod .toString ());
1911
+ return identifiersToGeneratedClass
1912
+ .containsKey (toKey (extensionMethod ));
1912
1913
}
1913
1914
1914
- boolean add (DotName className , Predicate <DotName > applicationClassPredicate ) {
1915
- if (!applicationClassPredicate .test (className )) {
1916
- return identifiers .add (className .toString ());
1917
- }
1918
- return false ;
1915
+ String getGeneratedClass (MethodInfo extensionMethod ) {
1916
+ return identifiersToGeneratedClass .get (toKey (extensionMethod ));
1919
1917
}
1920
1918
1921
- boolean add (MethodInfo extensionMethod , Predicate <DotName > applicationClassPredicate ) {
1919
+ void add (MethodInfo extensionMethod , String className , Predicate <DotName > applicationClassPredicate ) {
1922
1920
if (!applicationClassPredicate .test (extensionMethod .declaringClass ().name ())) {
1923
- return identifiers . add ( extensionMethod . declaringClass (). toString () + "#" + extensionMethod . toString () );
1921
+ identifiersToGeneratedClass . put ( toKey ( extensionMethod ), className );
1924
1922
}
1925
- return false ;
1923
+ }
1924
+
1925
+ private String toKey (MethodInfo extensionMethod ) {
1926
+ return extensionMethod .declaringClass ().toString () + "#" + extensionMethod .toString ();
1926
1927
}
1927
1928
}
1928
1929
@@ -2942,22 +2943,15 @@ private static boolean methodMatches(MethodInfo method, VirtualMethodPart virtua
2942
2943
}
2943
2944
2944
2945
private void processTemplateData (TemplateDataBuildItem templateData ,
2945
- Set <DotName > controlled , Map <DotName , AnnotationInstance > uncontrolled , ValueResolverGenerator .Builder builder ,
2946
- ExistingValueResolvers existingValueResolvers ,
2947
- CompletedApplicationClassPredicateBuildItem applicationClassPredicate ) {
2946
+ Set <DotName > controlled , Map <DotName , AnnotationInstance > uncontrolled , ValueResolverGenerator .Builder builder ) {
2948
2947
DotName targetClassName = templateData .getTargetClass ().name ();
2949
- if (existingValueResolvers .contains (targetClassName )) {
2950
- return ;
2951
- }
2952
2948
if (templateData .isTargetAnnotatedType ()) {
2953
2949
controlled .add (targetClassName );
2954
2950
builder .addClass (templateData .getTargetClass (), templateData .getAnnotationInstance ());
2955
- existingValueResolvers .add (targetClassName , applicationClassPredicate );
2956
2951
} else {
2957
2952
// At this point we can be sure that multiple unequal @TemplateData do not exist for a specific target
2958
2953
uncontrolled .computeIfAbsent (targetClassName , name -> {
2959
2954
builder .addClass (templateData .getTargetClass (), templateData .getAnnotationInstance ());
2960
- existingValueResolvers .add (targetClassName , applicationClassPredicate );
2961
2955
return templateData .getAnnotationInstance ();
2962
2956
});
2963
2957
}
0 commit comments