You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by as...@apache.org on 2026/08/23 05:48:33 UTC
(grails-website) branch asf-site-production updated: Deploying to documentation branch - 05:48:12
This is an automated email from the ASF dual-hosted git repository.
asf-ci-deploy pushed a commit to branch asf-site-production
in repository https://gitbox.apache.org/repos/asf/grails-website.git
The following commit(s) were added to refs/heads/asf-site-production by this push:
new 7bd8d861cc8 Deploying to documentation branch - 05:48:12
7bd8d861cc8 is described below
commit 7bd8d861cc8abca69fdb514434d15b7e03c54b7e
Author: codeconsole <co...@users.noreply.github.com>
AuthorDate: Sun Aug 23 05:48:15 2026 +0000
Deploying to documentation branch - 05:48:12
---
docs/snapshot/api/allclasses-frame.html | 17 +
docs/snapshot/api/deprecated-list.html | 5 +
docs/snapshot/api/grails/artefact/TagLibrary.html | 14 +-
.../traits/CompiledTagCallTransformation.html} | 66 +-
.../api/grails/compiler/traits/package-frame.html | 2 +-
.../grails/compiler/traits/package-summary.html | 8 +
.../taglib/compiler/CompiledTagCallRewriter.html | 373 +++++++++++
.../TagLibArtefactTypeAstTransformation.html | 37 ++
.../grails/gsp/taglib/compiler/package-frame.html | 2 +-
.../gsp/taglib/compiler/package-summary.html | 8 +
.../grails/plugins/mail/PlainTextMailTagLib.html | 60 +-
docs/snapshot/api/index-all.html | 336 +++++++++-
.../common/compiler/GroovyTransformOrder.html | 82 ++-
.../TagLibraryInvokerTypeCheckingExtension.html | 7 +
.../plugin/core/GrailsCompileStaticOptions.html | 70 +++
.../views/gsp/GenerateTagLibraryIndexTask.html | 527 ++++++++++++++++
.../plugin/views/gsp/TagLibraryIndexFiles.html} | 242 ++++----
.../gradle/plugin/views/gsp/package-frame.html | 2 +-
.../gradle/plugin/views/gsp/package-summary.html | 16 +
.../org/grails/gsp/CompileStaticGroovyPage.html | 2 +-
docs/snapshot/api/org/grails/gsp/GroovyPage.html | 54 +-
.../api/org/grails/gsp/GroovyPagesMetaUtils.html | 10 +-
.../org/grails/gsp/ModelRecordingGroovyPage.html | 2 +-
...thodInvoker.html => CompiledTagInvocation.html} | 117 ++--
.../org/grails/taglib/NamespacedTagDispatcher.html | 53 +-
.../api/org/grails/taglib/TagLibraryMetaUtils.html | 30 +-
.../api/org/grails/taglib/TagMethodInvoker.html | 59 +-
.../taglib/TemplateNamespacedTagDispatcher.html | 26 +-
.../discovery/AstTagLibraryView.html} | 90 ++-
.../AstTagMethodView.html} | 165 ++---
.../discovery/ReflectedTagLibraryView.html} | 90 ++-
.../ReflectedTagMethodView.html} | 159 ++---
.../taglib/discovery/TagDiscoveryRules.html} | 134 ++--
.../discovery/TagLibraryAstDiscovery.html} | 146 +++--
.../discovery/TagLibraryView.html} | 159 ++---
.../org/grails/taglib/discovery/TagMethodView.html | 435 +++++++++++++
.../grails/taglib/discovery}/package-frame.html | 16 +-
.../grails/taglib/discovery}/package-summary.html | 84 +--
.../org/grails/taglib/index/TagLibraryIndex.html | 681 +++++++++++++++++++++
.../grails/taglib/index/TagLibraryIndexEntry.html | 237 +++++++
.../TagLibraryIndexGenerator.html} | 151 ++---
.../TagLibraryIndexWriter.html} | 145 ++---
.../grails/taglib/index}/package-frame.html | 8 +-
.../grails/taglib/index}/package-summary.html | 32 +-
.../api/org/grails/taglib/package-frame.html | 2 +-
.../api/org/grails/taglib/package-summary.html | 10 +-
docs/snapshot/api/overview-frame.html | 6 +
docs/snapshot/api/overview-summary.html | 12 +
docs/snapshot/api/package-list | 2 +
.../developer-manual/gettingStarted.html | 2 +-
.../grails-data/developer-manual/introduction.html | 2 +-
.../grails-data/developer-manual/stepByStep.html | 2 +-
.../grails-data/developer-manual/testing.html | 2 +-
.../developer-manual/understandingApi.html | 2 +-
.../understandingApi/datastoreBasics.html | 2 +-
.../understandingApi/gormApis.html | 2 +-
.../understandingApi/gormEnhancer.html | 2 +-
.../understandingApi/implementingCrud.html | 2 +-
.../understandingApi/implementingQueries.html | 2 +-
.../understandingApi/secondaryIndexes.html | 2 +-
.../grails-data/whats-new-manual/index.html | 2 +-
docs/snapshot/guide/index.html | 6 +-
docs/snapshot/guide/introduction.html | 49 ++
docs/snapshot/guide/single.html | 607 +++++++++++++++++-
docs/snapshot/guide/theWebLayer.html | 363 ++++++++++-
docs/snapshot/guide/upgrading.html | 196 ++++++
docs/snapshot/index.html | 6 +-
67 files changed, 5184 insertions(+), 1058 deletions(-)
diff --git a/docs/snapshot/api/allclasses-frame.html b/docs/snapshot/api/allclasses-frame.html
index 356868bd649..5b3d81c7196 100644
--- a/docs/snapshot/api/allclasses-frame.html
+++ b/docs/snapshot/api/allclasses-frame.html
@@ -263,6 +263,8 @@
<li><a href="org/grails/datastore/mapping/reflect/AstGenericsUtils.html" title="class in org.grails.datastore.mapping.reflect" target="classFrame">AstGenericsUtils</a></li>
<li><a href="org/grails/datastore/gorm/transform/AstMethodDispatchUtils.html" title="class in org.grails.datastore.gorm.transform" target="classFrame">AstMethodDispatchUtils</a></li>
<li><a href="org/grails/datastore/gorm/transform/AstPropertyResolveUtils.html" title="class in org.grails.datastore.gorm.transform" target="classFrame">AstPropertyResolveUtils</a></li>
+<li><a href="org/grails/taglib/discovery/AstTagLibraryView.html" title="class in org.grails.taglib.discovery" target="classFrame">AstTagLibraryView</a></li>
+<li><a href="org/grails/taglib/discovery/AstTagMethodView.html" title="class in org.grails.taglib.discovery" target="classFrame">AstTagMethodView</a></li>
<li><a href="grails/compiler/ast/AstTransformer.html" title="annotation type in grails.compiler.ast" target="classFrame">AstTransformer</a></li>
<li><a href="org/grails/datastore/mapping/reflect/AstUtils.html" title="class in org.grails.datastore.mapping.reflect" target="classFrame">AstUtils</a></li>
<li><a href="org/grails/cli/compiler/AstUtils.html" title="class in org.grails.cli.compiler" target="classFrame">AstUtils</a></li>
@@ -559,6 +561,9 @@
<li><a href="org/apache/grails/buildsrc/CompilePlugin.html" title="class in org.apache.grails.buildsrc" target="classFrame">CompilePlugin</a></li>
<li><a href="org/grails/compiler/injection/CompileStaticArtefactInjector.html" title="class in org.grails.compiler.injection" target="classFrame">CompileStaticArtefactInjector</a></li>
<li><a href="org/grails/gsp/CompileStaticGroovyPage.html" title="class in org.grails.gsp" target="classFrame">CompileStaticGroovyPage</a></li>
+<li><a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html" title="class in grails.gsp.taglib.compiler" target="classFrame">CompiledTagCallRewriter</a></li>
+<li><a href="grails/compiler/traits/CompiledTagCallTransformation.html" title="class in grails.compiler.traits" target="classFrame">CompiledTagCallTransformation</a></li>
+<li><a href="org/grails/taglib/CompiledTagInvocation.html" title="class in org.grails.taglib" target="classFrame">CompiledTagInvocation</a></li>
<li><a href="org/grails/cli/compiler/CompilerAutoConfiguration.html" title="class in org.grails.cli.compiler" target="classFrame">CompilerAutoConfiguration</a></li>
<li><a href="org/grails/cli/command/options/CompilerOptionHandler.html" title="class in org.grails.cli.command.options" target="classFrame">CompilerOptionHandler</a></li>
<li><a href="org/grails/gorm/graphql/entity/arguments/ComplexArgument.html" title="class in org.grails.gorm.graphql.entity.arguments" target="classFrame">ComplexArgument</a></li>
@@ -1282,6 +1287,7 @@
<li><a href="org/apache/grails/buildsrc/GenerateAutoConfigurationImportsTask.html" title="class in org.apache.grails.buildsrc" target="classFrame">GenerateAutoConfigurationImportsTask</a></li>
<li><a href="org/grails/gradle/plugin/i18n/GenerateI18nDescriptorTask.html" title="class in org.grails.gradle.plugin.i18n" target="classFrame">GenerateI18nDescriptorTask</a></li>
<li><a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html" title="class in org.apache.grails.gradle.plugin.aot" target="classFrame">GenerateNativeMetadataTask</a></li>
+<li><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GenerateTagLibraryIndexTask</a></li>
<li><a href="org/grails/orm/hibernate/cfg/domainbinding/util/GeneratorCreationContextWrapper.html" title="class in org.grails.orm.hibernate.cfg.domainbinding.util" target="classFrame">GeneratorCreationContextWrapper</a></li>
<li><a href="org/grails/spring/beans/factory/GenericBeanFactoryAccessor.html" title="class in org.grails.spring.beans.factory" target="classFrame">GenericBeanFactoryAccessor</a></li>
<li><a href="org/grails/cli/compiler/GenericBomAstTransformation.html" title="class in org.grails.cli.compiler" target="classFrame">GenericBomAstTransformation</a></li>
@@ -2942,6 +2948,8 @@
<li><a href="grails/plugins/redis/RedisService.html" title="class in grails.plugins.redis" target="classFrame">RedisService</a></li>
<li><a href="grails/plugin/springsecurity/rest/token/storage/RedisTokenStorageService.html" title="class in grails.plugin.springsecurity.rest.token.storage" target="classFrame">RedisTokenStorageService</a></li>
<li><a href="grails/plugins/redis/ast/RedisTransformOrder.html" title="interface in grails.plugins.redis.ast" target="classFrame"><I>RedisTransformOrder</I></a></li>
+<li><a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html" title="class in org.grails.taglib.discovery" target="classFrame">ReflectedTagLibraryView</a></li>
+<li><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html" title="class in org.grails.taglib.discovery" target="classFrame">ReflectedTagMethodView</a></li>
<li><a href="org/grails/datastore/gorm/utils/ReflectionUtils.html" title="class in org.grails.datastore.gorm.utils" target="classFrame">ReflectionUtils</a></li>
<li><a href="org/grails/datastore/mapping/reflect/ReflectionUtils.html" title="class in org.grails.datastore.mapping.reflect" target="classFrame">ReflectionUtils</a></li>
<li><a href="grails/plugin/springsecurity/ReflectionUtils.html" title="class in grails.plugin.springsecurity" target="classFrame">ReflectionUtils</a></li>
@@ -3349,6 +3357,7 @@
<li><a href="liquibase/ext/hibernate/snapshot/extension/TableGeneratorSnapshotGenerator.html" title="class in liquibase.ext.hibernate.snapshot.extension" target="classFrame">TableGeneratorSnapshotGenerator</a></li>
<li><a href="grails/gsp/Tag.html" title="annotation type in grails.gsp" target="classFrame">Tag</a></li>
<li><a href="org/grails/taglib/TagBodyClosure.html" title="class in org.grails.taglib" target="classFrame">TagBodyClosure</a></li>
+<li><a href="org/grails/taglib/discovery/TagDiscoveryRules.html" title="class in org.grails.taglib.discovery" target="classFrame">TagDiscoveryRules</a></li>
<li><a href="grails/gsp/TagLib.html" title="annotation type in grails.gsp" target="classFrame">TagLib</a></li>
<li><a href="org/grails/core/artefact/gsp/TagLibArtefactHandler.html" title="class in org.grails.core.artefact.gsp" target="classFrame">TagLibArtefactHandler</a></li>
<li><a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html" title="class in grails.gsp.taglib.compiler" target="classFrame">TagLibArtefactTypeAstTransformation</a></li>
@@ -3357,6 +3366,12 @@
<li><a href="org/apache/grails/gsp/taglib/aot/TagLibRuntimeHints.html" title="class in org.apache.grails.gsp.taglib.aot" target="classFrame">TagLibRuntimeHints</a></li>
<li><a href="grails/testing/web/taglib/TagLibUnitTest.html" title="trait in grails.testing.web.taglib" target="classFrame"><I>TagLibUnitTest</I></a></li>
<li><a href="grails/artefact/TagLibrary.html" title="trait in grails.artefact" target="classFrame"><I>TagLibrary</I></a></li>
+<li><a href="org/grails/taglib/discovery/TagLibraryAstDiscovery.html" title="class in org.grails.taglib.discovery" target="classFrame">TagLibraryAstDiscovery</a></li>
+<li><a href="org/grails/taglib/index/TagLibraryIndex.html" title="class in org.grails.taglib.index" target="classFrame">TagLibraryIndex</a></li>
+<li><a href="org/grails/taglib/index/TagLibraryIndexEntry.html" title="record in org.grails.taglib.index" target="classFrame">TagLibraryIndexEntry</a></li>
+<li><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">TagLibraryIndexFiles</a></li>
+<li><a href="org/grails/taglib/index/TagLibraryIndexGenerator.html" title="class in org.grails.taglib.index" target="classFrame">TagLibraryIndexGenerator</a></li>
+<li><a href="org/grails/taglib/index/TagLibraryIndexWriter.html" title="class in org.grails.taglib.index" target="classFrame">TagLibraryIndexWriter</a></li>
<li><a href="grails/artefact/gsp/TagLibraryInvoker.html" title="trait in grails.artefact.gsp" target="classFrame"><I>TagLibraryInvoker</I></a></li>
<li><a href="org/grails/compiler/TagLibraryInvokerTypeCheckingExtension.html" title="class in org.grails.compiler" target="classFrame">TagLibraryInvokerTypeCheckingExtension</a></li>
<li><a href="org/grails/taglib/TagLibraryLookup.html" title="class in org.grails.taglib" target="classFrame">TagLibraryLookup</a></li>
@@ -3365,8 +3380,10 @@
<li><a href="org/grails/gsp/jsp/TagLibraryResolverImpl.html" title="class in org.grails.gsp.jsp" target="classFrame">TagLibraryResolverImpl</a></li>
<li><a href="grails/compiler/traits/TagLibraryTraitInjector.html" title="class in grails.compiler.traits" target="classFrame">TagLibraryTraitInjector</a></li>
<li><a href="org/grails/compiler/web/taglib/TagLibraryTransformer.html" title="class in org.grails.compiler.web.taglib" target="classFrame">TagLibraryTransformer</a></li>
+<li><a href="org/grails/taglib/discovery/TagLibraryView.html" title="interface in org.grails.taglib.discovery" target="classFrame"><I>TagLibraryView</I></a></li>
<li><a href="org/grails/taglib/TagMethodContext.html" title="class in org.grails.taglib" target="classFrame">TagMethodContext</a></li>
<li><a href="org/grails/taglib/TagMethodInvoker.html" title="class in org.grails.taglib" target="classFrame">TagMethodInvoker</a></li>
+<li><a href="org/grails/taglib/discovery/TagMethodView.html" title="interface in org.grails.taglib.discovery" target="classFrame"><I>TagMethodView</I></a></li>
<li><a href="org/grails/taglib/TagOutput.html" title="class in org.grails.taglib" target="classFrame">TagOutput</a></li>
<li><a href="org/grails/taglib/TagOutput.ConstantClosure.html" title="class in org.grails.taglib.TagOutput" target="classFrame">TagOutput.ConstantClosure</a></li>
<li><a href="org/apache/grails/data/testing/tck/domains/Task.html" title="class in org.apache.grails.data.testing.tck.domains" target="classFrame">Task</a></li>
diff --git a/docs/snapshot/api/deprecated-list.html b/docs/snapshot/api/deprecated-list.html
index 1f57a7ee45c..6f97dde4b3c 100644
--- a/docs/snapshot/api/deprecated-list.html
+++ b/docs/snapshot/api/deprecated-list.html
@@ -467,6 +467,11 @@ if (location.href.indexOf('is-external=true') == -1) {
</i></div>
</td>
</tr>
+ <tr class="altColor">
+ <td class="colOne"><strong><a href="org/grails/gsp/GroovyPagesMetaUtils.html#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">GroovyPagesMetaUtils#registerMethodMissingForGSP</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)
+ <div class="block"><i>Nothing is installed onto a page's metaclass any more.</i></div>
+ </td>
+ </tr>
<tr class="altColor">
<td class="colOne"><strong><a href="org/grails/orm/hibernate/event/listener/HibernateEventListener.html#getTimestampProvider()">HibernateEventListener#getTimestampProvider</a></strong>()
<div class="block"><i><DL><DT><B>deprecated:</B></DT><DD>Replaced by <a href='../../../../../../org/grails/datastore/gorm/events/AutoTimestampEventListener.html' title='AutoTimestampEventListener'>AutoTimestampEventListener</a></DD></DL> </i></div>
diff --git a/docs/snapshot/api/grails/artefact/TagLibrary.html b/docs/snapshot/api/grails/artefact/TagLibrary.html
index b90b98cdf71..9b44d08f815 100644
--- a/docs/snapshot/api/grails/artefact/TagLibrary.html
+++ b/docs/snapshot/api/grails/artefact/TagLibrary.html
@@ -195,7 +195,7 @@ implements <a href='../../grails/web/api/ServletAttributes.html'>ServletAttribut
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>void</code></td>
- <td class="colLast"><code><strong><a href="#initializeTagLibrary()">initializeTagLibrary</a></strong>()</code><br></td>
+ <td class="colLast"><code><strong><a href="#initializeTagLibrary()">initializeTagLibrary</a></strong>()</code><br>Retained deliberately, and deliberately empty.</td>
</tr>
<tr class="altColor">
@@ -318,7 +318,17 @@ implements <a href='../../grails/web/api/ServletAttributes.html'>ServletAttribut
<ul class="blockListLast">
<li class="blockList">
<h4>@jakarta.annotation.PostConstruct<br>void <strong>initializeTagLibrary</strong>()</h4>
- <p></p>
+ <p> Retained deliberately, and deliberately empty.
+
+ <p>Every tag in every namespace used to be installed onto this tag library's metaclass here, so
+ that a tag library calling another tag found a method rather than falling through to
+ methodMissing. Tags are resolved through the tag library lookup instead, so there is nothing to
+ install and nothing to initialise.
+
+ <p>It cannot simply be deleted. A trait method is part of the binary contract: Groovy weaves a
+ call to the generated helper into every implementing class, so a tag library from a plugin
+ compiled against an earlier release calls this method by name at construction. Removing it
+ raises NoSuchMethodError for every such tag library - which is what happened when it was.</p>
</li>
</ul>
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html b/docs/snapshot/api/grails/compiler/traits/CompiledTagCallTransformation.html
similarity index 74%
copy from docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
copy to docs/snapshot/api/grails/compiler/traits/CompiledTagCallTransformation.html
index e41bcd7ea46..eafe364deb7 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
+++ b/docs/snapshot/api/grails/compiler/traits/CompiledTagCallTransformation.html
@@ -27,7 +27,7 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)</title>
+ <title>CompiledTagCallTransformation (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
@@ -37,7 +37,7 @@
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="CompiledTagCallTransformation (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -63,8 +63,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../index.html?grails/compiler/traits/CompiledTagCallTransformation" target="_top">Frames</a></li>
+ <li><a href="CompiledTagCallTransformation.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,25 +85,47 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.gsp</strong></div>
+ <div class="subTitle">Package: <strong>grails.compiler.traits</strong></div>
- <h2 title="[Groovy] Class GroovyPagesMetaUtils" class="title">[Groovy] Class GroovyPagesMetaUtils</h2>
+ <h2 title="[Groovy] Class CompiledTagCallTransformation" class="title">[Groovy] Class CompiledTagCallTransformation</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gsp.GroovyPagesMetaUtils
+<li><ul class="inheritance"></ul></li><li>grails.compiler.traits.CompiledTagCallTransformation
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
+ <dl>
+ <dt>All Implemented Interfaces and Traits:</dt>
+ <dd>org.codehaus.groovy.transform.ASTTransformation, org.codehaus.groovy.transform.TransformWithPriority</dd>
+ </dl>
+
<!-- todo: direct known subclasses -->
<hr>
<pre>@groovy.transform.CompileStatic
-class GroovyPagesMetaUtils
-extends java.lang.Object</pre>
+@org.codehaus.groovy.transform.GroovyASTTransformation(phase: CompilePhase.INSTRUCTION_SELECTION)
+class CompiledTagCallTransformation
+extends java.lang.Object
+implements org.codehaus.groovy.transform.ASTTransformation, org.codehaus.groovy.transform.TransformWithPriority</pre>
+
+ <p> Compiles a call to a known tag into a direct invocation, wherever tags can be called from.
+
+ <p>A tag library rewrites its own calls as it is compiled, but a controller can call tags too, and
+ gains that ability from the TagLibraryInvoker trait rather than from being a tag library.
+ Any class carrying that trait is therefore a candidate, which covers controllers without naming
+ them and without a second copy of the rewriting rules. A compiled GSP calls tags as well, and
+ reaches them through <CODE>GroovyPage</CODE> rather than through the trait, so it is matched separately.
+
+ <p>Runs in a later phase than trait injection, since whether a class can call tags is only settled
+ once its traits have been applied. Ordering by priority within a phase was not enough: it holds for
+ transforms that declare one, but a trait arriving from a local transform is applied after every
+ global transform has run, so a class compiled from outside the conventional directory was read
+ before it carried the trait, and the same source read as a convention class was read after. Waiting
+ for the phase reads every class once it is whole, which is what the rewrite needs to decide. <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -140,7 +162,7 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#GroovyPagesMetaUtils()">GroovyPagesMetaUtils</a></strong>()</code><br></td>
+ <code><strong><a href="#CompiledTagCallTransformation()">CompiledTagCallTransformation</a></strong>()</code><br></td>
</tr>
</table>
@@ -166,14 +188,14 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>int</code></td>
+ <td class="colLast"><code><strong><a href="#priority()">priority</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>void</code></td>
+ <td class="colLast"><code><strong><a href="#visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)">visit</a></strong>(org.codehaus.groovy.ast.ASTNode[] nodes, org.codehaus.groovy.control.SourceUnit source)</code><br></td>
</tr>
</table>
@@ -223,10 +245,10 @@ extends java.lang.Object</pre>
</a>
<h3>Constructor Detail</h3>
- <a name="GroovyPagesMetaUtils()"><!-- --></a>
+ <a name="CompiledTagCallTransformation()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>GroovyPagesMetaUtils</strong>()</h4>
+ <h4><strong>CompiledTagCallTransformation</strong>()</h4>
<p></p>
</li>
</ul>
@@ -244,18 +266,18 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="priority()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>int <strong>priority</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>void <strong>visit</strong>(org.codehaus.groovy.ast.ASTNode[] nodes, org.codehaus.groovy.control.SourceUnit source)</h4>
<p></p>
</li>
</ul>
@@ -287,8 +309,8 @@ extends java.lang.Object</pre>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../index.html?grails/compiler/traits/CompiledTagCallTransformation" target="_top">Frames</a></li>
+ <li><a href="CompiledTagCallTransformation.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/grails/compiler/traits/package-frame.html b/docs/snapshot/api/grails/compiler/traits/package-frame.html
index 87791c22714..a4f3115da89 100644
--- a/docs/snapshot/api/grails/compiler/traits/package-frame.html
+++ b/docs/snapshot/api/grails/compiler/traits/package-frame.html
@@ -51,7 +51,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="ControllerTagLibraryTraitInjector.html" title="class in grails.compiler.traits" target="classFrame">ControllerTagLibraryTraitInjector</a></li><li><a href="ControllerTraitInjector.html" title="class in grails.compiler.traits" target="classFrame">ControllerTraitInjector</a></li><li><a href="DomainClassTraitInjector.html" title="class in grails.compiler.traits" target="classFrame">DomainClassTraitInjector</a></li><li><a href="InterceptorTraitInjector.html" title="class [...]
+ <li><a href="CompiledTagCallTransformation.html" title="class in grails.compiler.traits" target="classFrame">CompiledTagCallTransformation</a></li><li><a href="ControllerTagLibraryTraitInjector.html" title="class in grails.compiler.traits" target="classFrame">ControllerTagLibraryTraitInjector</a></li><li><a href="ControllerTraitInjector.html" title="class in grails.compiler.traits" target="classFrame">ControllerTraitInjector</a></li><li><a href="DomainClassTraitInjector.html" tit [...]
</ul>
</div>
diff --git a/docs/snapshot/api/grails/compiler/traits/package-summary.html b/docs/snapshot/api/grails/compiler/traits/package-summary.html
index 90e5689dd9e..a7593d3ec11 100644
--- a/docs/snapshot/api/grails/compiler/traits/package-summary.html
+++ b/docs/snapshot/api/grails/compiler/traits/package-summary.html
@@ -114,6 +114,14 @@ function windowTitle()
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="CompiledTagCallTransformation.html" title="class in grails/compiler/traits">
+ CompiledTagCallTransformation
+ </a></strong>
+ </td>
+ <td>Compiles a call to a known tag into a direct invocation, wherever tags can be called from.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="ControllerTagLibraryTraitInjector.html" title="class in grails/compiler/traits">
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/CompiledTagCallRewriter.html b/docs/snapshot/api/grails/gsp/taglib/compiler/CompiledTagCallRewriter.html
new file mode 100644
index 00000000000..ce463b76a8a
--- /dev/null
+++ b/docs/snapshot/api/grails/gsp/taglib/compiler/CompiledTagCallRewriter.html
@@ -0,0 +1,373 @@
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- **************************************************************** -->
+<!-- * PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
+<!-- * i.e. only iterate & print data where possible. Thanks, Jez. * -->
+<!-- **************************************************************** -->
+
+<html>
+<head>
+ <!-- Generated by groovydoc (5.1.0) -->
+ <title>CompiledTagCallRewriter (Grails 8.0.0-SNAPSHOT)</title>
+
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
+
+<body class="center">
+<script type="text/javascript"><!--
+if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="CompiledTagCallRewriter (Grails 8.0.0-SNAPSHOT)";
+}
+//-->
+</script>
+<noscript>
+ <div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+ <!-- -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../index.html?grails/gsp/taglib/compiler/CompiledTagCallRewriter" target="_top">Frames</a></li>
+ <li><a href="CompiledTagCallRewriter.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ </ul>
+ </div>
+ <a name="skip-navbar_top">
+ <!-- -->
+ </a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+
+ <div class="subTitle">Package: <strong>grails.gsp.taglib.compiler</strong></div>
+
+ <h2 title="[Java] Class CompiledTagCallRewriter" class="title">[Java] Class CompiledTagCallRewriter</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><ul class="inheritance"></ul></li><li><ul class="inheritance"></ul></li><li><ul class="inheritance"></ul></li><li><ul class="inheritance"></ul></li><li>grails.gsp.taglib.compiler.CompiledTagCallRewriter
+</ul>
+<div class="description">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+ <!-- todo: direct known subclasses -->
+ <hr>
+
+<pre>public class CompiledTagCallRewriter
+extends org.codehaus.groovy.ast.ClassCodeExpressionTransformer</pre>
+
+ <p> Rewrites a call to a known tag into a direct invocation.
+
+ <p>Writing <CODE>g.message(code: 'x')</CODE> reaches the tag library through <CODE>propertyMissing</CODE> to
+ find the namespace and <CODE>invokeMethod</CODE> to find the tag, which is a dynamic call site even in a
+ statically compiled class. Both the namespace and the tag name are fixed in the source, and the tag
+ library index says whether that tag exists, so the call is replaced with a call to
+ CompiledTagInvocation, an ordinary static method call.
+
+ <p>The tag is still selected by name at runtime, through the same lookup the dynamic path uses, so
+ a tag library registered later, one that overrides another, and the order tag libraries are
+ registered in all decide the outcome exactly as they did before. Nothing is bound to a particular
+ tag library class.
+
+ <p>A namespace the index does not know is left alone, which is what keeps a tag library registered
+ at runtime working, as is a name that something else in scope already answers to.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
+ </li>
+ </ul>
+</div>
+
+<div class="summary">
+ <ul class="blockList">
+ <li class="blockList">
+ <!-- =========== NESTED CLASS SUMMARY =========== -->
+
+
+ <!-- =========== ENUM CONSTANT SUMMARY =========== -->
+
+ <!-- =========== FIELD SUMMARY =========== -->
+
+
+ <!-- =========== PROPERTY SUMMARY =========== -->
+
+
+ <!-- =========== ELEMENT SUMMARY =========== -->
+
+
+
+ <!-- ======== CONSTRUCTOR SUMMARY ======== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="constructor_summary"><!-- --></a>
+ <h3>Constructor Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructors Summary table">
+ <caption><span>Constructors</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Constructor and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst">
+ <code><strong><a href="#CompiledTagCallRewriter(org.codehaus.groovy.control.SourceUnit, org.grails.taglib.index.TagLibraryIndex, org.codehaus.groovy.ast.ClassNode)">CompiledTagCallRewriter</a></strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html'>TagLibraryIndex</a> index, org.codehaus.groovy.ast.ClassNode classNode)</code><br></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+ </ul>
+
+
+
+ <!-- ========== METHOD SUMMARY =========== -->
+ <ul class="blockList">
+
+ <li class="blockList"><a name="method_summary"><!-- --></a>
+ <h3>Methods Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+ <caption><span>Methods</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Type Params</th>
+ <th class="colLast" scope="col">Return Type</th>
+ <th class="colLast" scope="col">Name and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public int</code></td>
+ <td class="colLast"><code><strong><a href="#getRewrittenCount()">getRewrittenCount</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>how many calls were rewritten, for tests to assert against</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>protected org.codehaus.groovy.control.SourceUnit</code></td>
+ <td class="colLast"><code><strong><a href="#getSourceUnit()">getSourceUnit</a></strong>()</code><br></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public void</code></td>
+ <td class="colLast"><code><strong><a href="#rewrite()">rewrite</a></strong>()</code><br></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public org.codehaus.groovy.ast.expr.Expression</code></td>
+ <td class="colLast"><code><strong><a href="#transform(org.codehaus.groovy.ast.expr.Expression)">transform</a></strong>(org.codehaus.groovy.ast.expr.Expression expression)</code><br></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ <li class="blockList"><a name="method_summary"><!-- --></a>
+ <h3>Inherited Methods Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
+ <caption><span>Inherited Methods</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Methods inherited from class</th>
+ <th class="colLast" scope="col">Name</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code>class org.codehaus.groovy.ast.ClassCodeExpressionTransformer</code></td>
+ <td class="colLast"><code>org.codehaus.groovy.ast.ClassCodeExpressionTransformer#addError(java.lang.String, org.codehaus.groovy.ast.ASTNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#equals(java.lang.Object), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#getClass(), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#hashCode(), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#notify(), org.codehaus.groovy.ast.ClassCodeExpressio [...]
+ </tr>
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<div class="details">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+
+
+
+
+
+
+
+ <!-- =========== CONSTRUCTOR DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="constructor_detail">
+ <!-- -->
+ </a>
+ <h3>Constructor Detail</h3>
+
+ <a name="CompiledTagCallRewriter(org.codehaus.groovy.control.SourceUnit, org.grails.taglib.index.TagLibraryIndex, org.codehaus.groovy.ast.ClassNode)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public <strong>CompiledTagCallRewriter</strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html'>TagLibraryIndex</a> index, org.codehaus.groovy.ast.ClassNode classNode)</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+
+
+
+ <!-- =========== METHOD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="method_detail">
+ <!-- -->
+ </a>
+ <h3>Method Detail</h3>
+
+ <a name="getRewrittenCount()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public int <strong>getRewrittenCount</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>how many calls were rewritten, for tests to assert against</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="getSourceUnit()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@java.lang.Override<br>protected org.codehaus.groovy.control.SourceUnit <strong>getSourceUnit</strong>()</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ <a name="rewrite()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public void <strong>rewrite</strong>()</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ <a name="transform(org.codehaus.groovy.ast.expr.Expression)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@java.lang.Override<br>public org.codehaus.groovy.ast.expr.Expression <strong>transform</strong>(org.codehaus.groovy.ast.expr.Expression expression)</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+ <!-- -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../index.html?grails/gsp/taglib/compiler/CompiledTagCallRewriter" target="_top">Frames</a></li>
+ <li><a href="CompiledTagCallRewriter.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ </ul>
+ </div>
+ <p><!-- Matomo -->
+<script>
+ var _paq = window._paq = window._paq || [];
+ /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
+ _paq.push(["setDoNotTrack", true]);
+ _paq.push(["disableCookies"]);
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ var u="https://analytics.apache.org/";
+ _paq.push(['setTrackerUrl', u+'matomo.php']);
+ _paq.push(['setSiteId', '79']);
+ var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+ g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+ })();
+</script>
+<!-- End Matomo Code --></p>
+ <a name="skip-navbar_bottom">
+ <!-- -->
+ </a>
+ </div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+</body>
+</html>
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html b/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html
index 51e20ef8ec7..b1d49798fa5 100644
--- a/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html
+++ b/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html
@@ -203,6 +203,20 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
<td class="colLast"><code><strong><a href="#resolveArtefactType(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.AnnotationNode, org.codehaus.groovy.ast.ClassNode)">resolveArtefactType</a></strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.AnnotationNode annotationNode, org.codehaus.groovy.ast.ClassNode classNode)</code><br></td>
</tr>
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>protected void</code></td>
+ <td class="colLast"><code><strong><a href="#rewriteResolvedTagCalls(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)">rewriteResolvedTagCalls</a></strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.ClassNode classNode)</code><br>Replaces calls to tags this build already knows about with direct invocations, leaving anything
+ it cannot resolve to be dispatched as before.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>protected void</code></td>
+ <td class="colLast"><code><strong><a href="#writeIndexEntry(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)">writeIndexEntry</a></strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.ClassNode classNode)</code><br>Records the namespace and tag names this tag library declares, so that a GSP compiled later can
+ resolve a tag call without loading the tag library or consulting its metaclass.</td>
+ </tr>
+
</table>
</ul>
</li>
@@ -301,6 +315,29 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
</li>
</ul>
+ <a name="rewriteResolvedTagCalls(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>protected void <strong>rewriteResolvedTagCalls</strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.ClassNode classNode)</h4>
+ <p> Replaces calls to tags this build already knows about with direct invocations, leaving anything
+ it cannot resolve to be dispatched as before.
+ </p>
+ </li>
+ </ul>
+
+ <a name="writeIndexEntry(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>protected void <strong>writeIndexEntry</strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.ClassNode classNode)</h4>
+ <p> Records the namespace and tag names this tag library declares, so that a GSP compiled later can
+ resolve a tag call without loading the tag library or consulting its metaclass.
+
+ <p>Failure to write is never fatal: the index is an optimisation, and a missing descriptor
+ degrades to the runtime resolution that applies when a tag library is registered dynamically.
+ </p>
+ </li>
+ </ul>
+
</li>
</ul>
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html b/docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html
index 95a5d291caa..7c06938aafd 100644
--- a/docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html
+++ b/docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="TagLibArtefactTypeAstTransformation.html" title="class in grails.gsp.taglib.compiler" target="classFrame">TagLibArtefactTypeAstTransformation</a></li>
+ <li><a href="CompiledTagCallRewriter.html" title="class in grails.gsp.taglib.compiler" target="classFrame">CompiledTagCallRewriter</a></li><li><a href="TagLibArtefactTypeAstTransformation.html" title="class in grails.gsp.taglib.compiler" target="classFrame">TagLibArtefactTypeAstTransformation</a></li>
</ul>
</div>
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/package-summary.html b/docs/snapshot/api/grails/gsp/taglib/compiler/package-summary.html
index 850d803c3b7..5ef4293d9c8 100644
--- a/docs/snapshot/api/grails/gsp/taglib/compiler/package-summary.html
+++ b/docs/snapshot/api/grails/gsp/taglib/compiler/package-summary.html
@@ -88,6 +88,14 @@ function windowTitle()
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="CompiledTagCallRewriter.html" title="class in grails/gsp/taglib/compiler">
+ CompiledTagCallRewriter
+ </a></strong>
+ </td>
+ <td>Rewrites a call to a known tag into a direct invocation.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="TagLibArtefactTypeAstTransformation.html" title="class in grails/gsp/taglib/compiler">
diff --git a/docs/snapshot/api/grails/plugins/mail/PlainTextMailTagLib.html b/docs/snapshot/api/grails/plugins/mail/PlainTextMailTagLib.html
index 0e88c1e8116..3dc06b1df5f 100644
--- a/docs/snapshot/api/grails/plugins/mail/PlainTextMailTagLib.html
+++ b/docs/snapshot/api/grails/plugins/mail/PlainTextMailTagLib.html
@@ -70,11 +70,11 @@ if (location.href.indexOf('is-external=true') == -1) {
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> Method
+ Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> Method
+ Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -138,11 +138,6 @@ extends java.lang.Object</pre>
<td class="colLast"><code><a href="#namespace">namespace</a></code><br></td>
</tr>
- <tr class="rowColor">
- <td class="colFirst"><code><strong>java.lang.Object</strong></code> </td>
- <td class="colLast"><code><a href="#newLine">newLine</a></code><br></td>
- </tr>
-
</table>
</ul>
</li>
@@ -180,6 +175,27 @@ extends java.lang.Object</pre>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
+ <li class="blockList"><a name="method_summary"><!-- --></a>
+ <h3>Methods Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+ <caption><span>Methods</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Type Params</th>
+ <th class="colLast" scope="col">Return Type</th>
+ <th class="colLast" scope="col">Name and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>java.lang.Object</code></td>
+ <td class="colLast"><code><strong><a href="#newLine(java.util.Map)">newLine</a></strong>(java.util.Map attrs)</code><br></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
<li class="blockList"><a name="method_summary"><!-- --></a>
<h3>Inherited Methods Summary</h3>
<ul class="blockList">
@@ -227,14 +243,6 @@ extends java.lang.Object</pre>
</li>
</ul>
- <a name="newLine"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>java.lang.Object <strong>newLine</strong></h4>
- <p></p>
- </li>
- </ul>
-
</li>
</ul>
@@ -263,6 +271,24 @@ extends java.lang.Object</pre>
+ <!-- =========== METHOD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="method_detail">
+ <!-- -->
+ </a>
+ <h3>Method Detail</h3>
+
+ <a name="newLine(java.util.Map)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>java.lang.Object <strong>newLine</strong>(java.util.Map attrs)</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
</li>
</ul>
</div>
@@ -294,11 +320,11 @@ extends java.lang.Object</pre>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> Method
+ Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> Method
+ Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index 2107968a45e..bcd711fdfc6 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -3039,6 +3039,15 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/transform/AstPropertyResolveUtils.html" title="Class in org.grails.datastore.gorm.transform">AstPropertyResolveUtils</a></span> - Class in <a href="./org/grails/datastore/gorm/transform/package-summary.html">org.grails.datastore.gorm.transform</a>
</dt><dd><div class="block">Utilities for resolving property names from domain classes etc.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagLibraryView.html" title="Class in org.grails.taglib.discovery">AstTagLibraryView</a></span> - Class in <a href="./org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a>
+</dt><dd><div class="block">A tag library read from its syntax tree, as a build reads one while compiling it.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagLibraryView.html#AstTagLibraryView(org.codehaus.groovy.ast.ClassNode, boolean)" title="Constructor in AstTagLibraryView">AstTagLibraryView(org.codehaus.groovy.ast.ClassNode, boolean)</a></span> - Constructor in <a href="org/grails/taglib/discovery/AstTagLibraryView.html">AstTagLibraryView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html" title="Class in org.grails.taglib.discovery">AstTagMethodView</a></span> - Class in <a href="./org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a>
+</dt><dd><div class="block">A method being compiled, seen through <a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a> so that <a href='../../../../org/grails/taglib/discovery/TagDiscoveryRules.html' title='TagDiscoveryRules'>TagDiscoveryRules</a> can
+ classify it before the class exists.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#AstTagMethodView(org.codehaus.groovy.ast.MethodNode, boolean)" title="Constructor in AstTagMethodView">AstTagMethodView(org.codehaus.groovy.ast.MethodNode, boolean)</a></span> - Constructor in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>method</code> - the method being compiled</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/compiler/ast/AstTransformer.html" title="Annotation Type in grails.compiler.ast">AstTransformer</a></span> - Annotation Type in <a href="./grails/compiler/ast/package-summary.html">grails.compiler.ast</a>
</dt><dd><div class="block">Marker annotation that for classes that transform Grails classes at the AST level.</div></dd>
<dt><span class="strong"><a href="org/grails/cli/compiler/AstUtils.html" title="Class in org.grails.cli.compiler">AstUtils</a></span> - Class in <a href="./org/grails/cli/compiler/package-summary.html">org.grails.cli.compiler</a>
@@ -3215,6 +3224,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/json/view/test/TestRequestConfigurer.html#attributes" title="Property in TestRequestConfigurer">attributes</a></span> - Property in <a href="grails/plugin/json/view/test/TestRequestConfigurer.html">TestRequestConfigurer</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagDiscoveryRules.html#ATTRS_PARAMETER_NAME" title="Field in TagDiscoveryRules">ATTRS_PARAMETER_NAME</a></span> - Field in <a href="org/grails/taglib/discovery/TagDiscoveryRules.html">TagDiscoveryRules</a>
+</dt><dd> <div class="block">The name a java.util.Map parameter must carry to be the attributes parameter, when the
+ method retains parameter names.</div></dd>
<dt><span class="strong"><a href="org/grails/plugins/web/taglib/ApplicationTagLib.html#attrsToString(java.util.Map)" title="Method in ApplicationTagLib">attrsToString(java.util.Map)</a></span> - Method in <a href="org/grails/plugins/web/taglib/ApplicationTagLib.html">ApplicationTagLib</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="com/example/pojo/auction/AuctionInfo.html" title="Class in com.example.pojo.auction">AuctionInfo</a></span> - Class in <a href="./com/example/pojo/auction/package-summary.html">com.example.pojo.auction</a>
@@ -4366,6 +4378,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugins/mail/MailMessageBuilder.html#body(java.util.Map)" title="Method in MailMessageBuilder">body(java.util.Map)</a></span> - Method in <a href="grails/plugins/mail/MailMessageBuilder.html">MailMessageBuilder</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagDiscoveryRules.html#BODY_PARAMETER_NAME" title="Field in TagDiscoveryRules">BODY_PARAMETER_NAME</a></span> - Field in <a href="org/grails/taglib/discovery/TagDiscoveryRules.html">TagDiscoveryRules</a>
+</dt><dd> <div class="block">The name a groovy.lang.Closure parameter must carry to be the body parameter, when the
+ method retains parameter names.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/testing/http/client/TestHttpResponse.html#body()" title="Method in TestHttpResponse">body()</a></span> - Method in <a href="org/apache/grails/testing/http/client/TestHttpResponse.html">TestHttpResponse</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>delegated response body as a String</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/doc/BoldFilter.html" title="Class in grails.doc">BoldFilter</a></span> - Class in <a href="./grails/doc/package-summary.html">grails.doc</a>
@@ -6290,6 +6305,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/buffer/StreamCharBuffer.html#clear()" title="Method in StreamCharBuffer">clear()</a></span> - Method in <a href="org/grails/buffer/StreamCharBuffer.html">StreamCharBuffer</a>
</dt><dd> <div class="block">Clears the buffer and notifies the parents of this buffer of the change.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndexWriter.html#clear(java.io.File)" title="Method in TagLibraryIndexWriter">clear(java.io.File)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndexWriter.html">TagLibraryIndexWriter</a>
+</dt><dd> <div class="block">Removes any index previously written beneath a directory, so that a regenerated index describes
+ only the tag libraries that exist now. </div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryLookup.html#clear()" title="Method in TagLibraryLookup">clear()</a></span> - Method in <a href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
</dt><dd> <div class="block">Clears all internal tag library caches. </div></dd>
<dt><span class="strong"><a href="org/grails/web/mapping/UrlCreatorCache.html#clear()" title="Method in UrlCreatorCache">clear()</a></span> - Method in <a href="org/grails/web/mapping/UrlCreatorCache.html">UrlCreatorCache</a>
@@ -6348,6 +6366,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/util/WebUtils.html#clearGrailsWebRequest()" title="Method in WebUtils">clearGrailsWebRequest()</a></span> - Method in <a href="org/grails/web/util/WebUtils.html">WebUtils</a>
</dt><dd> <div class="block">Removes any GrailsWebRequest instance from the current request.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#clearIndex(java.io.File)" title="Method in TagLibraryIndexFiles">clearIndex(java.io.File)</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block">Removes descriptors left by an earlier run, for a project that no longer declares any tag
+ library. </div></dd>
<dt><span class="strong"><a href="org/grails/plugins/datasource/DataSourceUtils.html#clearJdbcDriverRegistrations()" title="Method in DataSourceUtils">clearJdbcDriverRegistrations()</a></span> - Method in <a href="org/grails/plugins/datasource/DataSourceUtils.html">DataSourceUtils</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/AbstractGrailsDomainBinder.html#clearMappingCache(Class<?>)" title="Method in AbstractGrailsDomainBinder">clearMappingCache(Class<?>)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/AbstractGrailsDomainBinder.html">AbstractGrailsDomainBinder</a>
@@ -7202,6 +7223,18 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/web/access/intercept/AbstractFilterInvocationDefinition.html#compiled" title="Field in AbstractFilterInvocationDefinition">compiled</a></span> - Field in <a href="grails/plugin/springsecurity/web/access/intercept/AbstractFilterInvocationDefinition.html">AbstractFilterInvocationDefinition</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/apache/grails/common/compiler/GroovyTransformOrder.html#COMPILED_TAG_CALL_ORDER" title="Field in GroovyTransformOrder">COMPILED_TAG_CALL_ORDER</a></span> - Field in <a href="org/apache/grails/common/compiler/GroovyTransformOrder.html">GroovyTransformOrder</a>
+</dt><dd> <div class="block">Rewrites a call to a known tag into a direct invocation. </div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html" title="Class in grails.gsp.taglib.compiler">CompiledTagCallRewriter</a></span> - Class in <a href="./grails/gsp/taglib/compiler/package-summary.html">grails.gsp.taglib.compiler</a>
+</dt><dd><div class="block">Rewrites a call to a known tag into a direct invocation.</div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html#CompiledTagCallRewriter(org.codehaus.groovy.control.SourceUnit, org.grails.taglib.index.TagLibraryIndex, org.codehaus.groovy.ast.ClassNode)" title="Constructor in CompiledTagCallRewriter">CompiledTagCallRewriter(org.codehaus.groovy.control.SourceUnit, org.grails.taglib.index.TagLibraryIndex, org.codehaus.groovy.ast.ClassNode)</a></span> - Constructor in <a href="grails/gsp/taglib/compiler/CompiledTa [...]
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/compiler/traits/CompiledTagCallTransformation.html" title="Class in grails.compiler.traits">CompiledTagCallTransformation</a></span> - Class in <a href="./grails/compiler/traits/package-summary.html">grails.compiler.traits</a>
+</dt><dd><div class="block">Compiles a call to a known tag into a direct invocation, wherever tags can be called from.</div></dd>
+<dt><span class="strong"><a href="grails/compiler/traits/CompiledTagCallTransformation.html#CompiledTagCallTransformation()" title="Constructor in CompiledTagCallTransformation">CompiledTagCallTransformation()</a></span> - Constructor in <a href="grails/compiler/traits/CompiledTagCallTransformation.html">CompiledTagCallTransformation</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/CompiledTagInvocation.html" title="Class in org.grails.taglib">CompiledTagInvocation</a></span> - Class in <a href="./org/grails/taglib/package-summary.html">org.grails.taglib</a>
+</dt><dd><div class="block">Invokes a tag whose namespace and name are known without going through Groovy's method dispatch.</div></dd>
<dt><span class="strong"><a href="grails/boot/GrailsApp.html#compileGroovyFile(org.codehaus.groovy.control.CompilerConfiguration, java.io.File)" title="Method in GrailsApp">compileGroovyFile(org.codehaus.groovy.control.CompilerConfiguration, java.io.File)</a></span> - Method in <a href="grails/boot/GrailsApp.html">GrailsApp</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageCompiler.html#compileGSP(java.io.File, java.io.File, java.lang.String, java.lang.String, java.util.Map)" title="Method in GroovyPageCompiler">compileGSP(java.io.File, java.io.File, java.lang.String, java.lang.String, java.util.Map)</a></span> - Method in <a href="org/grails/gsp/compiler/GroovyPageCompiler.html">GroovyPageCompiler</a>
@@ -11131,10 +11164,25 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugin/cache/compiler/AbstractCacheTransformation.html#declareCacheKey(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.AnnotationNode, org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode, org.codehaus.groovy.ast.stmt.BlockStatement)" title="Method in AbstractCacheTransformation">declareCacheKey(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.AnnotationNode, org.codehaus.groovy.ast.ClassNode, or [...]
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagLibraryView.html#declaredClosureFieldNames()" title="Method in AstTagLibraryView">declaredClosureFieldNames()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagLibraryView.html">AstTagLibraryView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html#declaredClosureFieldNames()" title="Method in ReflectedTagLibraryView">declaredClosureFieldNames()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html">ReflectedTagLibraryView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagLibraryView.html#declaredClosureFieldNames()" title="Method in TagLibraryView">declaredClosureFieldNames()</a></span> - Method in <a href="org/grails/taglib/discovery/TagLibraryView.html">TagLibraryView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the names of the non-static fields this class itself declares whose type is a
+ <CODE>Closure</CODE>, including a subclass of one</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagLibraryView.html#declaredMethods()" title="Method in AstTagLibraryView">declaredMethods()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagLibraryView.html">AstTagLibraryView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html#declaredMethods()" title="Method in ReflectedTagLibraryView">declaredMethods()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html">ReflectedTagLibraryView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagLibraryView.html#declaredMethods()" title="Method in TagLibraryView">declaredMethods()</a></span> - Method in <a href="org/grails/taglib/discovery/TagLibraryView.html">TagLibraryView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the methods this class itself declares, excluding anything inherited</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/services/transform/QueryStringTransformer.html#declaredQueryTargets" title="Property in QueryStringTransformer">declaredQueryTargets</a></span> - Property in <a href="org/grails/datastore/gorm/services/transform/QueryStringTransformer.html">QueryStringTransformer</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/mongo/AbstractMongoSession.html#declaredWriteConcerns" title="Field in AbstractMongoSession">declaredWriteConcerns</a></span> - Field in <a href="org/grails/datastore/mapping/mongo/AbstractMongoSession.html">AbstractMongoSession</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#declaresNamespace(java.lang.String)" title="Method in TagLibraryIndex">declaresNamespace(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Whether this project's own tag libraries declare a namespace.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/mongo/AbstractMongoSession.html#decode(Class<T>, java.lang.Object)" title="Method in AbstractMongoSession">decode(Class<T>, java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/mapping/mongo/AbstractMongoSession.html">AbstractMongoSession</a>
</dt><dd> <div class="block">Decodes the given entity type from the given native object type</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/bson/codecs/decoders/BasicCollectionTypeDecoder.html#decode(org.bson.BsonReader, org.grails.datastore.mapping.model.types.Basic, org.grails.datastore.mapping.engine.EntityAccess, org.bson.codecs.DecoderContext, org.bson.codecs.configuration.CodecRegistry)" title="Method in BasicCollectionTypeDecoder">decode(org.bson.BsonReader, org.grails.datastore.mapping.model.types.Basic, org.grails.datastore.mapping.engine.EntityAccess, org.bson. [...]
@@ -11470,6 +11518,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/GroovyPage.html#DEFAULT_NAMESPACE" title="Field in GroovyPage">DEFAULT_NAMESPACE</a></span> - Field in <a href="org/grails/gsp/GroovyPage.html">GroovyPage</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagLibraryAstDiscovery.html#DEFAULT_NAMESPACE" title="Field in TagLibraryAstDiscovery">DEFAULT_NAMESPACE</a></span> - Field in <a href="org/grails/taglib/discovery/TagLibraryAstDiscovery.html">TagLibraryAstDiscovery</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagOutput.html#DEFAULT_NAMESPACE" title="Field in TagOutput">DEFAULT_NAMESPACE</a></span> - Field in <a href="org/grails/taglib/TagOutput.html">TagOutput</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/gorm/validation/ConstrainedProperty.html#DEFAULT_NOT_EQUAL_MESSAGE_CODE" title="Field in ConstrainedProperty">DEFAULT_NOT_EQUAL_MESSAGE_CODE</a></span> - Field in <a href="grails/gorm/validation/ConstrainedProperty.html">ConstrainedProperty</a>
@@ -12860,8 +12910,6 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd><div class="block"> <DL><DT><B>Authors:</B></DT><DD>Graeme Rocher</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/ui/support/DevelopmentGrailsApplication.html#DevelopmentGrailsApplication(Class<?>)" title="Constructor in DevelopmentGrailsApplication">DevelopmentGrailsApplication(Class<?>)</a></span> - Constructor in <a href="grails/ui/support/DevelopmentGrailsApplication.html">DevelopmentGrailsApplication</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/taglib/NamespacedTagDispatcher.html#developmentMode" title="Field in NamespacedTagDispatcher">developmentMode</a></span> - Field in <a href="org/grails/taglib/NamespacedTagDispatcher.html">NamespacedTagDispatcher</a>
-</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/dev/support/DevelopmentShutdownHook.html" title="Class in org.grails.dev.support">DevelopmentShutdownHook</a></span> - Class in <a href="./org/grails/dev/support/package-summary.html">org.grails.dev.support</a>
</dt><dd><div class="block">Registers a shutdown hook to close the application context when CTRL+C is hit in dev mode.</div></dd>
<dt><span class="strong"><a href="org/grails/dev/support/DevelopmentShutdownHook.html#DevelopmentShutdownHook()" title="Constructor in DevelopmentShutdownHook">DevelopmentShutdownHook()</a></span> - Constructor in <a href="org/grails/dev/support/DevelopmentShutdownHook.html">DevelopmentShutdownHook</a>
@@ -14048,6 +14096,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/spring/GrailsContextEvent.html#DYNAMIC_METHODS_REGISTERED" title="Field in GrailsContextEvent">DYNAMIC_METHODS_REGISTERED</a></span> - Field in <a href="org/grails/spring/GrailsContextEvent.html">GrailsContextEvent</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#DYNAMIC_NAMESPACES_KEY" title="Property in TagLibraryIndexFiles">DYNAMIC_NAMESPACES_KEY</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateMappingKeyword.html#DYNAMIC_UPDATE" title="Enum Constant in HibernateMappingKeyword">DYNAMIC_UPDATE</a></span> - Enum Constant in <a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateMappingKeyword.html">HibernateMappingKeyword</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/neo4j/mapping/config/DynamicAssociation.html" title="Interface in org.grails.datastore.gorm.neo4j.mapping.config">DynamicAssociation</a></span> - Interface in <a href="./org/grails/datastore/gorm/neo4j/mapping/config/package-summary.html">org.grails.datastore.gorm.neo4j.mapping.config</a>
@@ -14088,6 +14138,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/views/compiler/ViewsTransform.html#dynamicPrefix" title="Property in ViewsTransform">dynamicPrefix</a></span> - Property in <a href="grails/views/compiler/ViewsTransform.html">ViewsTransform</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html#dynamicTagNamespaces" title="Property in GrailsCompileStaticOptions">dynamicTagNamespaces</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html">GrailsCompileStaticOptions</a>
+</dt><dd> <div class="block">Namespaces whose tag libraries are registered while the application runs rather than described
+ when it is compiled. </div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/neo4j/mapping/config/DynamicToManyAssociation.html" title="Class in org.grails.datastore.gorm.neo4j.mapping.config">DynamicToManyAssociation</a></span> - Class in <a href="./org/grails/datastore/gorm/neo4j/mapping/config/package-summary.html">org.grails.datastore.gorm.neo4j.mapping.config</a>
</dt><dd><div class="block">Represents an association that is dynamic and is created at runtime</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/neo4j/mapping/config/DynamicToManyAssociation.html#DynamicToManyAssociation(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.lang.String, org.grails.datastore.mapping.model.PersistentEntity)" title="Constructor in DynamicToManyAssociation">DynamicToManyAssociation(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, jav [...]
@@ -17021,6 +17074,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/buffer/GrailsPrintWriter.html#findStreamCharBufferTarget(boolean)" title="Method in GrailsPrintWriter">findStreamCharBufferTarget(boolean)</a></span> - Method in <a href="org/grails/buffer/GrailsPrintWriter.html">GrailsPrintWriter</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagDiscoveryRules.html#findTags(org.grails.taglib.discovery.TagLibraryView)" title="Method in TagDiscoveryRules">findTags(org.grails.taglib.discovery.TagLibraryView)</a></span> - Method in <a href="org/grails/taglib/discovery/TagDiscoveryRules.html">TagDiscoveryRules</a>
+</dt><dd> <div class="block">Finds every tag a tag library declares, from either view of it.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagLibraryAstDiscovery.html#findTags(org.codehaus.groovy.ast.ClassNode, boolean)" title="Method in TagLibraryAstDiscovery">findTags(org.codehaus.groovy.ast.ClassNode, boolean)</a></span> - Method in <a href="org/grails/taglib/discovery/TagLibraryAstDiscovery.html">TagLibraryAstDiscovery</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>classNode</code> - the tag library</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/plugin/formfields/FormFieldsTemplateService.html#findTemplate(grails.plugin.formfields.BeanPropertyAccessor, java.lang.String, java.lang.String, java.lang.String)" title="Method in FormFieldsTemplateService">findTemplate(grails.plugin.formfields.BeanPropertyAccessor, java.lang.String, java.lang.String, java.lang.String)</a></span> - Method in <a href="grails/plugin/formfields/FormFieldsTemplateService.html">FormFieldsTemplateService</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/gsp/io/GrailsConventionGroovyPageLocator.html#findTemplate(java.lang.String)" title="Method in GrailsConventionGroovyPageLocator">findTemplate(java.lang.String)</a></span> - Method in <a href="org/grails/web/gsp/io/GrailsConventionGroovyPageLocator.html">GrailsConventionGroovyPageLocator</a>
@@ -17415,6 +17472,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/reflect/ClassPropertyFetcher.html#forClass(java.lang.Class)" title="Method in ClassPropertyFetcher">forClass(java.lang.Class)</a></span> - Method in <a href="org/grails/datastore/mapping/reflect/ClassPropertyFetcher.html">ClassPropertyFetcher</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#forClassLoader(java.lang.ClassLoader)" title="Method in TagLibraryIndex">forClassLoader(java.lang.ClassLoader)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Reads the index for a class loader, reusing the one already read for it.</div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/tags/GroovySyntaxTag.html#foreachRenamedIt" title="Field in GroovySyntaxTag">foreachRenamedIt</a></span> - Field in <a href="org/grails/gsp/compiler/tags/GroovySyntaxTag.html">GroovySyntaxTag</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.html#FOREIGN_KEY_SUFFIX" title="Field in GrailsDomainBinder">FOREIGN_KEY_SUFFIX</a></span> - Field in <a href="org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.html">GrailsDomainBinder</a>
@@ -17470,6 +17529,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/i18n/GenerateI18nDescriptorTask.html#FORMAT_VERSION" title="Property in GenerateI18nDescriptorTask">FORMAT_VERSION</a></span> - Property in <a href="org/grails/gradle/plugin/i18n/GenerateI18nDescriptorTask.html">GenerateI18nDescriptorTask</a>
</dt><dd> <div class="block">Descriptor format version, so a future reader can reject an artifact it does not understand.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#FORMAT_VERSION" title="Field in TagLibraryIndex">FORMAT_VERSION</a></span> - Field in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Descriptor format this build writes and understands. </div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/neo4j/GraphPersistentEntity.html#formatAssociationDelete(org.grails.datastore.mapping.model.types.Association, java.lang.Object)" title="Method in GraphPersistentEntity">formatAssociationDelete(org.grails.datastore.mapping.model.types.Association, java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/gorm/neo4j/GraphPersistentEntity.html">GraphPersistentEntity</a>
</dt><dd> <div class="block">Formats an association merge</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/neo4j/GraphPersistentEntity.html#formatAssociationMatch(org.grails.datastore.mapping.model.types.Association, java.lang.String, java.lang.String, java.lang.String)" title="Method in GraphPersistentEntity">formatAssociationMatch(org.grails.datastore.mapping.model.types.Association, java.lang.String, java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/datastore/gorm/neo4j/GraphPersistentEntity.html">Grap [...]
@@ -17647,6 +17708,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/databinding/FrameworkPropertyNames.html#FRAMEWORK_MANAGED_PROPERTIES" title="Field in FrameworkPropertyNames">FRAMEWORK_MANAGED_PROPERTIES</a></span> - Field in <a href="grails/databinding/FrameworkPropertyNames.html">FrameworkPropertyNames</a>
</dt><dd> <div class="block">Union of <a href='#INTRINSIC_RUNTIME_PROPERTIES'>INTRINSIC_RUNTIME_PROPERTIES</a> and <a href='#GRAILS_MANAGED_PROPERTIES'>GRAILS_MANAGED_PROPERTIES</a>.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html#FRAMEWORK_METHOD_NAMES" title="Field in TagMethodInvoker">FRAMEWORK_METHOD_NAMES</a></span> - Field in <a href="org/grails/taglib/TagMethodInvoker.html">TagMethodInvoker</a>
+</dt><dd> <div class="block">Names that live on every tag library through the framework traits and are therefore never tags.</div></dd>
<dt><span class="strong"><a href="grails/databinding/FrameworkPropertyNames.html" title="Class in grails.databinding">FrameworkPropertyNames</a></span> - Class in <a href="./grails/databinding/package-summary.html">grails.databinding</a>
</dt><dd><div class="block">Property names managed by the language runtime or Grails rather than ordinary request data.</div></dd>
<dt><span class="strong"><a href="grails/events/Event.html#from(java.lang.String, Map<String, Object>, T)" title="Method in Event">from(java.lang.String, Map<String, Object>, T)</a></span> - Method in <a href="grails/events/Event.html">Event</a>
@@ -17778,6 +17841,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html#generate()" title="Method in GenerateNativeMetadataTask">generate()</a></span> - Method in <a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html">GenerateNativeMetadataTask</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#generate()" title="Method in GenerateTagLibraryIndexTask">generate()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/cache/GrailsCacheKeyGenerator.html#generate(java.lang.String, java.lang.String, int, java.util.Map)" title="Method in GrailsCacheKeyGenerator">generate(java.lang.String, java.lang.String, int, java.util.Map)</a></span> - Method in <a href="grails/plugin/cache/GrailsCacheKeyGenerator.html">GrailsCacheKeyGenerator</a>
</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>className</code> - The name of the class</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsNativeGenerator.html#generate(org.hibernate.engine.spi.SharedSessionContractImplementor, java.lang.Object, java.lang.Object, org.hibernate.generator.EventType)" title="Method in GrailsNativeGenerator">generate(org.hibernate.engine.spi.SharedSessionContractImplementor, java.lang.Object, java.lang.Object, org.hibernate.generator.EventType)</a></span> - Method in <a href="org/grails/orm/hibernate/cf [...]
@@ -17786,6 +17851,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/Schema.html#generate()" title="Method in Schema">generate()</a></span> - Method in <a href="org/grails/gorm/graphql/Schema.html">Schema</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndexGenerator.html#generate(List<File>, List<File>, java.io.File, boolean, java.lang.String)" title="Method in TagLibraryIndexGenerator">generate(List<File>, List<File>, java.io.File, boolean, java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndexGenerator.html">TagLibraryIndexGenerator</a>
+</dt><dd> <div class="block">Regenerates the index describing every tag library under any of several source directories.</div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/rest/token/generation/jwt/AbstractJwtTokenGenerator.html#generateAccessToken(com.nimbusds.jwt.JWTClaimsSet)" title="Method in AbstractJwtTokenGenerator">generateAccessToken(com.nimbusds.jwt.JWTClaimsSet)</a></span> - Method in <a href="grails/plugin/springsecurity/rest/token/generation/jwt/AbstractJwtTokenGenerator.html">AbstractJwtTokenGenerator</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/rest/token/generation/jwt/EncryptedJwtTokenGenerator.html#generateAccessToken(com.nimbusds.jwt.JWTClaimsSet)" title="Method in EncryptedJwtTokenGenerator">generateAccessToken(com.nimbusds.jwt.JWTClaimsSet)</a></span> - Method in <a href="grails/plugin/springsecurity/rest/token/generation/jwt/EncryptedJwtTokenGenerator.html">EncryptedJwtTokenGenerator</a>
@@ -17873,10 +17940,16 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html#generateStatements(liquibase.database.Database)" title="Method in GroovyChange">generateStatements(liquibase.database.Database)</a></span> - Method in <a href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html">GroovyChange</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html" title="Class in org.grails.gradle.plugin.views.gsp">GenerateTagLibraryIndexTask</a></span> - Class in <a href="./org/grails/gradle/plugin/views/gsp/package-summary.html">org.grails.gradle.plugin.views.gsp</a>
+</dt><dd><div class="block">Writes the tag library index describing the tag libraries in this project.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#GenerateTagLibraryIndexTask(org.gradle.process.ExecOperations)" title="Constructor in GenerateTagLibraryIndexTask">GenerateTagLibraryIndexTask(org.gradle.process.ExecOperations)</a></span> - Constructor in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/doc/internal/YamlTocStrategy.html#generateToc(java.lang.Object)" title="Method in YamlTocStrategy">generateToc(java.lang.Object)</a></span> - Method in <a href="grails/doc/internal/YamlTocStrategy.html">YamlTocStrategy</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/servlet/mvc/SynchronizerTokensHolder.html#generateToken(java.lang.String)" title="Method in SynchronizerTokensHolder">generateToken(java.lang.String)</a></span> - Method in <a href="org/grails/web/servlet/mvc/SynchronizerTokensHolder.html">SynchronizerTokensHolder</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#GENERATOR_CLASS" title="Property in GenerateTagLibraryIndexTask">GENERATOR_CLASS</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/HibernateSimpleIdentity.html#generator" title="Property in HibernateSimpleIdentity">generator</a></span> - Property in <a href="org/grails/orm/hibernate/cfg/HibernateSimpleIdentity.html">HibernateSimpleIdentity</a>
</dt><dd> <div class="block">The generator to use</div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/Identity.html#generator" title="Property in Identity">generator</a></span> - Property in <a href="org/grails/orm/hibernate/cfg/Identity.html">Identity</a>
@@ -20561,6 +20634,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/profile/commands/CreateAppCommand.html#getDestinationDirectory(java.io.File)" title="Method in CreateAppCommand">getDestinationDirectory(java.io.File)</a></span> - Method in <a href="org/grails/cli/profile/commands/CreateAppCommand.html">CreateAppCommand</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getDestinationDirectory()" title="Method in GenerateTagLibraryIndexTask">getDestinationDirectory()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">Where the index is written. </div></dd>
<dt><span class="strong"><a href="org/grails/web/servlet/boostrap/DefaultGrailsBootstrapClass.html#getDestroyClosure()" title="Method in DefaultGrailsBootstrapClass">getDestroyClosure()</a></span> - Method in <a href="org/grails/web/servlet/boostrap/DefaultGrailsBootstrapClass.html">DefaultGrailsBootstrapClass</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/web/servlet/bootstrap/GrailsBootstrapClass.html#getDestroyClosure()" title="Method in GrailsBootstrapClass">getDestroyClosure()</a></span> - Method in <a href="grails/web/servlet/bootstrap/GrailsBootstrapClass.html">GrailsBootstrapClass</a>
@@ -20692,10 +20767,15 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/services/implementers/FindOneByImplementer.html#getDynamicFinderPrefix()" title="Method in FindOneByImplementer">getDynamicFinderPrefix()</a></span> - Method in <a href="org/grails/datastore/gorm/services/implementers/FindOneByImplementer.html">FindOneByImplementer</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#getDynamicNamespaces()" title="Method in TagLibraryIndex">getDynamicNamespaces()</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Namespaces the build declared as filled in at runtime, whose tags are therefore never reported
+ as unknown however complete the index is.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/core/plugins/DefaultPluginDiscovery.html#getDynamicPlugins()" title="Method in DefaultPluginDiscovery">getDynamicPlugins()</a></span> - Method in <a href="org/apache/grails/core/plugins/DefaultPluginDiscovery.html">DefaultPluginDiscovery</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/core/plugins/PluginDiscovery.html#getDynamicPlugins()" title="Method in PluginDiscovery">getDynamicPlugins()</a></span> - Method in <a href="org/apache/grails/core/plugins/PluginDiscovery.html">PluginDiscovery</a>
</dt><dd> <div class="block">Returns plugins supplied dynamically instead of being discovered from classpath descriptors.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getDynamicTagNamespaces()" title="Method in GenerateTagLibraryIndexTask">getDynamicTagNamespaces()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">Namespaces the build declares as filled in while the application runs. </div></dd>
<dt><span class="strong"><a href="grails/plugin/json/view/JsonViewTemplateEngine.html#getDynamicTemplatePrefix()" title="Method in JsonViewTemplateEngine">getDynamicTemplatePrefix()</a></span> - Method in <a href="grails/plugin/json/view/JsonViewTemplateEngine.html">JsonViewTemplateEngine</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/markup/view/MarkupViewTemplateEngine.html#getDynamicTemplatePrefix()" title="Method in MarkupViewTemplateEngine">getDynamicTemplatePrefix()</a></span> - Method in <a href="grails/plugin/markup/view/MarkupViewTemplateEngine.html">MarkupViewTemplateEngine</a>
@@ -21416,6 +21496,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/util/WebUtils.html#getForwardURI(jakarta.servlet.http.HttpServletRequest)" title="Method in WebUtils">getForwardURI(jakarta.servlet.http.HttpServletRequest)</a></span> - Method in <a href="org/grails/web/util/WebUtils.html">WebUtils</a>
</dt><dd> <div class="block">Obtains the forwardURI from the request, since Grails uses a forwarding technique for URL mappings. </div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagDiscoveryRules.html#getFrameworkMethodNames()" title="Method in TagDiscoveryRules">getFrameworkMethodNames()</a></span> - Method in <a href="org/grails/taglib/discovery/TagDiscoveryRules.html">TagDiscoveryRules</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the names that are never tags, whatever their shape</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/query/JpaQueryContext.html#getFrom(java.lang.String)" title="Method in JpaQueryContext">getFrom(java.lang.String)</a></span> - Method in <a href="org/grails/orm/hibernate/query/JpaQueryContext.html">JpaQueryContext</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/taglib/jsp/JspSelectTag.html#getFrom()" title="Method in JspSelectTag">getFrom()</a></span> - Method in <a href="org/grails/web/taglib/jsp/JspSelectTag.html">JspSelectTag</a>
@@ -21479,6 +21561,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The type of value generated used</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/model/config/JpaMappingConfigurationStrategy.html#getGenerator()" title="Method in JpaMappingConfigurationStrategy">getGenerator()</a></span> - Method in <a href="org/grails/datastore/mapping/model/config/JpaMappingConfigurationStrategy.html">JpaMappingConfigurationStrategy</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getGeneratorClasspath()" title="Method in GenerateTagLibraryIndexTask">getGeneratorClasspath()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">The classpath the generator runs against, which supplies the framework's discovery rules.</div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.html#getGeneratorName()" title="Method in HibernatePersistentProperty">getGeneratorName()</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernatePersistentProperty.html">HibernatePersistentProperty</a>
</dt><dd> <div class="block">Returns the generator name for this property. </div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateSimpleIdentityProperty.html#getGeneratorName()" title="Method in HibernateSimpleIdentityProperty">getGeneratorName()</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateSimpleIdentityProperty.html">HibernateSimpleIdentityProperty</a>
@@ -22199,6 +22283,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/gradle/plugin/aot/ExtractApplicationTask.html#getJavaLauncher()" title="Method in ExtractApplicationTask">getJavaLauncher()</a></span> - Method in <a href="org/apache/grails/gradle/plugin/aot/ExtractApplicationTask.html">ExtractApplicationTask</a>
</dt><dd> <div class="block">The Java runtime to unpack with. </div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getJavaLauncher()" title="Method in GenerateTagLibraryIndexTask">getJavaLauncher()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">The Java the index is generated with. </div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html#getJavaLauncher()" title="Method in GroovyPageForkCompileTask">getJavaLauncher()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html">GroovyPageForkCompileTask</a>
</dt><dd> <div class="block">The Java runtime the pages are compiled by.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/gradle/plugin/aot/TrainAotCacheTask.html#getJavaVendor()" title="Method in TrainAotCacheTask">getJavaVendor()</a></span> - Method in <a href="org/apache/grails/gradle/plugin/aot/TrainAotCacheTask.html">TrainAotCacheTask</a>
@@ -23062,6 +23148,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/dev/commands/ApplicationCommand.html#getName()" title="Method in ApplicationCommand">getName()</a></span> - Method in <a href="grails/dev/commands/ApplicationCommand.html">ApplicationCommand</a>
</dt><dd> <div class="block">Calculates the command name as used on the command line.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#getName()" title="Method in AstTagMethodView">getName()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/spring/BeanConfiguration.html#getName()" title="Method in BeanConfiguration">getName()</a></span> - Method in <a href="org/grails/spring/BeanConfiguration.html">BeanConfiguration</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The name of the bean</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/validation/constraints/BlankConstraint.html#getName()" title="Method in BlankConstraint">getName()</a></span> - Method in <a href="org/grails/datastore/gorm/validation/constraints/BlankConstraint.html">BlankConstraint</a>
@@ -23217,6 +23305,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/validation/constraints/RangeConstraint.html#getName()" title="Method in RangeConstraint">getName()</a></span> - Method in <a href="org/grails/datastore/gorm/validation/constraints/RangeConstraint.html">RangeConstraint</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#getName()" title="Method in ReflectedTagMethodView">getName()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/profile/steps/RenderStep.html#getName()" title="Method in RenderStep">getName()</a></span> - Method in <a href="org/grails/cli/profile/steps/RenderStep.html">RenderStep</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/compiler/grape/RepositoryConfiguration.html#getName()" title="Method in RepositoryConfiguration">getName()</a></span> - Method in <a href="org/grails/cli/compiler/grape/RepositoryConfiguration.html">RepositoryConfiguration</a>
@@ -23235,6 +23325,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/profile/Step.html#getName()" title="Method in Step">getName()</a></span> - Method in <a href="org/grails/cli/profile/Step.html">Step</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The name of the step</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#getName()" title="Method in TagMethodView">getName()</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the method name</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/validation/constraints/builtin/UniqueConstraint.html#getName()" title="Method in UniqueConstraint">getName()</a></span> - Method in <a href="org/grails/datastore/gorm/validation/constraints/builtin/UniqueConstraint.html">UniqueConstraint</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/validation/constraints/UrlConstraint.html#getName()" title="Method in UrlConstraint">getName()</a></span> - Method in <a href="org/grails/datastore/gorm/validation/constraints/UrlConstraint.html">UrlConstraint</a>
@@ -23283,6 +23375,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the name of the controller namespace</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/web/mapping/UrlMappingInfo.html#getNamespace()" title="Method in UrlMappingInfo">getNamespace()</a></span> - Method in <a href="grails/web/mapping/UrlMappingInfo.html">UrlMappingInfo</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the namespace of the corresponding controller, null if none was specified</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#getNamespaces()" title="Method in TagLibraryIndex">getNamespaces()</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>every namespace contributed by a compiled tag library</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/types/GraphQLTypeManager.html#getNamingConvention()" title="Method in GraphQLTypeManager">getNamingConvention()</a></span> - Method in <a href="org/grails/gorm/graphql/types/GraphQLTypeManager.html">GraphQLTypeManager</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The naming convention used to name types</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.html#getNamingStrategy()" title="Method in GrailsDomainBinder">getNamingStrategy()</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsDomainBinder.html">GrailsDomainBinder</a>
@@ -23978,12 +24072,24 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The parameter to the constraint</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/testing/GrailsMockHttpServletRequest.html#getParameter(java.lang.String)" title="Method in GrailsMockHttpServletRequest">getParameter(java.lang.String)</a></span> - Method in <a href="org/grails/plugins/testing/GrailsMockHttpServletRequest.html">GrailsMockHttpServletRequest</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#getParameterCount()" title="Method in AstTagMethodView">getParameterCount()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#getParameterCount()" title="Method in ReflectedTagMethodView">getParameterCount()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#getParameterCount()" title="Method in TagMethodView">getParameterCount()</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the number of declared parameters</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.html#getParameterizedDetachedCriteriaClassNode(org.codehaus.groovy.ast.ClassNode)" title="Method in DetachedCriteriaTransformer">getParameterizedDetachedCriteriaClassNode(org.codehaus.groovy.ast.ClassNode)</a></span> - Method in <a href="org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.html">DetachedCriteriaTransformer</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/testing/GrailsMockHttpServletRequest.html#getParameterMap()" title="Method in GrailsMockHttpServletRequest">getParameterMap()</a></span> - Method in <a href="org/grails/plugins/testing/GrailsMockHttpServletRequest.html">GrailsMockHttpServletRequest</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/servlet/mvc/GrailsWebRequest.html#getParameterMap()" title="Method in GrailsWebRequest">getParameterMap()</a></span> - Method in <a href="org/grails/web/servlet/mvc/GrailsWebRequest.html">GrailsWebRequest</a>
</dt><dd> <div class="block">Overriden to return the GrailsParameterMap instance,</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#getParameterName(int)" title="Method in AstTagMethodView">getParameterName(int)</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#getParameterName(int)" title="Method in ReflectedTagMethodView">getParameterName(int)</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#getParameterName(int)" title="Method in TagMethodView">getParameterName(int)</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/validation/jakarta/GormValidatorFactoryAdapter.html#getParameterNameProvider()" title="Method in GormValidatorFactoryAdapter">getParameterNameProvider()</a></span> - Method in <a href="org/grails/datastore/gorm/validation/jakarta/GormValidatorFactoryAdapter.html">GormValidatorFactoryAdapter</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/validation/jakarta/JakartaValidatorRegistry.html#getParameterNameProvider()" title="Method in JakartaValidatorRegistry">getParameterNameProvider()</a></span> - Method in <a href="org/grails/datastore/gorm/validation/jakarta/JakartaValidatorRegistry.html">JakartaValidatorRegistry</a>
@@ -23994,6 +24100,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/testing/GrailsMockHttpServletRequest.html#getParameterNames()" title="Method in GrailsMockHttpServletRequest">getParameterNames()</a></span> - Method in <a href="org/grails/plugins/testing/GrailsMockHttpServletRequest.html">GrailsMockHttpServletRequest</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getParameterNamesRetained()" title="Method in GenerateTagLibraryIndexTask">getParameterNamesRetained()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">Whether this compilation writes parameter names into class files. </div></dd>
<dt><span class="strong"><a href="org/grails/web/mapping/DefaultUrlMappingInfo.html#getParameters()" title="Method in DefaultUrlMappingInfo">getParameters()</a></span> - Method in <a href="org/grails/web/mapping/DefaultUrlMappingInfo.html">DefaultUrlMappingInfo</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/mapping/ForwardUrlMappingInfo.html#getParameters()" title="Method in ForwardUrlMappingInfo">getParameters()</a></span> - Method in <a href="org/grails/web/mapping/ForwardUrlMappingInfo.html">ForwardUrlMappingInfo</a>
@@ -25282,6 +25390,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/config/PrefixedConfig.html#getRequiredProperty(java.lang.String, Class<T>)" title="Method in PrefixedConfig">getRequiredProperty(java.lang.String, Class<T>)</a></span> - Method in <a href="org/grails/config/PrefixedConfig.html">PrefixedConfig</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getResolutionSourceRoots()" title="Method in GenerateTagLibraryIndexTask">getResolutionSourceRoots()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">The source roots a type this project declares may be resolved from.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/buildsrc/ValidateDependencyVersionsTask.html#getResolvedVersions()" title="Method in ValidateDependencyVersionsTask">getResolvedVersions()</a></span> - Method in <a href="org/apache/grails/buildsrc/ValidateDependencyVersionsTask.html">ValidateDependencyVersionsTask</a>
</dt><dd> <div class="block">Versions the project's BOM-bearing configurations actually resolved to.</div></dd>
<dt><span class="strong"><a href="org/grails/plugins/DefaultGrailsPlugin.html#getResolver()" title="Method in DefaultGrailsPlugin">getResolver()</a></span> - Method in <a href="org/grails/plugins/DefaultGrailsPlugin.html">DefaultGrailsPlugin</a>
@@ -25408,6 +25518,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/web/mapping/UrlMappingsHolder.html#getReverseMappingNoDefault(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.Map)" title="Method in UrlMappingsHolder">getReverseMappingNoDefault(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.Map)</a></span> - Method in <a href="grails/web/mapping/UrlMappingsHolder.html">UrlM [...]
</dt><dd> <div class="block">Retrieves the best guess of a URI for the given controller, action and parameters or null if non could be found.</div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html#getRewrittenCount()" title="Method in CompiledTagCallRewriter">getRewrittenCount()</a></span> - Method in <a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html">CompiledTagCallRewriter</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>how many calls were rewritten, for tests to assert against</DD></DL></div></dd>
<dt><span class="strong"><a href="org/apache/grails/web/layout/GrailsNoDecorator.html#getRole()" title="Method in GrailsNoDecorator">getRole()</a></span> - Method in <a href="org/apache/grails/web/layout/GrailsNoDecorator.html">GrailsNoDecorator</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.html#getRole(java.lang.String)" title="Method in HibernateToManyProperty">getRole(java.lang.String)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateToManyProperty.html">HibernateToManyProperty</a>
@@ -25683,6 +25795,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/undertow/core/servlet/UndertowServletWebServerFactory.html#getSettings()" title="Method in UndertowServletWebServerFactory">getSettings()</a></span> - Method in <a href="org/apache/grails/undertow/core/servlet/UndertowServletWebServerFactory.html">UndertowServletWebServerFactory</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getSettingsDirectory()" title="Method in GenerateTagLibraryIndexTask">getSettingsDirectory()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">Where the settings this build declared are written.</div></dd>
<dt><span class="strong"><a href="org/grails/async/transform/internal/DefaultDelegateAsyncTransactionalMethodTransformer.html#getSetTransactionManagerMethodBody(org.codehaus.groovy.ast.ClassNode)" title="Method in DefaultDelegateAsyncTransactionalMethodTransformer">getSetTransactionManagerMethodBody(org.codehaus.groovy.ast.ClassNode)</a></span> - Method in <a href="org/grails/async/transform/internal/DefaultDelegateAsyncTransactionalMethodTransformer.html">DefaultDelegateAsyncTransaction [...]
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/validation/constraints/builder/ConstrainedPropertyBuilder.html#getSharedConstraint(java.lang.String)" title="Method in ConstrainedPropertyBuilder">getSharedConstraint(java.lang.String)</a></span> - Method in <a href="org/grails/datastore/gorm/validation/constraints/builder/ConstrainedPropertyBuilder.html">ConstrainedPropertyBuilder</a>
@@ -25759,6 +25873,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the checksum of the GSP source this page was compiled from, or <CODE>null</CODE> if none was recorded</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageParser.html#getSourceChecksum()" title="Method in GroovyPageParser">getSourceChecksum()</a></span> - Method in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>a checksum of the GSP source this page was generated from, or <CODE>null</CODE> if none was recorded</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getSourceDirectories()" title="Method in GenerateTagLibraryIndexTask">getSourceDirectories()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">The directories holding tag library sources.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getSourceEncoding()" title="Method in GenerateTagLibraryIndexTask">getSourceEncoding()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">The source encoding, matching the one compilation uses.</div></dd>
<dt><span class="strong"><a href="grails/views/WritableScript.html#getSourceFile()" title="Method in WritableScript">getSourceFile()</a></span> - Method in <a href="grails/views/WritableScript.html">WritableScript</a>
</dt><dd> <div class="block">Obtains the source file</div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/core/TestPhase.html#getSourceFolderName()" title="Method in TestPhase">getSourceFolderName()</a></span> - Method in <a href="org/grails/gradle/plugin/core/TestPhase.html">TestPhase</a>
@@ -25771,6 +25889,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/views/compiler/BuilderTypeCheckingExtension.BuilderMethodReplacer.html#getSourceUnit()" title="Method in BuilderTypeCheckingExtension.BuilderMethodReplacer">getSourceUnit()</a></span> - Method in <a href="grails/views/compiler/BuilderTypeCheckingExtension.BuilderMethodReplacer.html">BuilderTypeCheckingExtension.BuilderMethodReplacer</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html#getSourceUnit()" title="Method in CompiledTagCallRewriter">getSourceUnit()</a></span> - Method in <a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html">CompiledTagCallRewriter</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.html#getSourceUnit()" title="Method in DetachedCriteriaTransformer">getSourceUnit()</a></span> - Method in <a href="org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.html">DetachedCriteriaTransformer</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/query/transform/GormQuerySafetyTransformer.html#getSourceUnit()" title="Method in GormQuerySafetyTransformer">getSourceUnit()</a></span> - Method in <a href="org/grails/datastore/gorm/query/transform/GormQuerySafetyTransformer.html">GormQuerySafetyTransformer</a>
@@ -25898,6 +26018,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/encoder/EncodesToWriterAdapter.html#getStreamingEncoder()" title="Method in EncodesToWriterAdapter">getStreamingEncoder()</a></span> - Method in <a href="org/grails/encoder/EncodesToWriterAdapter.html">EncodesToWriterAdapter</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getStrictTags()" title="Method in GenerateTagLibraryIndexTask">getStrictTags()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">Whether a tag no compiled tag library declares fails compilation rather than being reported as a
+ warning. </div></dd>
<dt><span class="strong"><a href="grails/util/AbstractTypeConvertingMap.html#getString(java.lang.String, java.lang.String)" title="Method in AbstractTypeConvertingMap">getString(java.lang.String, java.lang.String)</a></span> - Method in <a href="grails/util/AbstractTypeConvertingMap.html">AbstractTypeConvertingMap</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/json/JSONArray.html#getString(int)" title="Method in JSONArray">getString(int)</a></span> - Method in <a href="org/grails/web/json/JSONArray.html">JSONArray</a>
@@ -26001,6 +26124,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/artefact/gsp/TagLibraryInvoker.html#getTaglibNamespace()" title="Method in TagLibraryInvoker">getTaglibNamespace()</a></span> - Method in <a href="grails/artefact/gsp/TagLibraryInvoker.html">TagLibraryInvoker</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gsp/GroovyPage.html#getTagLibraryLookup()" title="Method in GroovyPage">getTagLibraryLookup()</a></span> - Method in <a href="org/grails/gsp/GroovyPage.html">GroovyPage</a>
+</dt><dd> <div class="block">The tag libraries this page can reach.</div></dd>
<dt><span class="strong"><a href="org/grails/gsp/GroovyPageMetaInfo.html#getTagLibraryLookup()" title="Method in GroovyPageMetaInfo">getTagLibraryLookup()</a></span> - Method in <a href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/artefact/gsp/TagLibraryInvoker.html#getTagLibraryLookup()" title="Method in TagLibraryInvoker">getTagLibraryLookup()</a></span> - Method in <a href="grails/artefact/gsp/TagLibraryInvoker.html">TagLibraryInvoker</a>
@@ -26013,6 +26138,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/core/gsp/GrailsTagLibClass.html#getTagNames()" title="Method in GrailsTagLibClass">getTagNames()</a></span> - Method in <a href="grails/core/gsp/GrailsTagLibClass.html">GrailsTagLibClass</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The tag names in this library</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#getTagNames(java.lang.String)" title="Method in TagLibraryIndex">getTagNames(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#getTagNamesForClass(java.lang.String)" title="Method in TagLibraryIndex">getTagNamesForClass(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">The tags a given tag library declares, as recorded when it was compiled.</div></dd>
<dt><span class="strong"><a href="org/grails/core/gsp/DefaultGrailsTagLibClass.html#getTagNamesThatReturnObject()" title="Method in DefaultGrailsTagLibClass">getTagNamesThatReturnObject()</a></span> - Method in <a href="org/grails/core/gsp/DefaultGrailsTagLibClass.html">DefaultGrailsTagLibClass</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/core/gsp/GrailsTagLibClass.html#getTagNamesThatReturnObject()" title="Method in GrailsTagLibClass">getTagNamesThatReturnObject()</a></span> - Method in <a href="grails/core/gsp/GrailsTagLibClass.html">GrailsTagLibClass</a>
@@ -26446,6 +26575,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Factory method called to create the <a href='../../../../../../org/apache/grails/undertow/core/servlet/UndertowServletWebServer.html' title='UndertowServletWebServer'>UndertowServletWebServer</a>. </div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/config/Property.html#getUniquenessGroup()" title="Method in Property">getUniquenessGroup()</a></span> - Method in <a href="org/grails/datastore/mapping/config/Property.html">Property</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#getUnqualifiedTagCalls()" title="Method in GenerateTagLibraryIndexTask">getUnqualifiedTagCalls()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
+</dt><dd> <div class="block">Whether a tag call written without its namespace may be compiled into a direct invocation.
+ </div></dd>
<dt><span class="strong"><a href="org/grails/spring/DefaultRuntimeSpringConfiguration.html#getUnrefreshedApplicationContext()" title="Method in DefaultRuntimeSpringConfiguration">getUnrefreshedApplicationContext()</a></span> - Method in <a href="org/grails/spring/DefaultRuntimeSpringConfiguration.html">DefaultRuntimeSpringConfiguration</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/spring/RuntimeSpringConfiguration.html#getUnrefreshedApplicationContext()" title="Method in RuntimeSpringConfiguration">getUnrefreshedApplicationContext()</a></span> - Method in <a href="org/grails/spring/RuntimeSpringConfiguration.html">RuntimeSpringConfiguration</a>
@@ -29856,6 +29988,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/jsp/GroovyPagesPageContext.html#hasMoreElements()" title="Method in GroovyPagesPageContext">hasMoreElements()</a></span> - Method in <a href="org/grails/gsp/jsp/GroovyPagesPageContext.html">GroovyPagesPageContext</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#hasNamespace(java.lang.String)" title="Method in TagLibraryIndex">hasNamespace(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace, for example <CODE>g</CODE></DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryLookup.html#hasNamespace(java.lang.String)" title="Method in TagLibraryLookup">hasNamespace(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
</dt><dd> <div class="block">Returns whether the given namespace is in use</div></dd>
<dt><span class="strong"><a href="org/grails/web/mapping/DefaultLinkGenerator.html#hasNamespacedControllers()" title="Method in DefaultLinkGenerator">hasNamespacedControllers()</a></span> - Method in <a href="org/grails/web/mapping/DefaultLinkGenerator.html">DefaultLinkGenerator</a>
@@ -29874,6 +30008,12 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/services/SoftServiceLoader.html#hasNext()" title="Method in SoftServiceLoader">hasNext()</a></span> - Method in <a href="org/grails/datastore/mapping/services/SoftServiceLoader.html">SoftServiceLoader</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#hasNotATagAnnotation()" title="Method in AstTagMethodView">hasNotATagAnnotation()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#hasNotATagAnnotation()" title="Method in ReflectedTagMethodView">hasNotATagAnnotation()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#hasNotATagAnnotation()" title="Method in TagMethodView">hasNotATagAnnotation()</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>true if the method is annotated <CODE>@NotATag</CODE>, which excludes it whatever its shape</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/mongo/engine/AbstractMongoObectEntityPersister.html#hasNumericalIdentifier" title="Field in AbstractMongoObectEntityPersister">hasNumericalIdentifier</a></span> - Field in <a href="org/grails/datastore/mapping/mongo/engine/AbstractMongoObectEntityPersister.html">AbstractMongoObectEntityPersister</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.html#hasNumericalIdentifier" title="Field in MongoCodecEntityPersister">hasNumericalIdentifier</a></span> - Field in <a href="org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.html">MongoCodecEntityPersister</a>
@@ -29974,6 +30114,12 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/core/gsp/GrailsTagLibClass.html#hasTag(java.lang.String)" title="Method in GrailsTagLibClass">hasTag(java.lang.String)</a></span> - Method in <a href="grails/core/gsp/GrailsTagLibClass.html">GrailsTagLibClass</a>
</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>tagName</code> - The name of the tag</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#hasTagAnnotation()" title="Method in AstTagMethodView">hasTagAnnotation()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#hasTagAnnotation()" title="Method in ReflectedTagMethodView">hasTagAnnotation()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#hasTagAnnotation()" title="Method in TagMethodView">hasTagAnnotation()</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>true if the method is annotated <CODE>@Tag</CODE>, which makes it a tag whatever its shape</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/ModelEntry.html#hasTagLibs()" title="Method in ModelEntry">hasTagLibs()</a></span> - Method in <a href="org/grails/gsp/ModelEntry.html">ModelEntry</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/multitenancy/transform/TenantTransform.html#hasTenantAnnotation(org.codehaus.groovy.ast.AnnotatedNode)" title="Method in TenantTransform">hasTenantAnnotation(org.codehaus.groovy.ast.AnnotatedNode)</a></span> - Method in <a href="org/grails/datastore/gorm/multitenancy/transform/TenantTransform.html">TenantTransform</a>
@@ -31370,6 +31516,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/neo4j/Direction.html#INCOMING" title="Enum Constant in Direction">INCOMING</a></span> - Enum Constant in <a href="grails/neo4j/Direction.html">Direction</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#INCOMPLETE_LOCATION" title="Field in TagLibraryIndex">INCOMPLETE_LOCATION</a></span> - Field in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">What the index could not describe, written by whatever produced it.</div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceGeneratorEnum.html#INCREMENT" title="Enum Constant in GrailsSequenceGeneratorEnum">INCREMENT</a></span> - Enum Constant in <a href="org/grails/orm/hibernate/cfg/domainbinding/generator/GrailsSequenceGeneratorEnum.html">GrailsSequenceGeneratorEnum</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/model/ValueGenerator.html#INCREMENT" title="Enum Constant in ValueGenerator">INCREMENT</a></span> - Enum Constant in <a href="org/grails/datastore/mapping/model/ValueGenerator.html">ValueGenerator</a>
@@ -31396,6 +31544,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">TTL index attribute. </div></dd>
<dt><span class="strong"><a href="org/grails/databinding/IndexedPropertyReferenceDescriptor.html#index" title="Property in IndexedPropertyReferenceDescriptor">index</a></span> - Property in <a href="org/grails/databinding/IndexedPropertyReferenceDescriptor.html">IndexedPropertyReferenceDescriptor</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#INDEX_LOCATION" title="Field in TagLibraryIndex">INDEX_LOCATION</a></span> - Field in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Classpath directory holding one descriptor per compiled tag library.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#INDEX_LOCATION" title="Property in TagLibraryIndexFiles">INDEX_LOCATION</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block">Directory holding one descriptor per compiled tag library.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/mongo/config/MongoAttribute.html#index(java.lang.String)" title="Method in MongoAttribute">index(java.lang.String)</a></span> - Method in <a href="org/grails/datastore/mapping/mongo/config/MongoAttribute.html">MongoAttribute</a>
</dt><dd> <div class="block">Configures the index type</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/mongo/config/MongoCollection.html#index(Map<String, Object>, Map<String, Object>)" title="Method in MongoCollection">index(Map<String, Object>, Map<String, Object>)</a></span> - Method in <a href="org/grails/datastore/mapping/mongo/config/MongoCollection.html">MongoCollection</a>
@@ -31783,8 +31935,6 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/databinding/SimpleDataBinder.html#initializeMap(java.lang.Object, java.lang.String)" title="Method in SimpleDataBinder">initializeMap(java.lang.Object, java.lang.String)</a></span> - Method in <a href="grails/databinding/SimpleDataBinder.html">SimpleDataBinder</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/taglib/NamespacedTagDispatcher.html#initializeMetaClass()" title="Method in NamespacedTagDispatcher">initializeMetaClass()</a></span> - Method in <a href="org/grails/taglib/NamespacedTagDispatcher.html">NamespacedTagDispatcher</a>
-</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/compiler/web/ControllerActionTransformer.html#initializeMethodParameter(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.stmt.BlockStatement, org.codehaus.groovy.ast.ASTNode, java.lang.String, org.codehaus.groovy.ast.Parameter, org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.classgen.GeneratorContext)" title="Method in ControllerActionTransformer">initializeMethodParameter(org.codehaus.groovy.ast.ClassNode, org.codehaus.g [...]
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/AbstractGormApi.html#initializeMethods(java.lang.Class)" title="Method in AbstractGormApi">initializeMethods(java.lang.Class)</a></span> - Method in <a href="org/grails/datastore/gorm/AbstractGormApi.html">AbstractGormApi</a>
@@ -31824,7 +31974,7 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a href="org/grails/compiler/web/ControllerActionTransformer.html#initializeStringParameter(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.stmt.BlockStatement, org.codehaus.groovy.ast.Parameter, java.lang.String)" title="Method in ControllerActionTransformer">initializeStringParameter(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.stmt.BlockStatement, org.codehaus.groovy.ast.Parameter, java.lang.String)</a></span> - Method in <a href="org/ [...]
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/artefact/TagLibrary.html#initializeTagLibrary()" title="Method in TagLibrary">initializeTagLibrary()</a></span> - Method in <a href="grails/artefact/TagLibrary.html">TagLibrary</a>
-</dt><dd> <div class="block"></div></dd>
+</dt><dd> <div class="block">Retained deliberately, and deliberately empty.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/proxy/SessionEntityProxyMethodHandler.html#initializeTarget(java.lang.Object)" title="Method in SessionEntityProxyMethodHandler">initializeTarget(java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/mapping/proxy/SessionEntityProxyMethodHandler.html">SessionEntityProxyMethodHandler</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/views/ResolvableGroovyTemplateEngine.html#initializeTemplate(grails.views.GrailsViewTemplate, java.io.File)" title="Method in ResolvableGroovyTemplateEngine">initializeTemplate(grails.views.GrailsViewTemplate, java.io.File)</a></span> - Method in <a href="grails/views/ResolvableGroovyTemplateEngine.html">ResolvableGroovyTemplateEngine</a>
@@ -32396,6 +32546,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/CloseSuppressingInvocationHandler.html#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)" title="Method in CloseSuppressingInvocationHandler">invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)</a></span> - Method in <a href="org/grails/orm/hibernate/CloseSuppressingInvocationHandler.html">CloseSuppressingInvocationHandler</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/CompiledTagInvocation.html#invoke(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, Map<?,?>, java.lang.Object, org.grails.taglib.encoder.OutputContext)" title="Method in CompiledTagInvocation">invoke(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, Map<?,?>, java.lang.Object, org.grails.taglib.encoder.OutputContext)</a></span> - Method in <a href="org/grails/taglib/CompiledTagInvocatio [...]
+</dt><dd> <div class="block">Invokes a tag against a known output context, for a caller that already has one to hand.</div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/fetcher/interceptor/CustomInterceptorInvoker.html#invoke(org.grails.gorm.graphql.interceptor.GraphQLFetcherInterceptor, java.lang.String, graphql.schema.DataFetchingEnvironment)" title="Method in CustomInterceptorInvoker">invoke(org.grails.gorm.graphql.interceptor.GraphQLFetcherInterceptor, java.lang.String, graphql.schema.DataFetchingEnvironment)</a></span> - Method in <a href="org/grails/gorm/graphql/fetcher/interceptor/CustomIn [...]
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/fetcher/interceptor/CustomMutationInterceptorInvoker.html#invoke(org.grails.gorm.graphql.interceptor.GraphQLFetcherInterceptor, java.lang.String, graphql.schema.DataFetchingEnvironment)" title="Method in CustomMutationInterceptorInvoker">invoke(org.grails.gorm.graphql.interceptor.GraphQLFetcherInterceptor, java.lang.String, graphql.schema.DataFetchingEnvironment)</a></span> - Method in <a href="org/grails/gorm/graphql/fetcher/inte [...]
@@ -32434,6 +32586,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/fetcher/interceptor/ProvidedInterceptorInvoker.html#invoke(org.grails.gorm.graphql.interceptor.GraphQLFetcherInterceptor, graphql.schema.DataFetchingEnvironment, org.grails.gorm.graphql.fetcher.GraphQLDataFetcherType)" title="Method in ProvidedInterceptorInvoker">invoke(org.grails.gorm.graphql.interceptor.GraphQLFetcherInterceptor, graphql.schema.DataFetchingEnvironment, org.grails.gorm.graphql.fetcher.GraphQLDataFetcherType)</a>< [...]
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/CompiledTagInvocation.html#invokeArguments(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object)" title="Method in CompiledTagInvocation">invokeArguments(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/taglib/CompiledTagInvocation.html">CompiledTagInvocation</a>
+</dt><dd> <div class="block">Invokes a tag with whatever arguments the call was written with.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/CompiledTagInvocation.html#invokeArgumentsInContext(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, org.grails.taglib.encoder.OutputContext, java.lang.Object)" title="Method in CompiledTagInvocation">invokeArgumentsInContext(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, org.grails.taglib.encoder.OutputContext, java.lang.Object)</a></span> - Method in <a href="org/grails/taglib/CompiledTa [...]
+</dt><dd> <div class="block">Invokes a tag with whatever arguments the call was written with, against a known output context.</div></dd>
<dt><span class="strong"><a href="grails/spring/BeanBuilder.html#invokeBeanDefiningClosure(Closure<?>)" title="Method in BeanBuilder">invokeBeanDefiningClosure(Closure<?>)</a></span> - Method in <a href="grails/spring/BeanBuilder.html">BeanBuilder</a>
</dt><dd> <div class="block">When an method's argument is only a closure it is a set of bean definitions.</div></dd>
<dt><span class="strong"><a href="grails/spring/BeanBuilder.html#invokeBeanDefiningMethod(java.lang.String, java.lang.Object)" title="Method in BeanBuilder">invokeBeanDefiningMethod(java.lang.String, java.lang.Object)</a></span> - Method in <a href="grails/spring/BeanBuilder.html">BeanBuilder</a>
@@ -32661,6 +32817,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/undertow/core/autoconfigure/UndertowServerProperties.html#isAlwaysSetKeepAlive()" title="Method in UndertowServerProperties">isAlwaysSetKeepAlive()</a></span> - Method in <a href="org/apache/grails/undertow/core/autoconfigure/UndertowServerProperties.html">UndertowServerProperties</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#isAmbiguous(java.lang.String, java.lang.String)" title="Method in TagLibraryIndex">isAmbiguous(java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Whether more than one tag library declares this tag, in which case which one the runtime will
+ dispatch to depends on registration order and cannot be decided here.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/services/implementers/AbstractStringQueryImplementer.html#isAnnotated(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode)" title="Method in AbstractStringQueryImplementer">isAnnotated(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode)</a></span> - Method in <a href="org/grails/datastore/gorm/services/implementers/AbstractStringQueryImplementer.html">AbstractStringQueryImplementer</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/services/implementers/AbstractWhereImplementer.html#isAnnotated(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode)" title="Method in AbstractWhereImplementer">isAnnotated(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode)</a></span> - Method in <a href="org/grails/datastore/gorm/services/implementers/AbstractWhereImplementer.html">AbstractWhereImplementer</a>
@@ -32978,6 +33137,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a href="grails/util/GrailsClassUtils.html#isClassBelowPackage(Class<?>, List<?>)" title="Method in GrailsClassUtils">isClassBelowPackage(Class<?>, List<?>)</a></span> - Method in <a href="grails/util/GrailsClassUtils.html">GrailsClassUtils</a>
</dt><dd> <div class="block">Returns whether the specified class is either within one of the specified packages or
within a subpackage of one of the packages</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#isClassDescribed(java.lang.String)" title="Method in TagLibraryIndex">isClassDescribed(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Whether a descriptor for this tag library already exists.</div></dd>
<dt><span class="strong"><a href="org/grails/io/support/MainClassFinder.html#isClassFile(java.io.File)" title="Method in MainClassFinder">isClassFile(java.io.File)</a></span> - Method in <a href="org/grails/io/support/MainClassFinder.html">MainClassFinder</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/testing/cleanup/core/DatasourceCleanupMapping.html#isCleanAll()" title="Method in DatasourceCleanupMapping">isCleanAll()</a></span> - Method in <a href="org/apache/grails/testing/cleanup/core/DatasourceCleanupMapping.html">DatasourceCleanupMapping</a>
@@ -33270,6 +33431,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/core/plugins/PluginInfo.html#isDynamic()" title="Method in PluginInfo">isDynamic()</a></span> - Method in <a href="org/apache/grails/core/plugins/PluginInfo.html">PluginInfo</a>
</dt><dd> <div class="block">Returns whether this plugin was discovered from a dynamic plugin configuration.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#isDynamicNamespace(java.lang.String)" title="Method in TagLibraryIndex">isDynamicNamespace(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL></div></dd>
<dt><span class="strong"><a href="org/apache/grails/undertow/core/autoconfigure/UndertowServerProperties.html#isEagerFilterInit()" title="Method in UndertowServerProperties">isEagerFilterInit()</a></span> - Method in <a href="org/apache/grails/undertow/core/autoconfigure/UndertowServerProperties.html">UndertowServerProperties</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/undertow/core/servlet/UndertowServletWebServerFactory.html#isEagerFilterInit()" title="Method in UndertowServletWebServerFactory">isEagerFilterInit()</a></span> - Method in <a href="org/apache/grails/undertow/core/servlet/UndertowServletWebServerFactory.html">UndertowServletWebServerFactory</a>
@@ -33376,6 +33539,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/servlet/mvc/SynchronizerTokensHolder.html#isEmpty()" title="Method in SynchronizerTokensHolder">isEmpty()</a></span> - Method in <a href="org/grails/web/servlet/mvc/SynchronizerTokensHolder.html">SynchronizerTokensHolder</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#isEmpty()" title="Method in TagLibraryIndex">isEmpty()</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>true when no compiled tag library was found, in which case callers must fall back to
+ runtime resolution</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/AbstractGrailsPlugin.html#isEnabled(java.lang.String)" title="Method in AbstractGrailsPlugin">isEnabled(java.lang.String)</a></span> - Method in <a href="org/grails/plugins/AbstractGrailsPlugin.html">AbstractGrailsPlugin</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/DefaultGrailsPlugin.html#isEnabled()" title="Method in DefaultGrailsPlugin">isEnabled()</a></span> - Method in <a href="org/grails/plugins/DefaultGrailsPlugin.html">DefaultGrailsPlugin</a>
@@ -33475,6 +33641,13 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Check whether the given request is a forward request</div></dd>
<dt><span class="strong"><a href="org/grails/web/util/WebUtils.html#isForwardOrInclude(jakarta.servlet.http.HttpServletRequest)" title="Method in WebUtils">isForwardOrInclude(jakarta.servlet.http.HttpServletRequest)</a></span> - Method in <a href="org/grails/web/util/WebUtils.html">WebUtils</a>
</dt><dd> <div class="block">Check whether the given request is an include or forward request</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#isGenerated()" title="Method in AstTagMethodView">isGenerated()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#isGenerated()" title="Method in ReflectedTagMethodView">isGenerated()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#isGenerated()" title="Method in TagMethodView">isGenerated()</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>true if the method was generated by the compiler rather than written, covering bridge
+ methods and the accessors trait application produces</DD></DL></div></dd>
<dt><span class="strong"><a href="org/apache/grails/common/aot/AheadOfTimeProcessing.html#isGeneratingCode()" title="Method in AheadOfTimeProcessing">isGeneratingCode()</a></span> - Method in <a href="org/apache/grails/common/aot/AheadOfTimeProcessing.html">AheadOfTimeProcessing</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>whether this is running inside ahead-of-time processing rather than in an application</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/testing/GrailsMockHttpServletRequest.html#isGet()" title="Method in GrailsMockHttpServletRequest">isGet()</a></span> - Method in <a href="org/grails/plugins/testing/GrailsMockHttpServletRequest.html">GrailsMockHttpServletRequest</a>
@@ -33738,6 +33911,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/tags/GroovyWhileTag.html#isKeepPrecedingWhiteSpace()" title="Method in GroovyWhileTag">isKeepPrecedingWhiteSpace()</a></span> - Method in <a href="org/grails/gsp/compiler/tags/GroovyWhileTag.html">GroovyWhileTag</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#isKnown(java.lang.String, java.lang.String)" title="Method in TagLibraryIndex">isKnown(java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Whether a compiled tag library declares this tag, including one declared by more than one of
+ them. </div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentEntity.html#isLazy(org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernatePersistentProperty)" title="Method in GrailsHibernatePersistentEntity">isLazy(org.grails.orm.hibernate.cfg.domainbinding.hibernate.HibernatePersistentProperty)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentEntity.html">GrailsHibernateP [...]
</dt><dd> <div class="block">Determines if the given property should be lazy.</div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateManyToManyProperty.html#isLazy()" title="Method in HibernateManyToManyProperty">isLazy()</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateManyToManyProperty.html">HibernateManyToManyProperty</a>
@@ -33835,6 +34011,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/IdentityEnumType.html#isMutable()" title="Method in IdentityEnumType">isMutable()</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/IdentityEnumType.html">IdentityEnumType</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#isNamespaceComplete(java.lang.String)" title="Method in TagLibraryIndex">isNamespaceComplete(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Whether everything in a namespace was described.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/neo4j/GraphPersistentEntity.html#isNativeId()" title="Method in GraphPersistentEntity">isNativeId()</a></span> - Method in <a href="org/grails/datastore/gorm/neo4j/GraphPersistentEntity.html">GraphPersistentEntity</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Whether the ID is native</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/boot/GrailsBanner.html#isNativeImage()" title="Method in GrailsBanner">isNativeImage()</a></span> - Method in <a href="grails/boot/GrailsBanner.html">GrailsBanner</a>
@@ -34048,6 +34226,30 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/query/HqlListQueryBuilder.html#isPaged(Map<String,Object>)" title="Method in HqlListQueryBuilder">isPaged(Map<String,Object>)</a></span> - Method in <a href="org/grails/orm/hibernate/query/HqlListQueryBuilder.html">HqlListQueryBuilder</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#isParameterClosureAssignable(int)" title="Method in AstTagMethodView">isParameterClosureAssignable(int)</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#isParameterClosureAssignable(int)" title="Method in ReflectedTagMethodView">isParameterClosureAssignable(int)</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#isParameterClosureAssignable(int)" title="Method in TagMethodView">isParameterClosureAssignable(int)</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#isParameterMapAssignable(int)" title="Method in AstTagMethodView">isParameterMapAssignable(int)</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#isParameterMapAssignable(int)" title="Method in ReflectedTagMethodView">isParameterMapAssignable(int)</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#isParameterMapAssignable(int)" title="Method in TagMethodView">isParameterMapAssignable(int)</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#isParameterNamePresent(int)" title="Method in AstTagMethodView">isParameterNamePresent(int)</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#isParameterNamePresent(int)" title="Method in ReflectedTagMethodView">isParameterNamePresent(int)</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#isParameterNamePresent(int)" title="Method in TagMethodView">isParameterNamePresent(int)</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#isParameterOptional(int)" title="Method in AstTagMethodView">isParameterOptional(int)</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#isParameterOptional(int)" title="Method in ReflectedTagMethodView">isParameterOptional(int)</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#isParameterOptional(int)" title="Method in TagMethodView">isParameterOptional(int)</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/web/mapping/DefaultUrlMappingInfo.html#isParsingRequest()" title="Method in DefaultUrlMappingInfo">isParsingRequest()</a></span> - Method in <a href="org/grails/web/mapping/DefaultUrlMappingInfo.html">DefaultUrlMappingInfo</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/mapping/ForwardUrlMappingInfo.html#isParsingRequest()" title="Method in ForwardUrlMappingInfo">isParsingRequest()</a></span> - Method in <a href="org/grails/web/mapping/ForwardUrlMappingInfo.html">ForwardUrlMappingInfo</a>
@@ -34162,12 +34364,18 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/proxy/SessionEntityProxyMethodHandler.html#isProxyInitiated(java.lang.Object)" title="Method in SessionEntityProxyMethodHandler">isProxyInitiated(java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/mapping/proxy/SessionEntityProxyMethodHandler.html">SessionEntityProxyMethodHandler</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#isPublic()" title="Method in AstTagMethodView">isPublic()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/io/GroovyPageCompiledScriptSource.html#isPublic()" title="Method in GroovyPageCompiledScriptSource">isPublic()</a></span> - Method in <a href="org/grails/gsp/io/GroovyPageCompiledScriptSource.html">GroovyPageCompiledScriptSource</a>
</dt><dd> <div class="block">Whether the GSP is publicly accessible directly, or only usable using internal rendering</div></dd>
<dt><span class="strong"><a href="org/grails/gsp/io/GroovyPageResourceScriptSource.html#isPublic()" title="Method in GroovyPageResourceScriptSource">isPublic()</a></span> - Method in <a href="org/grails/gsp/io/GroovyPageResourceScriptSource.html">GroovyPageResourceScriptSource</a>
</dt><dd> <div class="block">Whether the GSP is publicly accessible directly, or only usable using internal rendering</div></dd>
<dt><span class="strong"><a href="org/grails/gsp/io/GroovyPageScriptSource.html#isPublic()" title="Method in GroovyPageScriptSource">isPublic()</a></span> - Method in <a href="org/grails/gsp/io/GroovyPageScriptSource.html">GroovyPageScriptSource</a>
</dt><dd> <div class="block">Whether the GSP is publicly accessible directly, or only usable using internal rendering</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#isPublic()" title="Method in ReflectedTagMethodView">isPublic()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#isPublic()" title="Method in TagMethodView">isPublic()</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>true if the method is public</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/util/GrailsClassUtils.html#isPublicField(java.lang.Object, java.lang.String)" title="Method in GrailsClassUtils">isPublicField(java.lang.Object, java.lang.String)</a></span> - Method in <a href="grails/util/GrailsClassUtils.html">GrailsClassUtils</a>
</dt><dd> <div class="block">Work out if the specified object has a public field with the name supplied.</div></dd>
<dt><span class="strong"><a href="org/grails/gsp/io/GroovyPageResourceScriptSource.html#isPublicPath(java.lang.String)" title="Method in GroovyPageResourceScriptSource">isPublicPath(java.lang.String)</a></span> - Method in <a href="org/grails/gsp/io/GroovyPageResourceScriptSource.html">GroovyPageResourceScriptSource</a>
@@ -34430,6 +34638,12 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/core/SessionImplementor.html#isStateless(org.grails.datastore.mapping.model.PersistentEntity)" title="Method in SessionImplementor">isStateless(org.grails.datastore.mapping.model.PersistentEntity)</a></span> - Method in <a href="org/grails/datastore/mapping/core/SessionImplementor.html">SessionImplementor</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Whether the session is stateless</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagMethodView.html#isStatic()" title="Method in AstTagMethodView">isStatic()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagMethodView.html">AstTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#isStatic()" title="Method in ReflectedTagMethodView">isStatic()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html#isStatic()" title="Method in TagMethodView">isStatic()</a></span> - Method in <a href="org/grails/taglib/discovery/TagMethodView.html">TagMethodView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>true if the method is static</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/compiler/injection/AbstractGrailsArtefactTransformer.html#isStaticCandidateMethod(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode)" title="Method in AbstractGrailsArtefactTransformer">isStaticCandidateMethod(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode)</a></span> - Method in <a href="org/grails/compiler/injection/AbstractGrailsArtefactTransformer.html">AbstractGrailsArtefactTransformer</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/compiler/injection/AbstractGrailsArtefactTransformer.html#isStaticMethodExcluded(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode)" title="Method in AbstractGrailsArtefactTransformer">isStaticMethodExcluded(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.MethodNode)</a></span> - Method in <a href="org/grails/compiler/injection/AbstractGrailsArtefactTransformer.html">AbstractGrailsArtefactTransformer</a>
@@ -34440,6 +34654,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/gradle/RunningApplicationProcess.html#isStopRequested(java.io.File)" title="Method in RunningApplicationProcess">isStopRequested(java.io.File)</a></span> - Method in <a href="org/grails/cli/gradle/RunningApplicationProcess.html">RunningApplicationProcess</a>
</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>buildDir</code> - the project build directory</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#isStrict()" title="Method in TagLibraryIndex">isStrict()</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Whether the build asked for a tag no compiled tag library declares to fail compilation.</div></dd>
<dt><span class="strong"><a href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html#isStringType(java.lang.Class)" title="Method in DefaultJsonViewHelper">isStringType(java.lang.Class)</a></span> - Method in <a href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html">DefaultJsonViewHelper</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/reflect/AstUtils.html#isSubclassOf(org.codehaus.groovy.ast.ClassNode, java.lang.String)" title="Method in AstUtils">isSubclassOf(org.codehaus.groovy.ast.ClassNode, java.lang.String)</a></span> - Method in <a href="org/grails/datastore/mapping/reflect/AstUtils.html">AstUtils</a>
@@ -34514,6 +34730,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentEntity.html#isTablePerHierarchySubclass()" title="Method in GrailsHibernatePersistentEntity">isTablePerHierarchySubclass()</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/GrailsHibernatePersistentEntity.html">GrailsHibernatePersistentEntity</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagDiscoveryRules.html#isTagMethod(org.grails.taglib.discovery.TagMethodView)" title="Method in TagDiscoveryRules">isTagMethod(org.grails.taglib.discovery.TagMethodView)</a></span> - Method in <a href="org/grails/taglib/discovery/TagDiscoveryRules.html">TagDiscoveryRules</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>method</code> - the method to classify</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html#isTagMethodCandidate(java.lang.reflect.Method)" title="Method in TagMethodInvoker">isTagMethodCandidate(java.lang.reflect.Method)</a></span> - Method in <a href="org/grails/taglib/TagMethodInvoker.html">TagMethodInvoker</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/config/AbstractGormMappingFactory.html#isTenantId(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.beans.PropertyDescriptor)" title="Method in AbstractGormMappingFactory">isTenantId(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.beans.PropertyDescriptor)</a></span> - Method in <a href="org/grails/datastore [...]
@@ -36210,6 +36428,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/services/SoftServiceLoader.html#load(Class<S>, java.lang.ClassLoader, Predicate<String>)" title="Method in SoftServiceLoader">load(Class<S>, java.lang.ClassLoader, Predicate<String>)</a></span> - Method in <a href="org/grails/datastore/mapping/services/SoftServiceLoader.html">SoftServiceLoader</a>
</dt><dd> <div class="block">Creates a new <a href='../../../../../org/grails/datastore/mapping/services/SoftServiceLoader.html' title='SoftServiceLoader'>SoftServiceLoader</a> using the given type and class loader.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#load(java.lang.ClassLoader)" title="Method in TagLibraryIndex">load(java.lang.ClassLoader)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Reads every tag library descriptor visible to the given class loader.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.html#load(java.io.Serializable)" title="Method in TenantDelegatingGormOperations">load(java.io.Serializable)</a></span> - Method in <a href="org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.html">TenantDelegatingGormOperations</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/config/yaml/YamlPropertySourceLoader.html#load()" title="Method in YamlPropertySourceLoader">load()</a></span> - Method in <a href="org/grails/config/yaml/YamlPropertySourceLoader.html">YamlPropertySourceLoader</a>
@@ -36401,6 +36621,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/data/testing/tck/domains/CommonTypes.html#loc" title="Property in CommonTypes">loc</a></span> - Property in <a href="org/apache/grails/data/testing/tck/domains/CommonTypes.html">CommonTypes</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#LOCAL_NAMESPACES_KEY" title="Property in TagLibraryIndexFiles">LOCAL_NAMESPACES_KEY</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/testing/MockDataFetchingEnvironment.html#localContext" title="Property in MockDataFetchingEnvironment">localContext</a></span> - Property in <a href="org/grails/gorm/graphql/testing/MockDataFetchingEnvironment.html">MockDataFetchingEnvironment</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/bson/codecs/temporal/LocalDateBsonConverter.html" title="Trait in org.grails.datastore.bson.codecs.temporal">LocalDateBsonConverter</a></span> - Trait in <a href="./org/grails/datastore/bson/codecs/temporal/package-summary.html">org.grails.datastore.bson.codecs.temporal</a>
@@ -36776,6 +36998,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Looks up the current Grails WebRequest instance</div></dd>
<dt><span class="strong"><a href="org/grails/taglib/NamespacedTagDispatcher.html#lookup" title="Field in NamespacedTagDispatcher">lookup</a></span> - Field in <a href="org/grails/taglib/NamespacedTagDispatcher.html">NamespacedTagDispatcher</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#lookup(java.lang.String, java.lang.String)" title="Method in TagLibraryIndex">lookup(java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/web/mapping/UrlCreatorCache.html#lookup(org.grails.web.mapping.UrlCreatorCache.ReverseMappingKey)" title="Method in UrlCreatorCache">lookup(org.grails.web.mapping.UrlCreatorCache.ReverseMappingKey)</a></span> - Method in <a href="org/grails/web/mapping/UrlCreatorCache.html">UrlCreatorCache</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/util/GrailsWebUtil.html#lookupApplication(jakarta.servlet.ServletContext)" title="Method in GrailsWebUtil">lookupApplication(jakarta.servlet.ServletContext)</a></span> - Method in <a href="grails/util/GrailsWebUtil.html">GrailsWebUtil</a>
@@ -37061,6 +37285,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/init/Start.html#main(java.lang.String)" title="Method in Start">main(java.lang.String)</a></span> - Method in <a href="grails/init/Start.html">Start</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndexGenerator.html#main(java.lang.String)" title="Method in TagLibraryIndexGenerator">main(java.lang.String)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndexGenerator.html">TagLibraryIndexGenerator</a>
+</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>args</code> - the output directory, whether parameter names are retained, the source encoding, how
+ many source directories follow, those directories, and then the source roots a type this
+ project declares may be resolved from</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/run/FindMainClassTask.html#mainClassCacheFile" title="Property in FindMainClassTask">mainClassCacheFile</a></span> - Property in <a href="org/grails/gradle/plugin/run/FindMainClassTask.html">FindMainClassTask</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/io/support/MainClassFinder.html#mainClasses" title="Property in MainClassFinder">mainClasses</a></span> - Property in <a href="org/grails/io/support/MainClassFinder.html">MainClassFinder</a>
@@ -38243,6 +38471,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Handles static method missing for dynamic finders</div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/entity/dsl/GraphQLMapping.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in GraphQLMapping">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/gorm/graphql/entity/dsl/GraphQLMapping.html">GraphQLMapping</a>
</dt><dd> <div class="block">Supplies configuration for an existing property</div></dd>
+<dt><span class="strong"><a href="org/grails/gsp/GroovyPage.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in GroovyPage">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/gsp/GroovyPage.html">GroovyPage</a>
+</dt><dd> <div class="block">Resolves a tag called without a namespace, as <CODE>${message(code: 'x')</CODE>} is.</div></dd>
<dt><span class="strong"><a href="org/grails/cli/profile/commands/script/GroovyScriptCommand.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in GroovyScriptCommand">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/cli/profile/commands/script/GroovyScriptCommand.html">GroovyScriptCommand</a>
</dt><dd> <div class="block">Method missing handler used to invoke other commands from a command script</div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateMappingBuilder.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in HibernateMappingBuilder">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/HibernateMappingBuilder.html">HibernateMappingBuilder</a>
@@ -38250,7 +38480,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/Mapping.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in Mapping">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/Mapping.html">Mapping</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/NamespacedTagDispatcher.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in NamespacedTagDispatcher">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/taglib/NamespacedTagDispatcher.html">NamespacedTagDispatcher</a>
-</dt><dd> <div class="block"></div></dd>
+</dt><dd> <div class="block">Every dispatcher used to be given its own ExpandoMetaClass carrying a method for each tag in the
+ namespace, built and populated as the dispatcher was constructed. </div></dd>
<dt><span class="strong"><a href="grails/plugins/redis/RedisService.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in RedisService">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="grails/plugins/redis/RedisService.html">RedisService</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/boot/config/tools/SettingsFile.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in SettingsFile">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="grails/boot/config/tools/SettingsFile.html">SettingsFile</a>
@@ -38260,7 +38491,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a href="grails/artefact/gsp/TagLibraryInvoker.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in TagLibraryInvoker">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="grails/artefact/gsp/TagLibraryInvoker.html">TagLibraryInvoker</a>
</dt><dd> <div class="block">Method missing implementation that handles tag invocation by method name</div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TemplateNamespacedTagDispatcher.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in TemplateNamespacedTagDispatcher">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/taglib/TemplateNamespacedTagDispatcher.html">TemplateNamespacedTagDispatcher</a>
-</dt><dd> <div class="block"></div></dd>
+</dt><dd> <div class="block">A template name used once used to be installed onto this dispatcher's metaclass so that the next
+ use of the same name bypassed methodMissing. </div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.html#methodMissing(java.lang.String, java.lang.Object)" title="Method in TenantDelegatingGormOperations">methodMissing(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.html">TenantDelegatingGormOperations</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html#methodMissingForTagLib(groovy.lang.MetaClass, java.lang.Class, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object, boolean)" title="Method in TagLibraryMetaUtils">methodMissingForTagLib(groovy.lang.MetaClass, java.lang.Class, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object, boolean)</a></span> - Method in <a href="org/grails/taglib/Ta [...]
@@ -39781,7 +40013,7 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/jsp/JspWriterDelegate.html#newLine()" title="Method in JspWriterDelegate">newLine()</a></span> - Method in <a href="org/grails/gsp/jsp/JspWriterDelegate.html">JspWriterDelegate</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="grails/plugins/mail/PlainTextMailTagLib.html#newLine" title="Property in PlainTextMailTagLib">newLine</a></span> - Property in <a href="grails/plugins/mail/PlainTextMailTagLib.html">PlainTextMailTagLib</a>
+<dt><span class="strong"><a href="grails/plugins/mail/PlainTextMailTagLib.html#newLine(java.util.Map)" title="Method in PlainTextMailTagLib">newLine(java.util.Map)</a></span> - Method in <a href="grails/plugins/mail/PlainTextMailTagLib.html">PlainTextMailTagLib</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/json/PrettyPrintJSONWriter.html#NEWLINE" title="Field in PrettyPrintJSONWriter">NEWLINE</a></span> - Field in <a href="org/grails/web/json/PrettyPrintJSONWriter.html">PrettyPrintJSONWriter</a>
</dt><dd> <div class="block"></div></dd>
@@ -43125,6 +43357,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugin/cache/compiler/CachePutTransformation.html#priority()" title="Method in CachePutTransformation">priority()</a></span> - Method in <a href="org/grails/plugin/cache/compiler/CachePutTransformation.html">CachePutTransformation</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/compiler/traits/CompiledTagCallTransformation.html#priority()" title="Method in CompiledTagCallTransformation">priority()</a></span> - Method in <a href="grails/compiler/traits/CompiledTagCallTransformation.html">CompiledTagCallTransformation</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/async/transform/DelegateAsyncTransformation.html#priority()" title="Method in DelegateAsyncTransformation">priority()</a></span> - Method in <a href="org/grails/datastore/gorm/async/transform/DelegateAsyncTransformation.html">DelegateAsyncTransformation</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/query/transform/DetachedCriteriaASTTransformation.html#priority()" title="Method in DetachedCriteriaASTTransformation">priority()</a></span> - Method in <a href="org/grails/datastore/gorm/query/transform/DetachedCriteriaASTTransformation.html">DetachedCriteriaASTTransformation</a>
@@ -44732,6 +44966,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/mongo/geo/ShapeType.html#readInternal(org.grails.datastore.mapping.model.PersistentProperty, java.lang.String, org.bson.Document)" title="Method in ShapeType">readInternal(org.grails.datastore.mapping.model.PersistentProperty, java.lang.String, org.bson.Document)</a></span> - Method in <a href="org/grails/datastore/gorm/mongo/geo/ShapeType.html">ShapeType</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#readNamespaces(java.io.File)" title="Method in TagLibraryIndexFiles">readNamespaces(java.io.File)</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block">Reads the namespaces of the descriptors beneath a directory.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/engine/NativeEntryEntityPersister.html#readObjectIdentifier(org.grails.datastore.mapping.engine.EntityAccess, org.grails.datastore.mapping.model.ClassMapping)" title="Method in NativeEntryEntityPersister">readObjectIdentifier(org.grails.datastore.mapping.engine.EntityAccess, org.grails.datastore.mapping.model.ClassMapping)</a></span> - Method in <a href="org/grails/datastore/mapping/engine/NativeEntryEntityPersister.html">Nat [...]
</dt><dd> <div class="block">Reads an objects identifier using the entity access and ClassMapping instance</div></dd>
<dt><span class="strong"><a href="grails/gorm/transactions/ReadOnly.html" title="Annotation Type in grails.gorm.transactions">ReadOnly</a></span> - Annotation Type in <a href="./grails/gorm/transactions/package-summary.html">grails.gorm.transactions</a>
@@ -44904,6 +45140,15 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/web/http/HttpHeaders.html#REFERER" title="Field in HttpHeaders">REFERER</a></span> - Field in <a href="grails/web/http/HttpHeaders.html">HttpHeaders</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html" title="Class in org.grails.taglib.discovery">ReflectedTagLibraryView</a></span> - Class in <a href="./org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a>
+</dt><dd><div class="block">A tag library read from its compiled class, as an application reads one when it registers it.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html#ReflectedTagLibraryView(Class<?>)" title="Constructor in ReflectedTagLibraryView">ReflectedTagLibraryView(Class<?>)</a></span> - Constructor in <a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html">ReflectedTagLibraryView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html" title="Class in org.grails.taglib.discovery">ReflectedTagMethodView</a></span> - Class in <a href="./org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a>
+</dt><dd><div class="block">A compiled method, seen through <a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a> so that <a href='../../../../org/grails/taglib/discovery/TagDiscoveryRules.html' title='TagDiscoveryRules'>TagDiscoveryRules</a> can classify
+ it at runtime.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagMethodView.html#ReflectedTagMethodView(java.lang.reflect.Method)" title="Constructor in ReflectedTagMethodView">ReflectedTagMethodView(java.lang.reflect.Method)</a></span> - Constructor in <a href="org/grails/taglib/discovery/ReflectedTagMethodView.html">ReflectedTagMethodView</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/services/SoftServiceLoader.html#REFLECTION_LOGGER" title="Field in SoftServiceLoader">REFLECTION_LOGGER</a></span> - Field in <a href="org/grails/datastore/mapping/services/SoftServiceLoader.html">SoftServiceLoader</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/ReflectionUtils.html" title="Class in grails.plugin.springsecurity">ReflectionUtils</a></span> - Class in <a href="./grails/plugin/springsecurity/package-summary.html">grails.plugin.springsecurity</a>
@@ -45237,7 +45482,7 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a href="org/grails/encoder/impl/StandaloneCodecLookup.html#registerMetaMethods" title="Property in StandaloneCodecLookup">registerMetaMethods</a></span> - Property in <a href="org/grails/encoder/impl/StandaloneCodecLookup.html">StandaloneCodecLookup</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/GroovyPagesMetaUtils.html#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)" title="Method in GroovyPagesMetaUtils">registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)</a></span> - Method in <a href="org/grails/gsp/GroovyPagesMetaUtils.html">GroovyPagesMetaUtils</a>
-</dt><dd> <div class="block"></div></dd>
+</dt><dd> <div class="block">Nothing is installed onto a page's metaclass any more.</div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html#registerMethodMissingForTags(groovy.lang.MetaClass, org.springframework.context.ApplicationContext, grails.core.gsp.GrailsTagLibClass, java.lang.String)" title="Method in TagLibraryMetaUtils">registerMethodMissingForTags(groovy.lang.MetaClass, org.springframework.context.ApplicationContext, grails.core.gsp.GrailsTagLibClass, java.lang.String)</a></span> - Method in <a href="org/grails/taglib/TagLibraryMetaUtils. [...]
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/events/transform/AnnotatedSubscriber.html#registerMethods()" title="Method in AnnotatedSubscriber">registerMethods()</a></span> - Method in <a href="org/grails/events/transform/AnnotatedSubscriber.html">AnnotatedSubscriber</a>
@@ -45319,12 +45564,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/gsp/boot/GspAutoConfiguration.TagLibraryLookupRegistrar.html#registerTagLibs(ManagedList<BeanDefinition>)" title="Method in GspAutoConfiguration.TagLibraryLookupRegistrar">registerTagLibs(ManagedList<BeanDefinition>)</a></span> - Method in <a href="grails/gsp/boot/GspAutoConfiguration.TagLibraryLookupRegistrar.html">GspAutoConfiguration.TagLibraryLookupRegistrar</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/taglib/NamespacedTagDispatcher.html#registerTagMetaMethods(groovy.lang.ExpandoMetaClass)" title="Method in NamespacedTagDispatcher">registerTagMetaMethods(groovy.lang.ExpandoMetaClass)</a></span> - Method in <a href="org/grails/taglib/NamespacedTagDispatcher.html">NamespacedTagDispatcher</a>
-</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html#registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)" title="Method in TagLibraryMetaUtils">registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)</a></span> - Method in <a href="org/grails/taglib/TagLibraryMetaUtils.html">TagLibraryMetaUtils</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/taglib/TemplateNamespacedTagDispatcher.html#registerTagMetaMethods(groovy.lang.ExpandoMetaClass)" title="Method in TemplateNamespacedTagDispatcher">registerTagMetaMethods(groovy.lang.ExpandoMetaClass)</a></span> - Method in <a href="org/grails/taglib/TemplateNamespacedTagDispatcher.html">TemplateNamespacedTagDispatcher</a>
-</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html#registerTagMethodContextMetaProperties(groovy.lang.MetaClass)" title="Method in TagLibraryMetaUtils">registerTagMethodContextMetaProperties(groovy.lang.MetaClass)</a></span> - Method in <a href="org/grails/taglib/TagLibraryMetaUtils.html">TagLibraryMetaUtils</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryLookup.html#registerTemplateNamespace()" title="Method in TagLibraryLookup">registerTemplateNamespace()</a></span> - Method in <a href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
@@ -46414,6 +46655,9 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a href="grails/web/mapping/LinkGenerator.html#resolveNamespace(java.lang.String, java.lang.String, java.util.Map)" title="Method in LinkGenerator">resolveNamespace(java.lang.String, java.lang.String, java.util.Map)</a></span> - Method in <a href="grails/web/mapping/LinkGenerator.html">LinkGenerator</a>
</dt><dd> <div class="block">Resolves the namespace to pass to reverse URL mapping when a caller may have supplied an
explicit <CODE>namespace</CODE> attribute.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagLibraryAstDiscovery.html#resolveNamespace(org.codehaus.groovy.ast.ClassNode)" title="Method in TagLibraryAstDiscovery">resolveNamespace(org.codehaus.groovy.ast.ClassNode)</a></span> - Method in <a href="org/grails/taglib/discovery/TagLibraryAstDiscovery.html">TagLibraryAstDiscovery</a>
+</dt><dd> <div class="block">Resolves the namespace the way <CODE>DefaultGrailsTagLibClass</CODE> does at runtime, which reads the
+ static <CODE>namespace</CODE> property through the class hierarchy.</div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/entity/dsl/helpers/Typed.html#resolveOutputType(org.grails.gorm.graphql.types.GraphQLTypeManager, org.grails.datastore.mapping.model.MappingContext)" title="Method in Typed">resolveOutputType(org.grails.gorm.graphql.types.GraphQLTypeManager, org.grails.datastore.mapping.model.MappingContext)</a></span> - Method in <a href="org/grails/gorm/graphql/entity/dsl/helpers/Typed.html">Typed</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/config/CompositeConfig.html#resolvePlaceholders(java.lang.String)" title="Method in CompositeConfig">resolvePlaceholders(java.lang.String)</a></span> - Method in <a href="org/grails/config/CompositeConfig.html">CompositeConfig</a>
@@ -46966,11 +47210,18 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/mapping/UrlCreatorCache.ReverseMappingKey.html#ReverseMappingKey(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, Map<Object,Object>)" title="Constructor in UrlCreatorCache.ReverseMappingKey">ReverseMappingKey(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, Map<Object,Object>)</a></span> - Constructor in <a href="org/grails/web/mapping/UrlCreatorCache. [...]
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html#rewrite()" title="Method in CompiledTagCallRewriter">rewrite()</a></span> - Method in <a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html">CompiledTagCallRewriter</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/commands/CliPublishingSupport.html#rewritePublishedCliCapabilityDependencies(org.gradle.api.Project)" title="Method in CliPublishingSupport">rewritePublishedCliCapabilityDependencies(org.gradle.api.Project)</a></span> - Method in <a href="org/grails/gradle/plugin/commands/CliPublishingSupport.html">CliPublishingSupport</a>
</dt><dd> <div class="block">Rewrites the generated Gradle Module Metadata of every publication in the project so a
dependency declared with a cli-companion capability request
(<CODE>module + requireCapability('<group>:<module>-cli')</CODE>) is published as a plain
dependency on the companion coordinate (<CODE><group>:<module>-cli</CODE>). </div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html#rewriteResolvedTagCalls(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)" title="Method in TagLibArtefactTypeAstTransformation">rewriteResolvedTagCalls(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)</a></span> - Method in <a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html">TagLibArtefactTypeAstTransformation</a>
+</dt><dd> <div class="block">Replaces calls to tags this build already knows about with direct invocations, leaving anything
+ it cannot resolve to be dispatched as before.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#rewritesUnqualifiedCalls()" title="Method in TagLibraryIndex">rewritesUnqualifiedCalls()</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Whether a call written without a namespace may be compiled into an invocation.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/mongo/extensions/MongoExtensions.html#rightShift(MongoCollection<Document>, Map<String, Object>)" title="Method in MongoExtensions">rightShift(MongoCollection<Document>, Map<String, Object>)</a></span> - Method in <a href="org/grails/datastore/gorm/mongo/extensions/MongoExtensions.html">MongoExtensions</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.html#rlike(java.lang.String, java.lang.Object)" title="Method in AbstractCriteriaBuilder">rlike(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.html">AbstractCriteriaBuilder</a>
@@ -50530,8 +50781,15 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd><div class="block">Common settings across all GORM implementations</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/core/connections/DefaultConnectionSource.html#settings" title="Field in DefaultConnectionSource">settings</a></span> - Field in <a href="org/grails/datastore/mapping/core/connections/DefaultConnectionSource.html">DefaultConnectionSource</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#SETTINGS_FILE" title="Property in TagLibraryIndexFiles">SETTINGS_FILE</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block">Where the settings for this compilation are written, the file part of
+ <CODE>TagLibraryIndex.SETTINGS_LOCATION</CODE>.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/bson/json/JsonWriter.html#settings" title="Field in JsonWriter">settings</a></span> - Field in <a href="org/grails/datastore/bson/json/JsonWriter.html">JsonWriter</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#SETTINGS_LOCATION" title="Field in TagLibraryIndex">SETTINGS_LOCATION</a></span> - Field in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block">Settings the build states for the compilation the index is read in, written alongside the
+ descriptors by the build and deliberately not packaged into the artifact: they describe how this
+ project is compiled, not what its tag libraries declare.</div></dd>
<dt><span class="strong"><a href="grails/plugin/geb/WebDriverContainerHolder.html#settings" title="Property in WebDriverContainerHolder">settings</a></span> - Property in <a href="grails/plugin/geb/WebDriverContainerHolder.html">WebDriverContainerHolder</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/boot/config/tools/SettingsFile.html" title="Class in grails.boot.config.tools">SettingsFile</a></span> - Class in <a href="./grails/boot/config/tools/package-summary.html">grails.boot.config.tools</a>
@@ -52463,6 +52721,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/test/io/MultiplexingOutputStream.html#streams" title="Property in MultiplexingOutputStream">streams</a></span> - Property in <a href="org/grails/test/io/MultiplexingOutputStream.html">MultiplexingOutputStream</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#STRICT_KEY" title="Property in TagLibraryIndexFiles">STRICT_KEY</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block">The keys the settings file is written with, matching <CODE>TagLibraryIndex</CODE>.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html#strictTags" title="Property in GrailsCompileStaticOptions">strictTags</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html">GrailsCompileStaticOptions</a>
+</dt><dd> <div class="block">Whether a tag no compiled tag library declares should fail compilation. </div></dd>
<dt><span class="strong"><a href="org/grails/web/servlet/FlashScopeExtension.html#string(grails.web.mvc.FlashScope, java.lang.String, java.lang.String)" title="Method in FlashScopeExtension">string(grails.web.mvc.FlashScope, java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/web/servlet/FlashScopeExtension.html">FlashScopeExtension</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/domainbinding/util/GrailsEnumType.html#STRING" title="Enum Constant in GrailsEnumType">STRING</a></span> - Enum Constant in <a href="org/grails/orm/hibernate/cfg/domainbinding/util/GrailsEnumType.html">GrailsEnumType</a>
@@ -52685,6 +52947,13 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/rest/Resource.html#superClass()" title="Method in Resource">superClass()</a></span> - Method in <a href="grails/rest/Resource.html">Resource</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The super class to use for the generated controller class</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/AstTagLibraryView.html#superclassView()" title="Method in AstTagLibraryView">superclassView()</a></span> - Method in <a href="org/grails/taglib/discovery/AstTagLibraryView.html">AstTagLibraryView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html#superclassView()" title="Method in ReflectedTagLibraryView">superclassView()</a></span> - Method in <a href="org/grails/taglib/discovery/ReflectedTagLibraryView.html">ReflectedTagLibraryView</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagLibraryView.html#superclassView()" title="Method in TagLibraryView">superclassView()</a></span> - Method in <a href="org/grails/taglib/discovery/TagLibraryView.html">TagLibraryView</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the superclass to continue the walk with, or <CODE>null</CODE> at the top of the hierarchy
+ or where the superclass cannot be read</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/util/SupplierUtil.html" title="Class in grails.util">SupplierUtil</a></span> - Class in <a href="./grails/util/package-summary.html">grails.util</a>
</dt><dd><div class="block">Helper methods for dealing with java.util.function.Supplier.</div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/web/access/intercept/ChannelFilterInvocationSecurityMetadataSourceFactoryBean.html#SUPPORTED" title="Field in ChannelFilterInvocationSecurityMetadataSourceFactoryBean">SUPPORTED</a></span> - Field in <a href="grails/plugin/springsecurity/web/access/intercept/ChannelFilterInvocationSecurityMetadataSourceFactoryBean.html">ChannelFilterInvocationSecurityMetadataSourceFactoryBean</a>
@@ -53325,6 +53594,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/tags/GroovySyntaxTag.html#tagContext" title="Field in GroovySyntaxTag">tagContext</a></span> - Field in <a href="org/grails/gsp/compiler/tags/GroovySyntaxTag.html">GroovySyntaxTag</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagDiscoveryRules.html" title="Class in org.grails.taglib.discovery">TagDiscoveryRules</a></span> - Class in <a href="./org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a>
+</dt><dd><div class="block">Decides whether a method is a tag.</div></dd>
<dt><span class="strong"><a href="grails/gsp/TagLib.html" title="Annotation Type in grails.gsp">TagLib</a></span> - Annotation Type in <a href="./grails/gsp/package-summary.html">grails.gsp</a>
</dt><dd><div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/encoder/OutputEncodingSettings.html#TAGLIB_CODEC_NAME" title="Field in OutputEncodingSettings">TAGLIB_CODEC_NAME</a></span> - Field in <a href="org/grails/taglib/encoder/OutputEncodingSettings.html">OutputEncodingSettings</a>
@@ -53354,6 +53625,18 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/artefact/TagLibrary.html" title="Trait in grails.artefact">TagLibrary</a></span> - Trait in <a href="./grails/artefact/package-summary.html">grails.artefact</a>
</dt><dd><div class="block">A trait that makes a class into a GSP tag library</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagLibraryAstDiscovery.html" title="Class in org.grails.taglib.discovery">TagLibraryAstDiscovery</a></span> - Class in <a href="./org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a>
+</dt><dd><div class="block">Reads a tag library's namespace and tag names from its syntax tree.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html" title="Class in org.grails.taglib.index">TagLibraryIndex</a></span> - Class in <a href="./org/grails/taglib/index/package-summary.html">org.grails.taglib.index</a>
+</dt><dd><div class="block">The set of tag libraries and tag names known at compile time.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndexEntry.html" title="Record in org.grails.taglib.index">TagLibraryIndexEntry</a></span> - Record in <a href="./org/grails/taglib/index/package-summary.html">org.grails.taglib.index</a>
+</dt><dd><div class="block">One tag recorded in the <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html' title='TagLibraryIndex'>TagLibraryIndex</a> at compile time.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html" title="Class in org.grails.gradle.plugin.views.gsp">TagLibraryIndexFiles</a></span> - Class in <a href="./org/grails/gradle/plugin/views/gsp/package-summary.html">org.grails.gradle.plugin.views.gsp</a>
+</dt><dd><div class="block">The files the tag library index is made of, as the build writes them.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndexGenerator.html" title="Class in org.grails.taglib.index">TagLibraryIndexGenerator</a></span> - Class in <a href="./org/grails/taglib/index/package-summary.html">org.grails.taglib.index</a>
+</dt><dd><div class="block">Writes the tag library index for a source set.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndexWriter.html" title="Class in org.grails.taglib.index">TagLibraryIndexWriter</a></span> - Class in <a href="./org/grails/taglib/index/package-summary.html">org.grails.taglib.index</a>
+</dt><dd><div class="block">Writes the compile-time descriptor for a single tag library.</div></dd>
<dt><span class="strong"><a href="grails/artefact/gsp/TagLibraryInvoker.html" title="Trait in grails.artefact.gsp">TagLibraryInvoker</a></span> - Trait in <a href="./grails/artefact/gsp/package-summary.html">grails.artefact.gsp</a>
</dt><dd><div class="block">A trait that adds the ability invoke tags to any class</div></dd>
<dt><span class="strong"><a href="org/grails/compiler/TagLibraryInvokerTypeCheckingExtension.html" title="Class in org.grails.compiler">TagLibraryInvokerTypeCheckingExtension</a></span> - Class in <a href="./org/grails/compiler/package-summary.html">org.grails.compiler</a>
@@ -53364,7 +53647,7 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryLookup.html" title="Class in org.grails.taglib">TagLibraryLookup</a></span> - Class in <a href="./org/grails/taglib/package-summary.html">org.grails.taglib</a>
</dt><dd><div class="block">Looks up tag library instances.</div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html" title="Class in org.grails.taglib">TagLibraryMetaUtils</a></span> - Class in <a href="./org/grails/taglib/package-summary.html">org.grails.taglib</a>
-</dt><dd><div class="block"></div></dd>
+</dt><dd><div class="block">Installs tags onto metaclasses.</div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryMetaUtils.html#TagLibraryMetaUtils()" title="Constructor in TagLibraryMetaUtils">TagLibraryMetaUtils()</a></span> - Constructor in <a href="org/grails/taglib/TagLibraryMetaUtils.html">TagLibraryMetaUtils</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/jsp/TagLibraryResolver.html" title="Interface in org.grails.gsp.jsp">TagLibraryResolver</a></span> - Interface in <a href="./org/grails/gsp/jsp/package-summary.html">org.grails.gsp.jsp</a>
@@ -53379,6 +53662,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/compiler/web/taglib/TagLibraryTransformer.html" title="Class in org.grails.compiler.web.taglib">TagLibraryTransformer</a></span> - Class in <a href="./org/grails/compiler/web/taglib/package-summary.html">org.grails.compiler.web.taglib</a>
</dt><dd><div class="block">Enhances tag library classes with the appropriate API at compile time.</div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagLibraryView.html" title="Interface in org.grails.taglib.discovery">TagLibraryView</a></span> - Interface in <a href="./org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a>
+</dt><dd><div class="block">A tag library as the rules need to read it, whether from a syntax tree or from a compiled class.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/gsp/taglib/aot/TagLibRuntimeHints.html" title="Class in org.apache.grails.gsp.taglib.aot">TagLibRuntimeHints</a></span> - Class in <a href="./org/apache/grails/gsp/taglib/aot/package-summary.html">org.apache.grails.gsp.taglib.aot</a>
</dt><dd><div class="block">Registers the tag libraries and page runtime a rendered page dispatches through.</div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageParser.html#TAGLIBS_DIRECTIVE" title="Field in GroovyPageParser">TAGLIBS_DIRECTIVE</a></span> - Field in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
@@ -53400,6 +53685,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd><div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagMethodInvoker.html" title="Class in org.grails.taglib">TagMethodInvoker</a></span> - Class in <a href="./org/grails/taglib/package-summary.html">org.grails.taglib</a>
</dt><dd><div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/discovery/TagMethodView.html" title="Interface in org.grails.taglib.discovery">TagMethodView</a></span> - Interface in <a href="./org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a>
+</dt><dd><div class="block">The properties of a method that decide whether it is a tag.</div></dd>
<dt><span class="strong"><a href="org/grails/testing/runtime/support/LazyTagLibraryLookup.html#tagNameKey(java.lang.String, java.lang.String)" title="Method in LazyTagLibraryLookup">tagNameKey(java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/testing/runtime/support/LazyTagLibraryLookup.html">LazyTagLibraryLookup</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/taglib/TagLibraryLookup.html#tagNamespaces" title="Field in TagLibraryLookup">tagNamespaces</a></span> - Field in <a href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
@@ -54921,6 +55208,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">{@inheritDoc}</div></dd>
<dt><span class="strong"><a href="org/grails/buffer/StreamCharBuffer.EncodedPart.html#toString()" title="Method in StreamCharBuffer.EncodedPart">toString()</a></span> - Method in <a href="org/grails/buffer/StreamCharBuffer.EncodedPart.html">StreamCharBuffer.EncodedPart</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#toString()" title="Method in TagLibraryIndex">toString()</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/json/parser/Token.html#toString()" title="Method in Token">toString()</a></span> - Method in <a href="org/grails/web/json/parser/Token.html">Token</a>
</dt><dd> <div class="block">Returns the image.</div></dd>
<dt><span class="strong"><a href="grails/util/Triple.html#toString()" title="Method in Triple">toString()</a></span> - Method in <a href="grails/util/Triple.html">Triple</a>
@@ -55107,6 +55396,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/views/compiler/BuilderTypeCheckingExtension.BuilderMethodReplacer.html#transform(org.codehaus.groovy.ast.expr.Expression)" title="Method in BuilderTypeCheckingExtension.BuilderMethodReplacer">transform(org.codehaus.groovy.ast.expr.Expression)</a></span> - Method in <a href="grails/views/compiler/BuilderTypeCheckingExtension.BuilderMethodReplacer.html">BuilderTypeCheckingExtension.BuilderMethodReplacer</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html#transform(org.codehaus.groovy.ast.expr.Expression)" title="Method in CompiledTagCallRewriter">transform(org.codehaus.groovy.ast.expr.Expression)</a></span> - Method in <a href="grails/gsp/taglib/compiler/CompiledTagCallRewriter.html">CompiledTagCallRewriter</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/services/transform/QueryStringTransformer.html#transform(org.codehaus.groovy.ast.expr.Expression)" title="Method in QueryStringTransformer">transform(org.codehaus.groovy.ast.expr.Expression)</a></span> - Method in <a href="org/grails/datastore/gorm/services/transform/QueryStringTransformer.html">QueryStringTransformer</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/servlet/mvc/ActionResultTransformer.html#transformActionResult(org.grails.web.servlet.mvc.GrailsWebRequest, java.lang.String, java.lang.Object)" title="Method in ActionResultTransformer">transformActionResult(org.grails.web.servlet.mvc.GrailsWebRequest, java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/web/servlet/mvc/ActionResultTransformer.html">ActionResultTransformer</a>
@@ -55522,6 +55813,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/acl/util/ProxyUtils.html#unproxy(Constructor<?>)" title="Method in ProxyUtils">unproxy(Constructor<?>)</a></span> - Method in <a href="grails/plugin/springsecurity/acl/util/ProxyUtils.html">ProxyUtils</a>
</dt><dd> <div class="block">Finds the constructor in the unproxied superclass if proxied.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#UNQUALIFIED_KEY" title="Property in TagLibraryIndexFiles">UNQUALIFIED_KEY</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html#unqualifiedTagCalls" title="Property in GrailsCompileStaticOptions">unqualifiedTagCalls</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html">GrailsCompileStaticOptions</a>
+</dt><dd> <div class="block">Whether a tag call written without its namespace may be compiled into a direct invocation.</div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/GrailsDomainBinder.html#unqualify(java.lang.String)" title="Method in GrailsDomainBinder">unqualify(java.lang.String)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/GrailsDomainBinder.html">GrailsDomainBinder</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/cfg/GrailsHibernateUtil.html#unqualify(java.lang.String)" title="Method in GrailsHibernateUtil">unqualify(java.lang.String)</a></span> - Method in <a href="org/grails/orm/hibernate/cfg/GrailsHibernateUtil.html">GrailsHibernateUtil</a>
@@ -57017,6 +57312,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/databinding/compiler/BindingFormatASTTransformation.html#visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)" title="Method in BindingFormatASTTransformation">visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)</a></span> - Method in <a href="org/grails/databinding/compiler/BindingFormatASTTransformation.html">BindingFormatASTTransformation</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/compiler/traits/CompiledTagCallTransformation.html#visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)" title="Method in CompiledTagCallTransformation">visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)</a></span> - Method in <a href="grails/compiler/traits/CompiledTagCallTransformation.html">CompiledTagCallTransformation</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/async/transform/DelegateAsyncTransformation.html#visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)" title="Method in DelegateAsyncTransformation">visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)</a></span> - Method in <a href="org/grails/datastore/gorm/async/transform/DelegateAsyncTransformation.html">DelegateAsyncTransformation</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/compiler/DependencyAutoConfigurationTransformation.html#visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)" title="Method in DependencyAutoConfigurationTransformation">visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)</a></span> - Method in <a href="org/grails/cli/compiler/DependencyAutoConfigurationTransformation.html">DependencyAutoConfigurationTransformation</a>
@@ -58101,6 +58398,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/io/support/SystemOutErrCapturer.NullOutputStream.html#write(byte[], int, int)" title="Method in SystemOutErrCapturer.NullOutputStream">write(byte[], int, int)</a></span> - Method in <a href="grails/io/support/SystemOutErrCapturer.NullOutputStream.html">SystemOutErrCapturer.NullOutputStream</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndexWriter.html#write(java.io.File, java.lang.String, java.lang.String, Collection<String>)" title="Method in TagLibraryIndexWriter">write(java.io.File, java.lang.String, java.lang.String, Collection<String>)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndexWriter.html">TagLibraryIndexWriter</a>
+</dt><dd> <div class="block">Writes the descriptor for a tag library into a compiler output directory.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/bson/codecs/temporal/TemporalBsonConverter.html#write(org.bson.BsonWriter, T)" title="Method in TemporalBsonConverter">write(org.bson.BsonWriter, T)</a></span> - Method in <a href="org/grails/datastore/bson/codecs/temporal/TemporalBsonConverter.html">TemporalBsonConverter</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/encoder/WriterEncodedAppender.html#write(org.grails.encoder.EncodingState, java.lang.String, int, int)" title="Method in WriterEncodedAppender">write(org.grails.encoder.EncodingState, java.lang.String, int, int)</a></span> - Method in <a href="org/grails/encoder/WriterEncodedAppender.html">WriterEncodedAppender</a>
@@ -58152,6 +58451,12 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageParser.html#writeHtmlParts(java.io.File)" title="Method in GroovyPageParser">writeHtmlParts(java.io.File)</a></span> - Method in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndexWriter.html#writeIncomplete(java.io.File, Collection<String>, boolean)" title="Method in TagLibraryIndexWriter">writeIncomplete(java.io.File, Collection<String>, boolean)</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndexWriter.html">TagLibraryIndexWriter</a>
+</dt><dd> <div class="block">Records what could not be described, so that a call to a tag of an incompletely described
+ namespace is never reported as a misspelling.</div></dd>
+<dt><span class="strong"><a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html#writeIndexEntry(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)" title="Method in TagLibArtefactTypeAstTransformation">writeIndexEntry(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)</a></span> - Method in <a href="grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html">TagLibArtefactTypeAstTransformation</a>
+</dt><dd> <div class="block">Records the namespace and tag names this tag library declares, so that a GSP compiled later can
+ resolve a tag call without loading the tag library or consulting its metaclass.</div></dd>
<dt><span class="strong"><a href="org/grails/gsp/GroovyPageWritable.html#writeInputStreamToResponse(java.io.InputStream, java.io.Writer)" title="Method in GroovyPageWritable">writeInputStreamToResponse(java.io.InputStream, java.io.Writer)</a></span> - Method in <a href="org/grails/gsp/GroovyPageWritable.html">GroovyPageWritable</a>
</dt><dd> <div class="block">Copy all of input to output.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/engine/types/AbstractMappingAwareCustomTypeMarshaller.html#writeInternal(org.grails.datastore.mapping.model.PersistentProperty, java.lang.String, T, N)" title="Method in AbstractMappingAwareCustomTypeMarshaller">writeInternal(org.grails.datastore.mapping.model.PersistentProperty, java.lang.String, T, N)</a></span> - Method in <a href="org/grails/datastore/mapping/engine/types/AbstractMappingAwareCustomTypeMarshaller.html">Abs [...]
@@ -58212,6 +58517,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Default constructor.</div></dd>
<dt><span class="strong"><a href="grails/views/WriterProvider.html" title="Interface in grails.views">WriterProvider</a></span> - Interface in <a href="./grails/views/package-summary.html">grails.views</a>
</dt><dd><div class="block">Interface for views that provider a writer</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#writeSettings(java.io.File, boolean, Set<String>, boolean, Set<String>)" title="Method in TagLibraryIndexFiles">writeSettings(java.io.File, boolean, Set<String>, boolean, Set<String>)</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
+</dt><dd> <div class="block">Records what the build asked for, so that the compiler reads it as an ordinary classpath
+ resource and Gradle sees it as an output of a task with declared inputs.</div></dd>
<dt><span class="strong"><a href="grails/rest/render/hal/HalJsonRenderer.html#writeSimpleObject(java.lang.Object, grails.rest.render.RenderContext, groovy.json.StreamingJsonBuilder.StreamingJsonDelegate)" title="Method in HalJsonRenderer">writeSimpleObject(java.lang.Object, grails.rest.render.RenderContext, groovy.json.StreamingJsonBuilder.StreamingJsonDelegate)</a></span> - Method in <a href="grails/rest/render/hal/HalJsonRenderer.html">HalJsonRenderer</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/rest/render/hal/HalJsonRenderer.html#writeSimpleObjectAndLink(java.lang.Object, grails.rest.render.RenderContext, groovy.json.StreamingJsonBuilder.StreamingJsonDelegate, grails.web.mime.MimeType)" title="Method in HalJsonRenderer">writeSimpleObjectAndLink(java.lang.Object, grails.rest.render.RenderContext, groovy.json.StreamingJsonBuilder.StreamingJsonDelegate, grails.web.mime.MimeType)</a></span> - Method in <a href="grails/rest/render/hal/HalJso [...]
diff --git a/docs/snapshot/api/org/apache/grails/common/compiler/GroovyTransformOrder.html b/docs/snapshot/api/org/apache/grails/common/compiler/GroovyTransformOrder.html
index dab3ba43359..23417e09fa5 100644
--- a/docs/snapshot/api/org/apache/grails/common/compiler/GroovyTransformOrder.html
+++ b/docs/snapshot/api/org/apache/grails/common/compiler/GroovyTransformOrder.html
@@ -177,207 +177,213 @@ interface GroovyTransformOrder</pre>
</tr>
<tr class="rowColor">
+ <td class="colFirst"><code><strong>static int</strong></code> </td>
+ <td class="colLast"><code><a href="#COMPILED_TAG_CALL_ORDER">COMPILED_TAG_CALL_ORDER</a></code></td>
+ <td class="colLast">Rewrites a call to a known tag into a direct invocation. </td>
+ </tr>
+
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#DATA_SERVICE_ORDER">DATA_SERVICE_ORDER</a></code></td>
<td class="colLast">Implements a Data Service</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#DECREMENT_PRIORITY">DECREMENT_PRIORITY</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#DELEGATE_ASYNC_ORDER">DELEGATE_ASYNC_ORDER</a></code></td>
<td class="colLast">Changes methods in a file to return a promise instead of a value</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#DIRTY_CHECK_ORDER">DIRTY_CHECK_ORDER</a></code></td>
<td class="colLast">Enables dirty tracking to occur at the domain class level instead of at the ORM level</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#ENHANCES_ORDER">ENHANCES_ORDER</a></code></td>
<td class="colLast">Transform that finds any `@Enhance` annotation on traits to automatically add this trait to that artefact type</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#ENTITY_ORDER">ENTITY_ORDER</a></code></td>
<td class="colLast">Adds basic fields like id, version, toString, and associations
Adds the DomainClassArtefactType</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#FINDER_ORDER">FINDER_ORDER</a></code></td>
<td class="colLast">Transforms groovy finders into DetachedCriteria</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#GLOBAL_GRAILS_TRANSFORM_ORDER">GLOBAL_GRAILS_TRANSFORM_ORDER</a></code></td>
<td class="colLast">Grails allows applying transforms by artefact type, this transformation is what implements that</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#GLOBAL_IMPORT_ORDER">GLOBAL_IMPORT_ORDER</a></code></td>
<td class="colLast">Adds global imports</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#GLOBAL_JPA_ORDER">GLOBAL_JPA_ORDER</a></code></td>
<td class="colLast">Transforms a JPA entity into a GORM entity</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#GORM_ASYNC_ORDER">GORM_ASYNC_ORDER</a></code></td>
<td class="colLast">Changes methods in a file to return a promise instead of a value</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#GORM_ENTITY_ORDER">GORM_ENTITY_ORDER</a></code></td>
<td class="colLast">Transforms a given class to a GORM Entity</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#GORM_TRANSFORMS_ORDER">GORM_TRANSFORMS_ORDER</a></code></td>
<td class="colLast">Several of the gorm related transforms iterate not at the priority level but on the node level, this class
performs those iterations</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#GSP_LINE_ORDER">GSP_LINE_ORDER</a></code></td>
<td class="colLast">Adds line numbers to GSPs</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#HIBERNATE5_ORDER">HIBERNATE5_ORDER</a></code></td>
<td class="colLast">getter/setter transforms for hibernate entities</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#HIGHEST_PRIORITY">HIGHEST_PRIORITY</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#HIGHEST_STARTING_PRIORITY">HIGHEST_STARTING_PRIORITY</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#INTEGRATION_ORDER">INTEGRATION_ORDER</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#JPA_GORM_ENTITY_ORDER">JPA_GORM_ENTITY_ORDER</a></code></td>
<td class="colLast">Makes all GormEntities be a JPA entity</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#LINK_ORDER">LINK_ORDER</a></code></td>
<td class="colLast">Allows adding link() support to any class</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#LOWEST_PRIORITY">LOWEST_PRIORITY</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#MIXIN_ORDER">MIXIN_ORDER</a></code></td>
<td class="colLast">Adds methods from one class onto another</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#PUBLISHER_ORDER">PUBLISHER_ORDER</a></code></td>
<td class="colLast">Implements Publisher</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#QUERY_SAFETY_ORDER">QUERY_SAFETY_ORDER</a></code></td>
<td class="colLast">Detects GORM query strings that were GString-interpolated but coerced to a plain String
before reaching a query method, losing GORM's automatic parameter binding</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#RESOURCE_ORDER">RESOURCE_ORDER</a></code></td>
<td class="colLast">Exposes a domain class as a restful resource</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#ROLLBACK_ORDER">ROLLBACK_ORDER</a></code></td>
<td class="colLast">Implements Rollback</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#RX_SCHEDULER_ORDER">RX_SCHEDULER_ORDER</a></code></td>
<td class="colLast">Transforms a method to non-block IO</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#SUBSCRIBER_ORDER">SUBSCRIBER_ORDER</a></code></td>
<td class="colLast">Implements AnnotatedSubscriber</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#TENANT_ORDER">TENANT_ORDER</a></code></td>
<td class="colLast">Implements WithoutTenant, WithTenant, and CurrentTenant transforms</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#TRANSACTIONAL_ORDER">TRANSACTIONAL_ORDER</a></code></td>
<td class="colLast">Implements the Transaction, and Readonly transforms</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#VIEWS_GSON_ORDER">VIEWS_GSON_ORDER</a></code></td>
<td class="colLast">Enhances gson view scripts with Trait behavior</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#VIEWS_MARKUP_ORDER">VIEWS_MARKUP_ORDER</a></code></td>
<td class="colLast">Enhances view scripts with Trait behavior</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#VIEWS_ORDER">VIEWS_ORDER</a></code></td>
<td class="colLast">Enhances view scripts with Trait behavior</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static int</strong></code> </td>
<td class="colLast"><code><a href="#WHERE_ORDER">WHERE_ORDER</a></code></td>
<td class="colLast">Transforms where queries into DetachedCriteria</td>
@@ -476,6 +482,16 @@ interface GroovyTransformOrder</pre>
</li>
</ul>
+ <a name="COMPILED_TAG_CALL_ORDER"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final int <strong>COMPILED_TAG_CALL_ORDER</strong></h4>
+ <p> Rewrites a call to a known tag into a direct invocation. Runs last, because whether a class can
+ call tags at all is only settled once the traits that let it have been applied, which is what
+ the artefact transforms above do.</p>
+ </li>
+ </ul>
+
<a name="DATA_SERVICE_ORDER"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/org/grails/compiler/TagLibraryInvokerTypeCheckingExtension.html b/docs/snapshot/api/org/grails/compiler/TagLibraryInvokerTypeCheckingExtension.html
index c19bcfe8df0..2190d81ecb7 100644
--- a/docs/snapshot/api/org/grails/compiler/TagLibraryInvokerTypeCheckingExtension.html
+++ b/docs/snapshot/api/org/grails/compiler/TagLibraryInvokerTypeCheckingExtension.html
@@ -141,6 +141,13 @@ extends org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport$Typ
without error. Type-safety for method calls on <em>declared</em> fields and
local variables is fully preserved.
+ <p>Calls to tags the tag library index knows never reach this extension at all: they are compiled
+ into direct invocations before type checking runs, so the type checker sees ordinary resolved method
+ calls. A misspelled tag is reported there instead, but only where the source says the call is a tag
+ - one naming its namespace. An unqualified call is left dynamic and unjudged, here and there, since
+ such a name may equally be a dynamic finder, an injected service method or anything else contributed
+ while the application runs.
+
<p><strong>Composition with other extensions:</strong> because this is a catch-all
handler for unresolved calls in controllers and tag libraries, it must run <em>after</em> any other
type-checking extension that resolves DSL-style calls (e.g. a criteria extension).
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html b/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html
index da9bef4293d..8a98649db18 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html
@@ -174,17 +174,33 @@ implements java.io.Serializable</pre>
</tr>
<tr class="altColor">
+ <td class="colFirst"><code><strong>SetProperty<java.lang.String></strong></code> </td>
+ <td class="colLast"><code><a href="#dynamicTagNamespaces">dynamicTagNamespaces</a></code><br>Namespaces whose tag libraries are registered while the application runs rather than described
+ when it is compiled. </td>
+ </tr>
+
+ <tr class="rowColor">
<td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
<td class="colLast"><code><a href="#services">services</a></code><br>Whether every service under <CODE>grails-app/services</CODE> should be compiled with
<CODE>@GrailsCompileStatic</CODE>. </td>
</tr>
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
+ <td class="colLast"><code><a href="#strictTags">strictTags</a></code><br>Whether a tag no compiled tag library declares should fail compilation. </td>
+ </tr>
+
<tr class="rowColor">
<td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
<td class="colLast"><code><a href="#tagLibs">tagLibs</a></code><br>Whether every tag library under <CODE>grails-app/taglib</CODE> should be compiled with
<CODE>@GrailsCompileStatic</CODE>. </td>
</tr>
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
+ <td class="colLast"><code><a href="#unqualifiedTagCalls">unqualifiedTagCalls</a></code><br>Whether a tag call written without its namespace may be compiled into a direct invocation.</td>
+ </tr>
+
</table>
</ul>
</li>
@@ -280,6 +296,16 @@ implements java.io.Serializable</pre>
</li>
</ul>
+ <a name="dynamicTagNamespaces"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>final SetProperty<java.lang.String> <strong>dynamicTagNamespaces</strong></h4>
+ <p> Namespaces whose tag libraries are registered while the application runs rather than described
+ when it is compiled. Tags in them are never reported as unknown, however complete the tag
+ library index is, and calls to them keep being dispatched dynamically. <DL><DT><B>Since:</B></DT><DD>8.0</DD></DL></p>
+ </li>
+ </ul>
+
<a name="services"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -289,6 +315,36 @@ implements java.io.Serializable</pre>
</li>
</ul>
+ <a name="strictTags"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>final Property<java.lang.Boolean> <strong>strictTags</strong></h4>
+ <p> Whether a tag no compiled tag library declares should fail compilation. Disabled by default,
+ where such a tag is left to resolve at runtime with nothing reported.
+
+ <p>Checked only where the source says a call is a tag: one naming its namespace, as
+ <CODE>g.message(code: 'x')</CODE> does, and one written as markup, as <CODE><g:message/></CODE> is. A call
+ written without a namespace is not checked, because such a name may equally be a method
+ contributed by any of the dynamic mechanisms an application has, and in a page it may be part of
+ the model the page was rendered with.
+
+ <p>Knowing that a namespace holds some compiled tag libraries is not the same as knowing it
+ holds all of them: a plugin built before tag library descriptors existed contributes tags
+ without one, and a tag library registered while an application runs contributes more. Enable
+ this once every tag library an application uses is described, and declare the namespaces that
+ are genuinely filled in at runtime through <a href='#getDynamicTagNamespaces()'>dynamicTagNamespaces</a>:
+
+ <pre>
+ grails {
+ compileStatic {
+ strictTags = true
+ dynamicTagNamespaces = ['legacy']
+ }
+ }
+ </pre> <DL><DT><B>Since:</B></DT><DD>8.0</DD></DL></p>
+ </li>
+ </ul>
+
<a name="tagLibs"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -298,6 +354,20 @@ implements java.io.Serializable</pre>
</li>
</ul>
+ <a name="unqualifiedTagCalls"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>final Property<java.lang.Boolean> <strong>unqualifiedTagCalls</strong></h4>
+ <p> Whether a tag call written without its namespace may be compiled into a direct invocation.
+
+ <p>Off by default. A namespaced call names the tag library it means; a bare name is a tag only
+ when nothing nearer answers to it, and what answers to it is not fully visible when compiling -
+ a method Groovy gives every object, a delegate an enclosing closure is handed, an overload the
+ tag library also declares. Turn this on to compile those calls too, in a project whose tag
+ names are known not to collide.</p>
+ </li>
+ </ul>
+
</li>
</ul>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html
new file mode 100644
index 00000000000..8b31f5679ff
--- /dev/null
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html
@@ -0,0 +1,527 @@
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- **************************************************************** -->
+<!-- * PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
+<!-- * i.e. only iterate & print data where possible. Thanks, Jez. * -->
+<!-- **************************************************************** -->
+
+<html>
+<head>
+ <!-- Generated by groovydoc (5.1.0) -->
+ <title>GenerateTagLibraryIndexTask (Grails 8.0.0-SNAPSHOT)</title>
+
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <link href="../../../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+
+<body class="center">
+<script type="text/javascript"><!--
+if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="GenerateTagLibraryIndexTask (Grails 8.0.0-SNAPSHOT)";
+}
+//-->
+</script>
+<noscript>
+ <div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+ <!-- -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask" target="_top">Frames</a></li>
+ <li><a href="GenerateTagLibraryIndexTask.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ </ul>
+ </div>
+ <a name="skip-navbar_top">
+ <!-- -->
+ </a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+
+ <div class="subTitle">Package: <strong>org.grails.gradle.plugin.views.gsp</strong></div>
+
+ <h2 title="[Groovy] Class GenerateTagLibraryIndexTask" class="title">[Groovy] Class GenerateTagLibraryIndexTask</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><ul class="inheritance"></ul></li><li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.views.gsp.GenerateTagLibraryIndexTask
+</ul>
+<div class="description">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+ <!-- todo: direct known subclasses -->
+ <hr>
+
+<pre>@org.gradle.api.tasks.CacheableTask
+@groovy.transform.CompileStatic
+abstract class GenerateTagLibraryIndexTask
+extends <a href='../../../../../../org.gradle.api.DefaultTask.html'>DefaultTask</a></pre>
+
+ <p> Writes the tag library index describing the tag libraries in this project.
+
+ <p>The index has to exist before anything that resolves tag calls is compiled, which is why this
+ runs ahead of compilation rather than being produced as a side effect of it. Generating it for the
+ whole source set at once is also what lets a renamed or deleted tag library disappear from it,
+ where an index accumulated class by class keeps describing tags that no longer exist.
+
+ <p>The work runs in a forked process against the project's own compile classpath, because the rules
+ that decide what a tag is belong to the framework being built rather than to the build tooling, and
+ must be the same rules the application applies when it starts. <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
+ </li>
+ </ul>
+</div>
+
+<div class="summary">
+ <ul class="blockList">
+ <li class="blockList">
+ <!-- =========== NESTED CLASS SUMMARY =========== -->
+
+
+ <!-- =========== ENUM CONSTANT SUMMARY =========== -->
+
+ <!-- =========== FIELD SUMMARY =========== -->
+
+
+ <!-- =========== PROPERTY SUMMARY =========== -->
+
+ <ul class="blockList">
+ <li class="blockList"><a name="property_summary"><!-- --></a>
+ <h3>Properties Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Properties Summary table, listing nested classes, and an explanation">
+ <caption><span>Properties</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Type</th>
+ <th class="colLast" scope="col">Name and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#GENERATOR_CLASS">GENERATOR_CLASS</a></code><br></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
+
+ <!-- =========== ELEMENT SUMMARY =========== -->
+
+
+
+ <!-- ======== CONSTRUCTOR SUMMARY ======== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="constructor_summary"><!-- --></a>
+ <h3>Constructor Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructors Summary table">
+ <caption><span>Constructors</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Constructor and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst">
+ <code><strong><a href="#GenerateTagLibraryIndexTask(org.gradle.process.ExecOperations)">GenerateTagLibraryIndexTask</a></strong>(<a href='../../../../../../org.gradle.process.ExecOperations.html'>ExecOperations</a> execOperations)</code><br></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+ </ul>
+
+
+
+ <!-- ========== METHOD SUMMARY =========== -->
+ <ul class="blockList">
+
+ <li class="blockList"><a name="method_summary"><!-- --></a>
+ <h3>Methods Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+ <caption><span>Methods</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Type Params</th>
+ <th class="colLast" scope="col">Return Type</th>
+ <th class="colLast" scope="col">Name and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>void</code></td>
+ <td class="colLast"><code><strong><a href="#generate()">generate</a></strong>()</code><br></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../../org.gradle.api.file.DirectoryProperty.html'>DirectoryProperty</a></code></td>
+ <td class="colLast"><code><strong><a href="#getDestinationDirectory()">getDestinationDirectory</a></strong>()</code><br>Where the index is written. </td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract SetProperty<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#getDynamicTagNamespaces()">getDynamicTagNamespaces</a></strong>()</code><br>Namespaces the build declares as filled in while the application runs. </td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a></code></td>
+ <td class="colLast"><code><strong><a href="#getGeneratorClasspath()">getGeneratorClasspath</a></strong>()</code><br>The classpath the generator runs against, which supplies the framework's discovery rules.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract Property<JavaLauncher></code></td>
+ <td class="colLast"><code><strong><a href="#getJavaLauncher()">getJavaLauncher</a></strong>()</code><br>The Java the index is generated with. </td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract Property<java.lang.Boolean></code></td>
+ <td class="colLast"><code><strong><a href="#getParameterNamesRetained()">getParameterNamesRetained</a></strong>()</code><br>Whether this compilation writes parameter names into class files. </td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a></code></td>
+ <td class="colLast"><code><strong><a href="#getResolutionSourceRoots()">getResolutionSourceRoots</a></strong>()</code><br>The source roots a type this project declares may be resolved from.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../../org.gradle.api.file.DirectoryProperty.html'>DirectoryProperty</a></code></td>
+ <td class="colLast"><code><strong><a href="#getSettingsDirectory()">getSettingsDirectory</a></strong>()</code><br>Where the settings this build declared are written.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a></code></td>
+ <td class="colLast"><code><strong><a href="#getSourceDirectories()">getSourceDirectories</a></strong>()</code><br>The directories holding tag library sources.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract Property<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#getSourceEncoding()">getSourceEncoding</a></strong>()</code><br>The source encoding, matching the one compilation uses.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract Property<java.lang.Boolean></code></td>
+ <td class="colLast"><code><strong><a href="#getStrictTags()">getStrictTags</a></strong>()</code><br>Whether a tag no compiled tag library declares fails compilation rather than being reported as a
+ warning. </td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract Property<java.lang.Boolean></code></td>
+ <td class="colLast"><code><strong><a href="#getUnqualifiedTagCalls()">getUnqualifiedTagCalls</a></strong>()</code><br>Whether a tag call written without its namespace may be compiled into a direct invocation.
+ </td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<div class="details">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+
+
+
+ <!-- =========== PROPERTY DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="prop_detail">
+ <!-- -->
+ </a>
+ <h3>Property Detail</h3>
+
+ <a name="GENERATOR_CLASS"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>static final java.lang.String <strong>GENERATOR_CLASS</strong></h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+
+
+
+
+ <!-- =========== CONSTRUCTOR DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="constructor_detail">
+ <!-- -->
+ </a>
+ <h3>Constructor Detail</h3>
+
+ <a name="GenerateTagLibraryIndexTask(org.gradle.process.ExecOperations)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@javax.inject.Inject<br><strong>GenerateTagLibraryIndexTask</strong>(<a href='../../../../../../org.gradle.process.ExecOperations.html'>ExecOperations</a> execOperations)</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+
+
+
+ <!-- =========== METHOD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="method_detail">
+ <!-- -->
+ </a>
+ <h3>Method Detail</h3>
+
+ <a name="generate()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.TaskAction<br>void <strong>generate</strong>()</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ <a name="getDestinationDirectory()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.OutputDirectory<br>abstract <a href='../../../../../../org.gradle.api.file.DirectoryProperty.html'>DirectoryProperty</a> <strong>getDestinationDirectory</strong>()</h4>
+ <p> Where the index is written. Placed on the compile classpath and packaged with the artifact.</p>
+ </li>
+ </ul>
+
+ <a name="getDynamicTagNamespaces()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Input<br>abstract SetProperty<java.lang.String> <strong>getDynamicTagNamespaces</strong>()</h4>
+ <p> Namespaces the build declares as filled in while the application runs. Tags in them are never
+ reported as unknown.</p>
+ </li>
+ </ul>
+
+ <a name="getGeneratorClasspath()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Classpath<br>abstract <a href='../../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a> <strong>getGeneratorClasspath</strong>()</h4>
+ <p> The classpath the generator runs against, which supplies the framework's discovery rules.</p>
+ </li>
+ </ul>
+
+ <a name="getJavaLauncher()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Nested<br>abstract Property<JavaLauncher> <strong>getJavaLauncher</strong>()</h4>
+ <p> The Java the index is generated with. It runs against the project's own compile classpath, so it
+ has to be the Java that classpath was built for rather than whichever one happens to be running
+ Gradle.</p>
+ </li>
+ </ul>
+
+ <a name="getParameterNamesRetained()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Input<br>abstract Property<java.lang.Boolean> <strong>getParameterNamesRetained</strong>()</h4>
+ <p> Whether this compilation writes parameter names into class files. It decides whether a tag's
+ attributes and body parameters have to carry those names to be dispatchable, so the index must
+ be generated under the same setting the sources are compiled with.</p>
+ </li>
+ </ul>
+
+ <a name="getResolutionSourceRoots()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.InputFiles<br>@org.gradle.api.tasks.IgnoreEmptyDirectories<br>@org.gradle.api.tasks.PathSensitive(value: PathSensitivity.RELATIVE)<br>abstract <a href='../../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a> <strong>getResolutionSourceRoots</strong>()</h4>
+ <p> The source roots a type this project declares may be resolved from.
+
+ <p>A tag library commonly refers to a service, base class or trait of the same project, none of
+ which exist as classes yet. Their source is compiled alongside it so that what they contribute -
+ a namespace, tags, a parameter type - is read rather than guessed.</p>
+ </li>
+ </ul>
+
+ <a name="getSettingsDirectory()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.OutputDirectory<br>@java.util.Optional<br>abstract <a href='../../../../../../org.gradle.api.file.DirectoryProperty.html'>DirectoryProperty</a> <strong>getSettingsDirectory</strong>()</h4>
+ <p> Where the settings this build declared are written.
+
+ <p>Kept apart from the descriptors because the two travel differently: the descriptors are
+ published, and the settings say how this project is compiled and must reach no one else. Sharing
+ a directory would put them wherever the descriptors go, including into an executable archive
+ built from the runtime classpath, where no exclusion on an archive task can reach them.
+
+ <p>Written beside the descriptors when unset, which suits a caller with nothing to publish.</p>
+ </li>
+ </ul>
+
+ <a name="getSourceDirectories()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.InputFiles<br>@org.gradle.api.tasks.IgnoreEmptyDirectories<br>@org.gradle.api.tasks.PathSensitive(value: PathSensitivity.RELATIVE)<br>abstract <a href='../../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a> <strong>getSourceDirectories</strong>()</h4>
+ <p> The directories holding tag library sources.
+
+ <p>Defaults to <CODE>grails-app/taglib</CODE>. A project keeping tag libraries elsewhere can add
+ those directories, which is what makes them resolvable in the same compilation that defines
+ them; without that they are still described as they compile, and so are resolvable to whatever
+ is compiled afterwards.</p>
+ </li>
+ </ul>
+
+ <a name="getSourceEncoding()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Input<br>@java.util.Optional<br>abstract Property<java.lang.String> <strong>getSourceEncoding</strong>()</h4>
+ <p> The source encoding, matching the one compilation uses.</p>
+ </li>
+ </ul>
+
+ <a name="getStrictTags()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Input<br>abstract Property<java.lang.Boolean> <strong>getStrictTags</strong>()</h4>
+ <p> Whether a tag no compiled tag library declares fails compilation rather than being reported as a
+ warning. Recorded alongside the index, where the compiler reads it.</p>
+ </li>
+ </ul>
+
+ <a name="getUnqualifiedTagCalls()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Input<br>abstract Property<java.lang.Boolean> <strong>getUnqualifiedTagCalls</strong>()</h4>
+ <p> Whether a tag call written without its namespace may be compiled into a direct invocation.
+ Recorded alongside the index, where the compiler reads it.</p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+ <!-- -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask" target="_top">Frames</a></li>
+ <li><a href="GenerateTagLibraryIndexTask.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ </ul>
+ </div>
+ <p><!-- Matomo -->
+<script>
+ var _paq = window._paq = window._paq || [];
+ /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
+ _paq.push(["setDoNotTrack", true]);
+ _paq.push(["disableCookies"]);
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ var u="https://analytics.apache.org/";
+ _paq.push(['setTrackerUrl', u+'matomo.php']);
+ _paq.push(['setSiteId', '79']);
+ var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+ g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+ })();
+</script>
+<!-- End Matomo Code --></p>
+ <a name="skip-navbar_bottom">
+ <!-- -->
+ </a>
+ </div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+</body>
+</html>
diff --git a/docs/snapshot/api/grails/artefact/TagLibrary.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html
similarity index 55%
copy from docs/snapshot/api/grails/artefact/TagLibrary.html
copy to docs/snapshot/api/org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html
index b90b98cdf71..71f61740318 100644
--- a/docs/snapshot/api/grails/artefact/TagLibrary.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>TagLibrary (Grails 8.0.0-SNAPSHOT)</title>
+ <title>TagLibraryIndexFiles (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
+ <link href="../../../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="TagLibrary (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="TagLibraryIndexFiles (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,30 +51,30 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../index-all.html">Index</a></li>
- <li><a href="../../help-doc.html">Help</a></li>
+ <li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../index.html?grails/artefact/TagLibrary" target="_top">Frames</a></li>
- <li><a href="TagLibrary.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndexFiles.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested Field <li><a href="#property_summary">Property</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#prop_detail">Property</a></li> <li><a href="#method_detail">Method</a></li>
+ Field <li><a href="#prop_detail">Property</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -85,34 +85,31 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>grails.artefact</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.gradle.plugin.views.gsp</strong></div>
- <h2 title="[Groovy] Trait TagLibrary" class="title">[Groovy] Trait TagLibrary</h2>
+ <h2 title="[Groovy] Class TagLibraryIndexFiles" class="title">[Groovy] Class TagLibraryIndexFiles</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>grails.artefact.TagLibrary
+<li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.views.gsp.TagLibraryIndexFiles
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
- <dl>
- <dt>All Implemented Interfaces and Traits:</dt>
- <dd><a href='../../grails/web/api/ServletAttributes.html'>ServletAttributes</a>, <a href='../../grails/artefact/gsp/TagLibraryInvoker.html'>TagLibraryInvoker</a>, <a href='../../grails/web/api/WebAttributes.html'>WebAttributes</a></dd>
- </dl>
-
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.transform.Trait
-@groovy.transform.CompileStatic
-trait TagLibrary
-extends java.lang.Object
-implements <a href='../../grails/web/api/ServletAttributes.html'>ServletAttributes</a>, <a href='../../grails/artefact/gsp/TagLibraryInvoker.html'>TagLibraryInvoker</a>, <a href='../../grails/web/api/WebAttributes.html'>WebAttributes</a></pre>
+<pre>@groovy.transform.CompileStatic
+final class TagLibraryIndexFiles
+extends java.lang.Object</pre>
+
+ <p> The files the tag library index is made of, as the build writes them.
- <p> A trait that makes a class into a GSP tag library <DL><DT><B>Since:</B></DT><DD>3.0</DD></DL><DL><DT><B>Authors:</B></DT><DD>Jeff Brown</DD><DD>Graeme Rocher</DD></DL></p>
+ <p>Written here rather than by the forked generator because they say what the build asked for
+ rather than what the sources declare, and because they have to be written even for a project with
+ no tag libraries of its own. <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -143,8 +140,34 @@ implements <a href='../../grails/web/api/ServletAttributes.html'>ServletAttribut
</tr>
<tr class="altColor">
- <td class="colFirst"><code><strong><a href='../../org/grails/buffer/GrailsPrintWriter.html'>GrailsPrintWriter</a></strong></code> </td>
- <td class="colLast"><code><a href="#out">out</a></code><br></td>
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#DYNAMIC_NAMESPACES_KEY">DYNAMIC_NAMESPACES_KEY</a></code><br></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#INDEX_LOCATION">INDEX_LOCATION</a></code><br>Directory holding one descriptor per compiled tag library.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#LOCAL_NAMESPACES_KEY">LOCAL_NAMESPACES_KEY</a></code><br></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#SETTINGS_FILE">SETTINGS_FILE</a></code><br>Where the settings for this compilation are written, the file part of
+ <CODE>TagLibraryIndex.SETTINGS_LOCATION</CODE>.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#STRICT_KEY">STRICT_KEY</a></code><br>The keys the settings file is written with, matching <CODE>TagLibraryIndex</CODE>.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#UNQUALIFIED_KEY">UNQUALIFIED_KEY</a></code><br></td>
</tr>
</table>
@@ -176,50 +199,22 @@ implements <a href='../../grails/web/api/ServletAttributes.html'>ServletAttribut
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code><a href='../../org/grails/buffer/GrailsPrintWriter.html'>GrailsPrintWriter</a></code></td>
- <td class="colLast"><code><strong><a href="#getOut()">getOut</a></strong>()</code><br>Obtains the currently output writer</td>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code><a href='../../org/grails/taglib/TemplateVariableBinding.html'>TemplateVariableBinding</a></code></td>
- <td class="colLast"><code><strong><a href="#getPageScope()">getPageScope</a></strong>()</code><br>Obtains the page scope instance</td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>java.lang.String</code></td>
- <td class="colLast"><code><strong><a href="#getTaglibNamespace()">getTaglibNamespace</a></strong>()</code><br></td>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>void</code></td>
- <td class="colLast"><code><strong><a href="#initializeTagLibrary()">initializeTagLibrary</a></strong>()</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#propertyMissing(java.lang.String)">propertyMissing</a></strong>(java.lang.String name)</code><br>Property missing implementation that looks up tag library namespaces or tags in the default namespace</td>
+ <td class="colLast"><code>static void</code></td>
+ <td class="colLast"><code><strong><a href="#clearIndex(java.io.File)">clearIndex</a></strong>(java.io.File destination)</code><br>Removes descriptors left by an earlier run, for a project that no longer declares any tag
+ library. </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#raw(java.lang.Object)">raw</a></strong>(java.lang.Object value)</code><br></td>
+ <td class="colLast"><code>static java.util.Set<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#readNamespaces(java.io.File)">readNamespaces</a></strong>(java.io.File destination)</code><br>Reads the namespaces of the descriptors beneath a directory.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>void</code></td>
- <td class="colLast"><code><strong><a href="#setOut(java.io.Writer)">setOut</a></strong>(java.io.Writer newOut)</code><br>Sets the current output writer</td>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>void</code></td>
- <td class="colLast"><code><strong><a href="#throwTagError(java.lang.String)">throwTagError</a></strong>(java.lang.String message)</code><br>Throws a GrailsTagException</td>
+ <td class="colLast"><code>static void</code></td>
+ <td class="colLast"><code><strong><a href="#writeSettings(java.io.File, boolean, Set, boolean, Set)">writeSettings</a></strong>(java.io.File destination, boolean strictTags, java.util.Set<java.lang.String> dynamicNamespaces, boolean unqualifiedTagCalls, java.util.Set<java.lang.String> localNamespaces)</code><br>Records what the build asked for, so that the compiler reads it as an ordinary classpath
+ resource and Gradle sees it as an output of a task with declared inputs.</td>
</tr>
</table>
@@ -265,92 +260,107 @@ implements <a href='../../grails/web/api/ServletAttributes.html'>ServletAttribut
</a>
<h3>Property Detail</h3>
- <a name="out"><!-- --></a>
+ <a name="DYNAMIC_NAMESPACES_KEY"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><a href='../../org/grails/buffer/GrailsPrintWriter.html'>GrailsPrintWriter</a> <strong>out</strong></h4>
+ <h4>static final java.lang.String <strong>DYNAMIC_NAMESPACES_KEY</strong></h4>
<p></p>
</li>
</ul>
- </li>
- </ul>
-
-
-
-
-
-
-
-
- <!-- =========== METHOD DETAIL =========== -->
- <ul class="blockList">
- <li class="blockList"><a name="method_detail">
- <!-- -->
- </a>
- <h3>Method Detail</h3>
-
- <a name="getOut()"><!-- --></a>
+ <a name="INDEX_LOCATION"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><a href='../../org/grails/buffer/GrailsPrintWriter.html'>GrailsPrintWriter</a> <strong>getOut</strong>()</h4>
- <p> Obtains the currently output writer <DL><DT><B>Returns:</B></DT><DD>The writer to use</DD></DL></p>
+ <h4>static final java.lang.String <strong>INDEX_LOCATION</strong></h4>
+ <p> Directory holding one descriptor per compiled tag library.
+
+ <p>These restate the format <CODE>org.grails.taglib.index.TagLibraryIndex</CODE> owns. They cannot
+ be shared with it: the generator is forked against the project's compile classpath precisely
+ because this plugin does not have the framework on its own, so the constants there are not
+ reachable from here. <CODE>TagLibraryIndexFilesSpec</CODE> asserts the two agree, so a rename on
+ either side fails a test rather than quietly producing an index nothing reads.
+
+ <p>Held without a trailing separator; <CODE>TagLibraryIndex.INDEX_LOCATION</CODE> carries one
+ because it resolves classpath resources by concatenation, where this resolves files.</p>
</li>
</ul>
- <a name="getPageScope()"><!-- --></a>
+ <a name="LOCAL_NAMESPACES_KEY"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><a href='../../org/grails/taglib/TemplateVariableBinding.html'>TemplateVariableBinding</a> <strong>getPageScope</strong>()</h4>
- <p> Obtains the page scope instance <DL><DT><B>Returns:</B></DT><DD>The page scope instance</DD></DL></p>
+ <h4>static final java.lang.String <strong>LOCAL_NAMESPACES_KEY</strong></h4>
+ <p></p>
</li>
</ul>
- <a name="getTaglibNamespace()"><!-- --></a>
+ <a name="SETTINGS_FILE"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>java.lang.String <strong>getTaglibNamespace</strong>()</h4>
- <p></p>
+ <h4>static final java.lang.String <strong>SETTINGS_FILE</strong></h4>
+ <p> Where the settings for this compilation are written, the file part of
+ <CODE>TagLibraryIndex.SETTINGS_LOCATION</CODE>.</p>
</li>
</ul>
- <a name="initializeTagLibrary()"><!-- --></a>
+ <a name="STRICT_KEY"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@jakarta.annotation.PostConstruct<br>void <strong>initializeTagLibrary</strong>()</h4>
- <p></p>
+ <h4>static final java.lang.String <strong>STRICT_KEY</strong></h4>
+ <p> The keys the settings file is written with, matching <CODE>TagLibraryIndex</CODE>.</p>
</li>
</ul>
- <a name="propertyMissing(java.lang.String)"><!-- --></a>
+ <a name="UNQUALIFIED_KEY"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>java.lang.Object <strong>propertyMissing</strong>(java.lang.String name)</h4>
- <p> Property missing implementation that looks up tag library namespaces or tags in the default namespace<DL><DT><B>throws:</B></DT><DD>MissingPropertyException When no tag namespace or tag is found</DD></DL> <DL><DT><B>Parameters:</B></DT><DD><code>name</code> - The property name</DD></DL><DL><DT><B>Returns:</B></DT><DD>A tag namespace or a tag in the default namespace</DD></DL></p>
+ <h4>static final java.lang.String <strong>UNQUALIFIED_KEY</strong></h4>
+ <p></p>
</li>
</ul>
- <a name="raw(java.lang.Object)"><!-- --></a>
+ </li>
+ </ul>
+
+
+
+
+
+
+
+
+ <!-- =========== METHOD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="method_detail">
+ <!-- -->
+ </a>
+ <h3>Method Detail</h3>
+
+ <a name="clearIndex(java.io.File)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>java.lang.Object <strong>raw</strong>(java.lang.Object value)</h4>
- <p></p>
+ <h4>static void <strong>clearIndex</strong>(java.io.File destination)</h4>
+ <p> Removes descriptors left by an earlier run, for a project that no longer declares any tag
+ library. Without it the index would keep describing tags that no longer exist. <DL><DT><B>Parameters:</B></DT><DD><code>destination</code> - the directory the index is written beneath</DD></DL></p>
</li>
</ul>
- <a name="setOut(java.io.Writer)"><!-- --></a>
+ <a name="readNamespaces(java.io.File)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>void <strong>setOut</strong>(java.io.Writer newOut)</h4>
- <p> Sets the current output writer <DL><DT><B>Parameters:</B></DT><DD><code>newOut</code> - The new output writer</DD></DL></p>
+ <h4>static java.util.Set<java.lang.String> <strong>readNamespaces</strong>(java.io.File destination)</h4>
+ <p> Reads the namespaces of the descriptors beneath a directory.
+
+ <p>Taken from what was generated rather than from the sources, so that a tag library the
+ generator could not read does not have its namespace counted as one this project describes. <DL><DT><B>Parameters:</B></DT><DD><code>destination</code> - the directory the index was written beneath</DD></DL><DL><DT><B>Returns:</B></DT><DD>the namespaces described there</DD></DL></p>
</li>
</ul>
- <a name="throwTagError(java.lang.String)"><!-- --></a>
+ <a name="writeSettings(java.io.File, boolean, Set, boolean, Set)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>void <strong>throwTagError</strong>(java.lang.String message)</h4>
- <p> Throws a GrailsTagException <DL><DT><B>Parameters:</B></DT><DD><code>message</code> - The error message</DD></DL></p>
+ <h4>static void <strong>writeSettings</strong>(java.io.File destination, boolean strictTags, java.util.Set<java.lang.String> dynamicNamespaces, boolean unqualifiedTagCalls, java.util.Set<java.lang.String> localNamespaces)</h4>
+ <p> Records what the build asked for, so that the compiler reads it as an ordinary classpath
+ resource and Gradle sees it as an output of a task with declared inputs. <DL><DT><B>Parameters:</B></DT><DD><code>destination</code> - the directory the index is written beneath</DD><DD><code>strictTags</code> - whether an unknown tag fails compilation</DD><DD><code>dynamicNamespaces</code> - namespaces filled in while the application runs</DD><DD><code>unqualifiedTagCalls</code> - whether a call written without a namespace may be compiled</DD><DD><code>localNamespaces</code> - the [...]
</li>
</ul>
@@ -369,30 +379,30 @@ implements <a href='../../grails/web/api/ServletAttributes.html'>ServletAttribut
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../index-all.html">Index</a></li>
- <li><a href="../../help-doc.html">Help</a></li>
+ <li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../index.html?grails/artefact/TagLibrary" target="_top">Frames</a></li>
- <li><a href="TagLibrary.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndexFiles.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested Field <li><a href="#property_summary">Property</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#prop_detail">Property</a></li> <li><a href="#method_detail">Method</a></li>
+ Field <li><a href="#prop_detail">Property</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html
index dae8178fa1f..ef82970ce73 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="GroovyPageForkCompileTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPageForkCompileTask</a></li><li><a href="GroovyPagePlugin.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPagePlugin</a></li>
+ <li><a href="GenerateTagLibraryIndexTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GenerateTagLibraryIndexTask</a></li><li><a href="GroovyPageForkCompileTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPageForkCompileTask</a></li><li><a href="GroovyPagePlugin.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPagePlugin</a></li><li><a href="TagLibraryIndexFiles.html" title [...]
</ul>
</div>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-summary.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-summary.html
index be18963cffa..8a722db8ec3 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-summary.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-summary.html
@@ -88,6 +88,14 @@ function windowTitle()
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="GenerateTagLibraryIndexTask.html" title="class in org/grails/gradle/plugin/views/gsp">
+ GenerateTagLibraryIndexTask
+ </a></strong>
+ </td>
+ <td>Writes the tag library index describing the tag libraries in this project.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="GroovyPageForkCompileTask.html" title="class in org/grails/gradle/plugin/views/gsp">
@@ -106,6 +114,14 @@ function windowTitle()
</td>
<td>A plugin that adds support for compiling Groovy Server Pages (GSP)</td>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="TagLibraryIndexFiles.html" title="class in org/grails/gradle/plugin/views/gsp">
+ TagLibraryIndexFiles
+ </a></strong>
+ </td>
+ <td>The files the tag library index is made of, as the build writes them.</td>
+ </tr>
</tbody>
</table>
diff --git a/docs/snapshot/api/org/grails/gsp/CompileStaticGroovyPage.html b/docs/snapshot/api/org/grails/gsp/CompileStaticGroovyPage.html
index 42b3d240a22..35764bbac15 100644
--- a/docs/snapshot/api/org/grails/gsp/CompileStaticGroovyPage.html
+++ b/docs/snapshot/api/org/grails/gsp/CompileStaticGroovyPage.html
@@ -251,7 +251,7 @@ extends <a href='../../../org/grails/gsp/GroovyPage.html'>GroovyPage</a></pre>
<tr class="altColor">
<td class="colFirst"><code>class <a href='../../../org/grails/gsp/GroovyPage.html'>GroovyPage</a></code></td>
- <td class="colLast"><code><a href='../../../org/grails/gsp/GroovyPage.html#changeItVariable(java.lang.Object)'>changeItVariable</a>, <a href='../../../org/grails/gsp/GroovyPage.html#cleanup()'>cleanup</a>, <a href='../../../org/grails/gsp/GroovyPage.html#createClosureForHtmlPart(int, int)'>createClosureForHtmlPart</a>, <a href='../../../org/grails/gsp/GroovyPage.html#createTagBody(int, Closure)'>createTagBody</a>, <a href='../../../org/grails/gsp/GroovyPage.ht [...]
+ <td class="colLast"><code><a href='../../../org/grails/gsp/GroovyPage.html#changeItVariable(java.lang.Object)'>changeItVariable</a>, <a href='../../../org/grails/gsp/GroovyPage.html#cleanup()'>cleanup</a>, <a href='../../../org/grails/gsp/GroovyPage.html#createClosureForHtmlPart(int, int)'>createClosureForHtmlPart</a>, <a href='../../../org/grails/gsp/GroovyPage.html#createTagBody(int, Closure)'>createTagBody</a>, <a href='../../../org/grails/gsp/GroovyPage.ht [...]
</tr>
</table>
</ul>
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPage.html b/docs/snapshot/api/org/grails/gsp/GroovyPage.html
index a0f588cf87d..9be2d38c04f 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPage.html
+++ b/docs/snapshot/api/org/grails/gsp/GroovyPage.html
@@ -374,59 +374,71 @@ extends groovy.lang.Script</pre>
</tr>
<tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a></code></td>
+ <td class="colLast"><code><strong><a href="#getTagLibraryLookup()">getTagLibraryLookup</a></strong>()</code><br>The tag libraries this page can reach.</td>
+ </tr>
+
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public final void</code></td>
<td class="colLast"><code><strong><a href="#h(int)">h</a></strong>(int partNumber)</code><br>Shorthand for printHtmlPart to reduce class size</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected void</code></td>
<td class="colLast"><code><strong><a href="#init()">init</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a href="#initCommonRun(org.grails.gsp.GroovyPageMetaInfo)">initCommonRun</a></strong>(<a href='../../../org/grails/gsp/GroovyPageMetaInfo.html'>GroovyPageMetaInfo</a> metaInfo)</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a href="#initRun(java.io.Writer, org.grails.taglib.encoder.OutputContext, org.grails.gsp.GroovyPageMetaInfo)">initRun</a></strong>(java.io.Writer target, <a href='../../../org/grails/taglib/encoder/OutputContext.html'>OutputContext</a> outputContext, <a href='../../../org/grails/gsp/GroovyPageMetaInfo.html'>GroovyPageMetaInfo</a> metaInfo)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public final void</code></td>
<td class="colLast"><code><strong><a href="#invokeTag(java.lang.String, java.lang.String, int, java.util.Map, int)">invokeTag</a></strong>(java.lang.String tagName, java.lang.String tagNamespace, int lineNumber, java.util.Map attrs, int bodyClosureIndex)</code><br>Attempts to invokes a dynamic tag</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected boolean</code></td>
<td class="colLast"><code><strong><a href="#isHtmlPart(java.lang.String)">isHtmlPart</a></strong>(java.lang.String htmlPart)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public static final boolean</code></td>
<td class="colLast"><code><strong><a href="#isReservedName(java.lang.String)">isReservedName</a></strong>(java.lang.String name)</code><br>Return whether the given name cannot be used within the binding of a GSP</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected <a href='../../../org/grails/gsp/jsp/JspTagLib.html'>JspTagLib</a></code></td>
<td class="colLast"><code><strong><a href="#lookupJspTagLib(java.lang.String)">lookupJspTagLib</a></strong>(java.lang.String jspTagLibName)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected java.lang.Object</code></td>
<td class="colLast"><code><strong><a href="#lookupTagDispatcher(java.lang.String)">lookupTagDispatcher</a></strong>(java.lang.String namespace)</code><br></td>
</tr>
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public java.lang.Object</code></td>
+ <td class="colLast"><code><strong><a href="#methodMissing(java.lang.String, java.lang.Object)">methodMissing</a></strong>(java.lang.String name, java.lang.Object args)</code><br>Resolves a tag called without a namespace, as <CODE>${message(code: 'x')</CODE>} is.</td>
+ </tr>
+
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public final void</code></td>
@@ -820,6 +832,18 @@ extends groovy.lang.Script</pre>
</li>
</ul>
+ <a name="getTagLibraryLookup()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> <strong>getTagLibraryLookup</strong>()</h4>
+ <p> The tag libraries this page can reach.
+
+ <p>Named as the tag library invoker trait names it, so that a tag call compiled into a direct
+ invocation reads the same whether it was written in a page, a tag library or a controller.
+ <DL><DT><B>Returns:</B></DT><DD>the lookup, or <CODE>null</CODE> before the page has been initialised</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+ </li>
+ </ul>
+
<a name="h(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -895,6 +919,20 @@ extends groovy.lang.Script</pre>
</li>
</ul>
+ <a name="methodMissing(java.lang.String, java.lang.Object)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.lang.Object <strong>methodMissing</strong>(java.lang.String name, java.lang.Object args)</h4>
+ <p> Resolves a tag called without a namespace, as <CODE>${message(code: 'x')</CODE>} is.
+
+ <p>A real method rather than one installed onto this page's metaclass. Installing it, along with
+ a method for every tag and a property for every namespace, meant writing to an
+ ExpandoMetaClass for every page compiled and made every later tag call a read of an initialised
+ metaclass, which is guarded by a lock.<DL><DT><B>throws:</B></DT><DD>MissingMethodException when there is no tag library lookup to resolve the name against</DD></DL>
+ <DL><DT><B>Parameters:</B></DT><DD><code>name</code> - the tag name</DD><DD><code>args</code> - the arguments the tag was called with</DD></DL><DL><DT><B>Returns:</B></DT><DD>whatever the tag produces</DD></DL></p>
+ </li>
+ </ul>
+
<a name="printHtmlPart(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html b/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
index e41bcd7ea46..86090a33f07 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
+++ b/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
@@ -173,7 +173,7 @@ extends java.lang.Object</pre>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br>Nothing is installed onto a page's metaclass any more.</td>
</tr>
</table>
@@ -255,8 +255,12 @@ extends java.lang.Object</pre>
<a name="registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
- <p></p>
+ <h4>@java.lang.Deprecated<br>static void <strong>registerMethodMissingForGSP</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <p> Nothing is installed onto a page's metaclass any more.
+
+ <p>A page used to be given methodMissing, a method for each tag and a property for each
+ namespace as it was compiled. GroovyPage declares methodMissing itself and resolves a namespace
+ through getProperty, so the tags reachable from a page are the same without any of those writes.<DL><DT><B>deprecated:</B></DT><DD>Pages resolve tags without their metaclass being written to.</DD></DL> <DL><DT><B>Parameters:</B></DT><DD><code>emc</code> - the page's metaclass, no longer modified</DD><DD><code>gspTagLibraryLookup</code> - the tag libraries, resolved through at dispatch instead</DD></DL></p>
</li>
</ul>
diff --git a/docs/snapshot/api/org/grails/gsp/ModelRecordingGroovyPage.html b/docs/snapshot/api/org/grails/gsp/ModelRecordingGroovyPage.html
index 5460a1bd821..80bff5f21c6 100644
--- a/docs/snapshot/api/org/grails/gsp/ModelRecordingGroovyPage.html
+++ b/docs/snapshot/api/org/grails/gsp/ModelRecordingGroovyPage.html
@@ -259,7 +259,7 @@ extends <a href='../../../org/grails/gsp/GroovyPage.html'>GroovyPage</a></pre>
<tr class="altColor">
<td class="colFirst"><code>class <a href='../../../org/grails/gsp/GroovyPage.html'>GroovyPage</a></code></td>
- <td class="colLast"><code><a href='../../../org/grails/gsp/GroovyPage.html#changeItVariable(java.lang.Object)'>changeItVariable</a>, <a href='../../../org/grails/gsp/GroovyPage.html#cleanup()'>cleanup</a>, <a href='../../../org/grails/gsp/GroovyPage.html#createClosureForHtmlPart(int, int)'>createClosureForHtmlPart</a>, <a href='../../../org/grails/gsp/GroovyPage.html#createTagBody(int, Closure)'>createTagBody</a>, <a href='../../../org/grails/gsp/GroovyPage.ht [...]
+ <td class="colLast"><code><a href='../../../org/grails/gsp/GroovyPage.html#changeItVariable(java.lang.Object)'>changeItVariable</a>, <a href='../../../org/grails/gsp/GroovyPage.html#cleanup()'>cleanup</a>, <a href='../../../org/grails/gsp/GroovyPage.html#createClosureForHtmlPart(int, int)'>createClosureForHtmlPart</a>, <a href='../../../org/grails/gsp/GroovyPage.html#createTagBody(int, Closure)'>createTagBody</a>, <a href='../../../org/grails/gsp/GroovyPage.ht [...]
</tr>
</table>
</ul>
diff --git a/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html b/docs/snapshot/api/org/grails/taglib/CompiledTagInvocation.html
similarity index 57%
copy from docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
copy to docs/snapshot/api/org/grails/taglib/CompiledTagInvocation.html
index 64351f4eb29..3d973c0840e 100644
--- a/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
+++ b/docs/snapshot/api/org/grails/taglib/CompiledTagInvocation.html
@@ -27,7 +27,7 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>TagMethodInvoker (Grails 8.0.0-SNAPSHOT)</title>
+ <title>CompiledTagInvocation (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
@@ -37,7 +37,7 @@
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="TagMethodInvoker (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="CompiledTagInvocation (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -63,8 +63,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagMethodInvoker" target="_top">Frames</a></li>
- <li><a href="TagMethodInvoker.html" target="_top">No Frames</a></li>
+ <li><a href="../../../index.html?org/grails/taglib/CompiledTagInvocation" target="_top">Frames</a></li>
+ <li><a href="CompiledTagInvocation.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -87,11 +87,11 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subTitle">Package: <strong>org.grails.taglib</strong></div>
- <h2 title="[Java] Class TagMethodInvoker" class="title">[Java] Class TagMethodInvoker</h2>
+ <h2 title="[Java] Class CompiledTagInvocation" class="title">[Java] Class CompiledTagInvocation</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.taglib.TagMethodInvoker
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.CompiledTagInvocation
</ul>
<div class="description">
<ul class="blockList">
@@ -101,9 +101,21 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- todo: direct known subclasses -->
<hr>
-<pre>public final class TagMethodInvoker
+<pre>public final class CompiledTagInvocation
extends java.lang.Object</pre>
+ <p> Invokes a tag whose namespace and name are known without going through Groovy's method dispatch.
+
+ <p>Calling a tag as <CODE>g.message(code: 'x')</CODE> reaches the tag library through <CODE>invokeMethod</CODE>, which means a dynamic call site in the caller's bytecode even when that caller is
+ statically compiled. The tag being called is fixed in the source, so once it has been resolved
+ against the tag library index there is nothing left to decide at runtime beyond which bean holds it.
+
+ <p>This is the entry point such a call is expressed as: an ordinary method call taking the
+ namespace and name as arguments. It applies the same attribute and body handling, output capture,
+ encoding and return-object behaviour as the dynamic path, because both end at
+ <a href='../../../org/grails/taglib/TagOutput.html#captureTagOutput' title='TagOutput.captureTagOutput'>TagOutput.captureTagOutput</a>.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
</li>
</ul>
</div>
@@ -142,46 +154,28 @@ extends java.lang.Object</pre>
<th class="colLast" scope="col">Name and description</th>
</tr>
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.util.Map<java.lang.String, java.lang.reflect.Field></code></td>
- <td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class<?> type)</code><br></td>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.util.Map<java.lang.String, java.util.List<java.lang.reflect.Method>></code></td>
- <td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class<?> type)</code><br></td>
- </tr>
-
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)">getClosureTagProperty</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</code><br></td>
+ <td class="colLast"><code><strong><a href="#invoke(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, Map, java.lang.Object)">invoke</a></strong>(<a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, java.lang.String tagName, java.util.Map<?, ?> attrs, java.lang.Object body)</code><br>Invokes a tag with attributes and a body.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static java.util.Collection<java.lang.String></code></td>
- <td class="colLast"><code><strong><a href="#getInvokableTagMethodNames(Class)">getInvokableTagMethodNames</a></strong>(java.lang.Class<?> tagLibClass)</code><br></td>
+ <td class="colLast"><code>public static java.lang.Object</code></td>
+ <td class="colLast"><code><strong><a href="#invoke(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, Map, java.lang.Object, org.grails.taglib.encoder.OutputContext)">invoke</a></strong>(<a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, java.lang.String tagName, java.util.Map<?, ?> attrs, java.lang.Object body, <a href='../../../org/grails/taglib/encoder/OutputContext. [...]
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static boolean</code></td>
- <td class="colLast"><code><strong><a href="#hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)">hasInvokableTagMethod</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</code><br></td>
+ <td class="colLast"><code>public static java.lang.Object</code></td>
+ <td class="colLast"><code><strong><a href="#invokeArguments(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object)">invokeArguments</a></strong>(<a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, java.lang.String tagName, java.lang.Object args)</code><br>Invokes a tag with whatever arguments the call was written with.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map, Closure)">invokeTagMethod</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName, java.util.Map<?, ?> attrs, groovy.lang.Closure<?> body)</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static boolean</code></td>
- <td class="colLast"><code><strong><a href="#isTagMethodCandidate(java.lang.reflect.Method)">isTagMethodCandidate</a></strong>(java.lang.reflect.Method method)</code><br></td>
+ <td class="colLast"><code><strong><a href="#invokeArgumentsInContext(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, org.grails.taglib.encoder.OutputContext, java.lang.Object)">invokeArgumentsInContext</a></strong>(<a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, java.lang.String tagName, <a href='../../../org/grails/taglib/encoder/OutputContext.html'>OutputContext</a> o [...]
</tr>
</table>
@@ -234,59 +228,44 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="computeValue(Class)"><!-- --></a>
+ <a name="invoke(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, Map, java.lang.Object)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>protected java.util.Map<java.lang.String, java.lang.reflect.Field> <strong>computeValue</strong>(java.lang.Class<?> type)</h4>
- <p></p>
+ <h4>public static java.lang.Object <strong>invoke</strong>(<a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, java.lang.String tagName, java.util.Map<?, ?> attrs, java.lang.Object body)</h4>
+ <p> Invokes a tag with attributes and a body.
+ <DL><DT><B>Parameters:</B></DT><DD><code>lookup</code> - the tag libraries available to the caller</DD><DD><code>namespace</code> - the tag library namespace</DD><DD><code>tagName</code> - the tag name within that namespace</DD><DD><code>attrs</code> - the tag attributes, treated as empty when <CODE>null</CODE></DD><DD><code>body</code> - the tag body as a closure or as text, or <CODE>null</CODE> when there is none</DD></DL><DL><DT><B>Returns:</B></DT><DD>whatever the tag prod [...]
</li>
</ul>
- <a name="computeValue(Class)"><!-- --></a>
+ <a name="invoke(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, Map, java.lang.Object, org.grails.taglib.encoder.OutputContext)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>protected java.util.Map<java.lang.String, java.util.List<java.lang.reflect.Method>> <strong>computeValue</strong>(java.lang.Class<?> type)</h4>
- <p></p>
+ <h4>public static java.lang.Object <strong>invoke</strong>(<a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, java.lang.String tagName, java.util.Map<?, ?> attrs, java.lang.Object body, <a href='../../../org/grails/taglib/encoder/OutputContext.html'>OutputContext</a> outputContext)</h4>
+ <p> Invokes a tag against a known output context, for a caller that already has one to hand.
+ <DL><DT><B>Parameters:</B></DT><DD><code>lookup</code> - the tag libraries available to the caller</DD><DD><code>namespace</code> - the tag library namespace</DD><DD><code>tagName</code> - the tag name within that namespace</DD><DD><code>attrs</code> - the tag attributes, treated as empty when <CODE>null</CODE></DD><DD><code>body</code> - the tag body as a closure or as text, or <CODE>null</CODE> when there is none</DD><DD><code>outputContext</code> - where the tag writes</DD [...]
</li>
</ul>
- <a name="getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)"><!-- --></a>
+ <a name="invokeArguments(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public static java.lang.Object <strong>getClosureTagProperty</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="getInvokableTagMethodNames(Class)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public static java.util.Collection<java.lang.String> <strong>getInvokableTagMethodNames</strong>(java.lang.Class<?> tagLibClass)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public static boolean <strong>hasInvokableTagMethod</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map, Closure)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public static java.lang.Object <strong>invokeTagMethod</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName, java.util.Map<?, ?> attrs, groovy.lang.Closure<?> body)</h4>
- <p></p>
+ <h4>public static java.lang.Object <strong>invokeArguments</strong>(<a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, java.lang.String tagName, java.lang.Object args)</h4>
+ <p> Invokes a tag with whatever arguments the call was written with.
+
+ <p>A tag call is written in more shapes than attributes and a body: with nothing, with a body
+ alone, or with a single value that the tag reads under its own name. Where the shape is not
+ evident in the source - a map held in a variable, say - the arguments are only known once they
+ have been evaluated, which is what this takes.
+ <DL><DT><B>Parameters:</B></DT><DD><code>lookup</code> - the tag libraries available to the caller</DD><DD><code>namespace</code> - the tag library namespace</DD><DD><code>tagName</code> - the tag name within that namespace</DD><DD><code>args</code> - the evaluated arguments, in the order they were written</DD></DL><DL><DT><B>Returns:</B></DT><DD>whatever the tag produces</DD></DL></p>
</li>
</ul>
- <a name="isTagMethodCandidate(java.lang.reflect.Method)"><!-- --></a>
+ <a name="invokeArgumentsInContext(org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, org.grails.taglib.encoder.OutputContext, java.lang.Object)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public static boolean <strong>isTagMethodCandidate</strong>(java.lang.reflect.Method method)</h4>
- <p></p>
+ <h4>public static java.lang.Object <strong>invokeArgumentsInContext</strong>(<a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, java.lang.String tagName, <a href='../../../org/grails/taglib/encoder/OutputContext.html'>OutputContext</a> outputContext, java.lang.Object args)</h4>
+ <p> Invokes a tag with whatever arguments the call was written with, against a known output context.
+ <DL><DT><B>Parameters:</B></DT><DD><code>lookup</code> - the tag libraries available to the caller</DD><DD><code>namespace</code> - the tag library namespace</DD><DD><code>tagName</code> - the tag name within that namespace</DD><DD><code>outputContext</code> - where the tag writes</DD><DD><code>args</code> - the evaluated arguments, in the order they were written</DD></DL><DL><DT><B>Returns:</B></DT><DD>whatever the tag produces</DD></DL></p>
</li>
</ul>
@@ -317,8 +296,8 @@ extends java.lang.Object</pre>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagMethodInvoker" target="_top">Frames</a></li>
- <li><a href="TagMethodInvoker.html" target="_top">No Frames</a></li>
+ <li><a href="../../../index.html?org/grails/taglib/CompiledTagInvocation" target="_top">Frames</a></li>
+ <li><a href="CompiledTagInvocation.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/org/grails/taglib/NamespacedTagDispatcher.html b/docs/snapshot/api/org/grails/taglib/NamespacedTagDispatcher.html
index d78db21d76f..91b7f6f477e 100644
--- a/docs/snapshot/api/org/grails/taglib/NamespacedTagDispatcher.html
+++ b/docs/snapshot/api/org/grails/taglib/NamespacedTagDispatcher.html
@@ -141,24 +141,18 @@ extends groovy.lang.GroovyObjectSupport</pre>
</tr>
<tr class="rowColor">
- <td class="colFirst"><code><strong>protected boolean</strong></code> </td>
- <td class="colLast"><code><a href="#developmentMode">developmentMode</a></code></td>
- <td class="colLast"></td>
- </tr>
-
- <tr class="altColor">
<td class="colFirst"><code><strong>protected <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a></strong></code> </td>
<td class="colLast"><code><a href="#lookup">lookup</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>protected java.lang.String</strong></code> </td>
<td class="colLast"><code><a href="#namespace">namespace</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>protected java.lang.Class</strong></code> </td>
<td class="colLast"><code><a href="#type">type</a></code></td>
<td class="colLast"></td>
@@ -216,21 +210,10 @@ extends groovy.lang.GroovyObjectSupport</pre>
</tr>
<tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>void</code></td>
- <td class="colLast"><code><strong><a href="#initializeMetaClass()">initializeMetaClass</a></strong>()</code><br></td>
- </tr>
-
- <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#methodMissing(java.lang.String, java.lang.Object)">methodMissing</a></strong>(java.lang.String name, java.lang.Object args)</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected void</code></td>
- <td class="colLast"><code><strong><a href="#registerTagMetaMethods(groovy.lang.ExpandoMetaClass)">registerTagMetaMethods</a></strong>(groovy.lang.ExpandoMetaClass emc)</code><br></td>
+ <td class="colLast"><code><strong><a href="#methodMissing(java.lang.String, java.lang.Object)">methodMissing</a></strong>(java.lang.String name, java.lang.Object args)</code><br>Every dispatcher used to be given its own ExpandoMetaClass carrying a method for each tag in the
+ namespace, built and populated as the dispatcher was constructed. </td>
</tr>
</table>
@@ -282,14 +265,6 @@ extends groovy.lang.GroovyObjectSupport</pre>
</li>
</ul>
- <a name="developmentMode"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>protected boolean <strong>developmentMode</strong></h4>
- <p></p>
- </li>
- </ul>
-
<a name="lookup"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -351,27 +326,13 @@ extends groovy.lang.GroovyObjectSupport</pre>
</a>
<h3>Method Detail</h3>
- <a name="initializeMetaClass()"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>void <strong>initializeMetaClass</strong>()</h4>
- <p></p>
- </li>
- </ul>
-
<a name="methodMissing(java.lang.String, java.lang.Object)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
<h4>java.lang.Object <strong>methodMissing</strong>(java.lang.String name, java.lang.Object args)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="registerTagMetaMethods(groovy.lang.ExpandoMetaClass)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>protected void <strong>registerTagMetaMethods</strong>(groovy.lang.ExpandoMetaClass emc)</h4>
- <p></p>
+ <p> Every dispatcher used to be given its own ExpandoMetaClass carrying a method for each tag in the
+ namespace, built and populated as the dispatcher was constructed. Tags are dispatched through
+ the lookup instead, so no metaclass is created or written to here.</p>
</li>
</ul>
diff --git a/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html b/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
index 43584df903c..b04c9a4b3bb 100644
--- a/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
+++ b/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
@@ -104,6 +104,18 @@ if (location.href.indexOf('is-external=true') == -1) {
<pre>class TagLibraryMetaUtils
extends java.lang.Object</pre>
+ <p> Installs tags onto metaclasses.
+
+ <p>Tags are resolved through <a href='../../../org/grails/taglib/TagLibraryLookup.html' title='TagLibraryLookup'>TagLibraryLookup</a> and invoked through
+ <a href='../../../org/grails/taglib/CompiledTagInvocation.html' title='CompiledTagInvocation'>CompiledTagInvocation</a>, so nothing needs installing onto a metaclass to call a tag. What
+ remains here is the dynamic dispatch that a tag library registered at runtime still relies on,
+ reachable through <CODE>methodMissingForTagLib</CODE> with metaclass installation switched off.
+
+ <p>The methods that install onto a metaclass are deprecated individually. This class is not,
+ because <a href='#methodMissingForTagLib'>methodMissingForTagLib</a> is how a call into a namespace no compiled tag library
+ describes is still dispatched, and is used by the tag library invoker trait, the namespace
+ dispatcher and a compiled page alike.</p>
+
</li>
</ul>
</div>
@@ -306,7 +318,7 @@ extends java.lang.Object</pre>
<a name="addTagLibMethodToMetaClass(groovy.lang.GroovyObject, groovy.lang.MetaMethod, groovy.lang.MetaClass)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static java.lang.Object <strong>addTagLibMethodToMetaClass</strong>(groovy.lang.GroovyObject tagBean, groovy.lang.MetaMethod method, groovy.lang.MetaClass mc)</h4>
+ <h4>@java.lang.Deprecated(since: 8.0.0)<br>static java.lang.Object <strong>addTagLibMethodToMetaClass</strong>(groovy.lang.GroovyObject tagBean, groovy.lang.MetaMethod method, groovy.lang.MetaClass mc)</h4>
<p></p>
</li>
</ul>
@@ -322,7 +334,7 @@ extends java.lang.Object</pre>
<a name="enhanceTagLibMetaClass(grails.core.gsp.GrailsTagLibClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>enhanceTagLibMetaClass</strong>(<a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@groovy.transform.CompileStatic<br>@java.lang.Deprecated(since: 8.0.0)<br>static void <strong>enhanceTagLibMetaClass</strong>(<a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
<p></p>
</li>
</ul>
@@ -330,7 +342,7 @@ extends java.lang.Object</pre>
<a name="enhanceTagLibMetaClass(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>enhanceTagLibMetaClass</strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</h4>
+ <h4>@groovy.transform.CompileStatic<br>@java.lang.Deprecated(since: 8.0.0)<br>static void <strong>enhanceTagLibMetaClass</strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</h4>
<p></p>
</li>
</ul>
@@ -346,7 +358,7 @@ extends java.lang.Object</pre>
<a name="registerMethodMissingForTags(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, boolean, boolean)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static java.lang.Object <strong>registerMethodMissingForTags</strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, boolean addAll, boolean overrideMethods)</h4>
+ <h4>@groovy.transform.CompileStatic<br>@java.lang.Deprecated(since: 8.0.0)<br>static java.lang.Object <strong>registerMethodMissingForTags</strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, boolean addAll, boolean overrideMethods)</h4>
<p></p>
</li>
</ul>
@@ -354,7 +366,7 @@ extends java.lang.Object</pre>
<a name="registerMethodMissingForTags(groovy.lang.MetaClass, org.springframework.context.ApplicationContext, grails.core.gsp.GrailsTagLibClass, java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static java.lang.Object <strong>registerMethodMissingForTags</strong>(groovy.lang.MetaClass mc, <a href='../../../org.springframework.context.ApplicationContext.html'>ApplicationContext</a> ctx, <a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> tagLibraryClass, java.lang.String name)</h4>
+ <h4>@java.lang.Deprecated(since: 8.0.0)<br>static java.lang.Object <strong>registerMethodMissingForTags</strong>(groovy.lang.MetaClass mc, <a href='../../../org.springframework.context.ApplicationContext.html'>ApplicationContext</a> ctx, <a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> tagLibraryClass, java.lang.String name)</h4>
<p></p>
</li>
</ul>
@@ -362,7 +374,7 @@ extends java.lang.Object</pre>
<a name="registerNamespaceMetaProperties(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerNamespaceMetaProperties</strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@groovy.transform.CompileStatic<br>@java.lang.Deprecated(since: 8.0.0)<br>static void <strong>registerNamespaceMetaProperties</strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
<p></p>
</li>
</ul>
@@ -370,7 +382,7 @@ extends java.lang.Object</pre>
<a name="registerNamespaceMetaProperty(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerNamespaceMetaProperty</strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</h4>
+ <h4>@groovy.transform.CompileStatic<br>@java.lang.Deprecated(since: 8.0.0)<br>static void <strong>registerNamespaceMetaProperty</strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</h4>
<p></p>
</li>
</ul>
@@ -378,7 +390,7 @@ extends java.lang.Object</pre>
<a name="registerPropertyMissingForTag(groovy.lang.MetaClass, java.lang.String, java.lang.Object)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerPropertyMissingForTag</strong>(groovy.lang.MetaClass metaClass, java.lang.String name, java.lang.Object result)</h4>
+ <h4>@groovy.transform.CompileStatic<br>@java.lang.Deprecated(since: 8.0.0)<br>static void <strong>registerPropertyMissingForTag</strong>(groovy.lang.MetaClass metaClass, java.lang.String name, java.lang.Object result)</h4>
<p></p>
</li>
</ul>
@@ -386,7 +398,7 @@ extends java.lang.Object</pre>
<a name="registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerTagMetaMethods</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, boolean overrideMethods)</h4>
+ <h4>@groovy.transform.CompileStatic<br>@java.lang.Deprecated(since: 8.0.0)<br>static void <strong>registerTagMetaMethods</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, boolean overrideMethods)</h4>
<p></p>
</li>
</ul>
diff --git a/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html b/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
index 64351f4eb29..c00bfe12217 100644
--- a/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
+++ b/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
@@ -70,11 +70,11 @@ if (location.href.indexOf('is-external=true') == -1) {
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field Constructor <li><a href="#method_summary">Method</a></li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field Constructor <li><a href="#method_detail">Method</a></li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -118,6 +118,30 @@ extends java.lang.Object</pre>
<!-- =========== FIELD SUMMARY =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="field_summary"><!-- --></a>
+ <h3>Field Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
+ <caption><span>Fields</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Modifiers</th>
+ <th class="colLast" scope="col">Name</th>
+ <th class="colLast" scope="col">Description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.util.Set<java.lang.String></strong></code> </td>
+ <td class="colLast"><code><a href="#FRAMEWORK_METHOD_NAMES">FRAMEWORK_METHOD_NAMES</a></code></td>
+ <td class="colLast">Names that live on every tag library through the framework traits and are therefore never tags.</td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
<!-- =========== PROPERTY SUMMARY =========== -->
@@ -150,7 +174,7 @@ extends java.lang.Object</pre>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.util.Map<java.lang.String, java.util.List<java.lang.reflect.Method>></code></td>
+ <td class="colLast"><code>protected java.util.Map<java.lang.String, java.util.List<TagMethodBinding>></code></td>
<td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class<?> type)</code><br></td>
</tr>
@@ -218,6 +242,29 @@ extends java.lang.Object</pre>
+ <!-- =========== FIELD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="field_detail">
+ <!-- -->
+ </a>
+ <h3>Field Detail</h3>
+
+ <a name="FRAMEWORK_METHOD_NAMES"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.util.Set<java.lang.String> <strong>FRAMEWORK_METHOD_NAMES</strong></h4>
+ <p> Names that live on every tag library through the framework traits and are therefore never tags.
+ <p>
+ Exposed so that the compile-time tag library index derives the same tag names from the AST that
+ this class derives by reflection at runtime. A name recorded in the index but rejected here
+ would resolve when a GSP is compiled and then fail to dispatch when it renders.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
@@ -245,7 +292,7 @@ extends java.lang.Object</pre>
<a name="computeValue(Class)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>protected java.util.Map<java.lang.String, java.util.List<java.lang.reflect.Method>> <strong>computeValue</strong>(java.lang.Class<?> type)</h4>
+ <h4>@java.lang.Override<br>protected java.util.Map<java.lang.String, java.util.List<TagMethodBinding>> <strong>computeValue</strong>(java.lang.Class<?> type)</h4>
<p></p>
</li>
</ul>
@@ -324,11 +371,11 @@ extends java.lang.Object</pre>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field Constructor <li><a href="#method_summary">Method</a></li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field Constructor <li><a href="#method_detail">Method</a></li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/taglib/TemplateNamespacedTagDispatcher.html b/docs/snapshot/api/org/grails/taglib/TemplateNamespacedTagDispatcher.html
index 66ba9b2ce9a..f6a53584ff0 100644
--- a/docs/snapshot/api/org/grails/taglib/TemplateNamespacedTagDispatcher.html
+++ b/docs/snapshot/api/org/grails/taglib/TemplateNamespacedTagDispatcher.html
@@ -151,7 +151,7 @@ extends <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html'>Namesp
</tr>
<tr class="altColor">
<td class="colFirst"><strong><code>class <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html'>NamespacedTagDispatcher</a></code></strong></td>
- <td class="colLast"><code><a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#application'>application</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#developmentMode'>developmentMode</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#lookup'>lookup</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#namespace'>namespace</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html [...]
+ <td class="colLast"><code><a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#application'>application</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#lookup'>lookup</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#namespace'>namespace</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#type'>type</a></code></td>
</tr>
</table>
@@ -226,13 +226,8 @@ extends <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html'>Namesp
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#methodMissing(java.lang.String, java.lang.Object)">methodMissing</a></strong>(java.lang.String name, java.lang.Object args)</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected void</code></td>
- <td class="colLast"><code><strong><a href="#registerTagMetaMethods(groovy.lang.ExpandoMetaClass)">registerTagMetaMethods</a></strong>(groovy.lang.ExpandoMetaClass emc)</code><br></td>
+ <td class="colLast"><code><strong><a href="#methodMissing(java.lang.String, java.lang.Object)">methodMissing</a></strong>(java.lang.String name, java.lang.Object args)</code><br>A template name used once used to be installed onto this dispatcher's metaclass so that the next
+ use of the same name bypassed methodMissing. </td>
</tr>
</table>
@@ -251,7 +246,7 @@ extends <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html'>Namesp
<tr class="altColor">
<td class="colFirst"><code>class <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html'>NamespacedTagDispatcher</a></code></td>
- <td class="colLast"><code><a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#initializeMetaClass()'>initializeMetaClass</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#methodMissing(java.lang.String, java.lang.Object)'>methodMissing</a>, <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#registerTagMetaMethods(groovy.lang.ExpandoMetaClass)'>registerTagMetaMethods</a></code></td>
+ <td class="colLast"><code><a href='../../../org/grails/taglib/NamespacedTagDispatcher.html#methodMissing(java.lang.String, java.lang.Object)'>methodMissing</a></code></td>
</tr>
</table>
</ul>
@@ -349,15 +344,10 @@ extends <a href='../../../org/grails/taglib/NamespacedTagDispatcher.html'>Namesp
<ul class="blockListLast">
<li class="blockList">
<h4>java.lang.Object <strong>methodMissing</strong>(java.lang.String name, java.lang.Object args)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="registerTagMetaMethods(groovy.lang.ExpandoMetaClass)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>protected void <strong>registerTagMetaMethods</strong>(groovy.lang.ExpandoMetaClass emc)</h4>
- <p></p>
+ <p> A template name used once used to be installed onto this dispatcher's metaclass so that the next
+ use of the same name bypassed methodMissing. Rendering goes through the render tag either way,
+ and installing the name made every template a caller referenced a write to an
+ ExpandoMetaClass whose reads are then guarded by a lock.</p>
</li>
</ul>
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html b/docs/snapshot/api/org/grails/taglib/discovery/AstTagLibraryView.html
similarity index 69%
copy from docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
copy to docs/snapshot/api/org/grails/taglib/discovery/AstTagLibraryView.html
index e41bcd7ea46..5bee980f32a 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/AstTagLibraryView.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)</title>
+ <title>AstTagLibraryView (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="AstTagLibraryView (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,20 +51,20 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/AstTagLibraryView" target="_top">Frames</a></li>
+ <li><a href="AstTagLibraryView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,25 +85,33 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.gsp</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.discovery</strong></div>
- <h2 title="[Groovy] Class GroovyPagesMetaUtils" class="title">[Groovy] Class GroovyPagesMetaUtils</h2>
+ <h2 title="[Java] Class AstTagLibraryView" class="title">[Java] Class AstTagLibraryView</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gsp.GroovyPagesMetaUtils
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.discovery.AstTagLibraryView
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
+ <dl>
+ <dt>All Implemented Interfaces and Traits:</dt>
+ <dd><a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a></dd>
+ </dl>
+
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.transform.CompileStatic
-class GroovyPagesMetaUtils
-extends java.lang.Object</pre>
+<pre>public final class AstTagLibraryView
+extends java.lang.Object
+implements <a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a></pre>
+
+ <p> A tag library read from its syntax tree, as a build reads one while compiling it.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -140,7 +148,7 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#GroovyPagesMetaUtils()">GroovyPagesMetaUtils</a></strong>()</code><br></td>
+ <code><strong><a href="#AstTagLibraryView(org.codehaus.groovy.ast.ClassNode, boolean)">AstTagLibraryView</a></strong>(org.codehaus.groovy.ast.ClassNode classNode, boolean parameterNamesRetained)</code><br></td>
</tr>
</table>
@@ -166,14 +174,20 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public java.util.List<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#declaredClosureFieldNames()">declaredClosureFieldNames</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public java.util.List<<a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a>></code></td>
+ <td class="colLast"><code><strong><a href="#declaredMethods()">declaredMethods</a></strong>()</code><br></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public <a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a></code></td>
+ <td class="colLast"><code><strong><a href="#superclassView()">superclassView</a></strong>()</code><br></td>
</tr>
</table>
@@ -223,10 +237,10 @@ extends java.lang.Object</pre>
</a>
<h3>Constructor Detail</h3>
- <a name="GroovyPagesMetaUtils()"><!-- --></a>
+ <a name="AstTagLibraryView(org.codehaus.groovy.ast.ClassNode, boolean)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>GroovyPagesMetaUtils</strong>()</h4>
+ <h4>public <strong>AstTagLibraryView</strong>(org.codehaus.groovy.ast.ClassNode classNode, boolean parameterNamesRetained)</h4>
<p></p>
</li>
</ul>
@@ -244,18 +258,26 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="declaredClosureFieldNames()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@java.lang.Override<br>public java.util.List<java.lang.String> <strong>declaredClosureFieldNames</strong>()</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ <a name="declaredMethods()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>public java.util.List<<a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a>> <strong>declaredMethods</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="superclassView()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>public <a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a> <strong>superclassView</strong>()</h4>
<p></p>
</li>
</ul>
@@ -275,20 +297,20 @@ extends java.lang.Object</pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/AstTagLibraryView" target="_top">Frames</a></li>
+ <li><a href="AstTagLibraryView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html b/docs/snapshot/api/org/grails/taglib/discovery/AstTagMethodView.html
similarity index 55%
copy from docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
copy to docs/snapshot/api/org/grails/taglib/discovery/AstTagMethodView.html
index 43584df903c..48620276a7b 100644
--- a/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/AstTagMethodView.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>TagLibraryMetaUtils (Grails 8.0.0-SNAPSHOT)</title>
+ <title>AstTagMethodView (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="TagLibraryMetaUtils (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="AstTagMethodView (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,20 +51,20 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagLibraryMetaUtils" target="_top">Frames</a></li>
- <li><a href="TagLibraryMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/AstTagMethodView" target="_top">Frames</a></li>
+ <li><a href="AstTagMethodView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,24 +85,39 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.taglib</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.discovery</strong></div>
- <h2 title="[Groovy] Class TagLibraryMetaUtils" class="title">[Groovy] Class TagLibraryMetaUtils</h2>
+ <h2 title="[Java] Class AstTagMethodView" class="title">[Java] Class AstTagMethodView</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.taglib.TagLibraryMetaUtils
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.discovery.AstTagMethodView
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
+ <dl>
+ <dt>All Implemented Interfaces and Traits:</dt>
+ <dd><a href='../../../../org/grails/taglib/discovery/TagMethodView.html'>TagMethodView</a></dd>
+ </dl>
+
<!-- todo: direct known subclasses -->
<hr>
-<pre>class TagLibraryMetaUtils
-extends java.lang.Object</pre>
+<pre>public final class AstTagMethodView
+extends java.lang.Object
+implements <a href='../../../../org/grails/taglib/discovery/TagMethodView.html'>TagMethodView</a></pre>
+
+ <p> A method being compiled, seen through <a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a> so that <a href='../../../../org/grails/taglib/discovery/TagDiscoveryRules.html' title='TagDiscoveryRules'>TagDiscoveryRules</a> can
+ classify it before the class exists.
+
+ <p>Two differences from the compiled view are handled here. Parameter defaults have not yet been
+ expanded into overloads, so they are reported as optional. And whether names will survive into the
+ class file is a property of the compilation rather than of the method, so it is supplied by the
+ caller from the compiler configuration.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -139,7 +154,7 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#TagLibraryMetaUtils()">TagLibraryMetaUtils</a></strong>()</code><br></td>
+ <code><strong><a href="#AstTagMethodView(org.codehaus.groovy.ast.MethodNode, boolean)">AstTagMethodView</a></strong>(org.codehaus.groovy.ast.MethodNode method, boolean parameterNamesRetained)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>method</code> - the method being compiled</DD></DL></td>
</tr>
</table>
@@ -165,74 +180,74 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#addTagLibMethodToMetaClass(groovy.lang.GroovyObject, groovy.lang.MetaMethod, groovy.lang.MetaClass)">addTagLibMethodToMetaClass</a></strong>(groovy.lang.GroovyObject tagBean, groovy.lang.MetaMethod method, groovy.lang.MetaClass mc)</code><br></td>
+ <td class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a href="#getName()">getName</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected static boolean</code></td>
- <td class="colLast"><code><strong><a href="#doesMethodExist(groovy.lang.MetaClass, java.lang.String, java.lang.Class, boolean, boolean)">doesMethodExist</a></strong>(groovy.lang.MetaClass mc, java.lang.String methodName, java.lang.Class[] parameterTypes, boolean staticScope, boolean onlyReal)</code><br></td>
+ <td class="colLast"><code>public int</code></td>
+ <td class="colLast"><code><strong><a href="#getParameterCount()">getParameterCount</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#enhanceTagLibMetaClass(grails.core.gsp.GrailsTagLibClass, org.grails.taglib.TagLibraryLookup)">enhanceTagLibMetaClass</a></strong>(<a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a href="#getParameterName(int)">getParameterName</a></strong>(int index)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#enhanceTagLibMetaClass(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)">enhanceTagLibMetaClass</a></strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#hasNotATagAnnotation()">hasNotATagAnnotation</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#methodMissingForTagLib(groovy.lang.MetaClass, java.lang.Class, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object, boolean)">methodMissingForTagLib</a></strong>(groovy.lang.MetaClass mc, java.lang.Class type, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, java.lang.Object args [...]
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#hasTagAnnotation()">hasTagAnnotation</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForTags(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, boolean, boolean)">registerMethodMissingForTags</a></strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, boolean addAll, boolean overrideMethods)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isGenerated()">isGenerated</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForTags(groovy.lang.MetaClass, org.springframework.context.ApplicationContext, grails.core.gsp.GrailsTagLibClass, java.lang.String)">registerMethodMissingForTags</a></strong>(groovy.lang.MetaClass mc, <a href='../../../org.springframework.context.ApplicationContext.html'>ApplicationContext</a> ctx, <a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> tagLibraryClass, ja [...]
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterClosureAssignable(int)">isParameterClosureAssignable</a></strong>(int index)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerNamespaceMetaProperties(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerNamespaceMetaProperties</a></strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterMapAssignable(int)">isParameterMapAssignable</a></strong>(int index)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerNamespaceMetaProperty(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)">registerNamespaceMetaProperty</a></strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterNamePresent(int)">isParameterNamePresent</a></strong>(int index)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerPropertyMissingForTag(groovy.lang.MetaClass, java.lang.String, java.lang.Object)">registerPropertyMissingForTag</a></strong>(groovy.lang.MetaClass metaClass, java.lang.String name, java.lang.Object result)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterOptional(int)">isParameterOptional</a></strong>(int index)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)">registerTagMetaMethods</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, boolean overrideMethods)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isPublic()">isPublic</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerTagMethodContextMetaProperties(groovy.lang.MetaClass)">registerTagMethodContextMetaProperties</a></strong>(groovy.lang.MetaClass metaClass)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isStatic()">isStatic</a></strong>()</code><br></td>
</tr>
</table>
@@ -282,11 +297,13 @@ extends java.lang.Object</pre>
</a>
<h3>Constructor Detail</h3>
- <a name="TagLibraryMetaUtils()"><!-- --></a>
+ <a name="AstTagMethodView(org.codehaus.groovy.ast.MethodNode, boolean)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>TagLibraryMetaUtils</strong>()</h4>
- <p></p>
+ <h4>public <strong>AstTagMethodView</strong>(org.codehaus.groovy.ast.MethodNode method, boolean parameterNamesRetained)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>method</code> - the method being compiled</DD><DD><code>parameterNamesRetained</code> - whether this compilation writes parameter names into the class
+ file, which decides whether the attributes and body parameters have to carry those names</DD></DL></p>
</li>
</ul>
@@ -303,98 +320,98 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="addTagLibMethodToMetaClass(groovy.lang.GroovyObject, groovy.lang.MetaMethod, groovy.lang.MetaClass)"><!-- --></a>
+ <a name="getName()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static java.lang.Object <strong>addTagLibMethodToMetaClass</strong>(groovy.lang.GroovyObject tagBean, groovy.lang.MetaMethod method, groovy.lang.MetaClass mc)</h4>
+ <h4>@java.lang.Override<br>public java.lang.String <strong>getName</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="doesMethodExist(groovy.lang.MetaClass, java.lang.String, java.lang.Class, boolean, boolean)"><!-- --></a>
+ <a name="getParameterCount()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>protected static boolean <strong>doesMethodExist</strong>(groovy.lang.MetaClass mc, java.lang.String methodName, java.lang.Class[] parameterTypes, boolean staticScope, boolean onlyReal)</h4>
+ <h4>@java.lang.Override<br>public int <strong>getParameterCount</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="enhanceTagLibMetaClass(grails.core.gsp.GrailsTagLibClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="getParameterName(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>enhanceTagLibMetaClass</strong>(<a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>public java.lang.String <strong>getParameterName</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="enhanceTagLibMetaClass(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)"><!-- --></a>
+ <a name="hasNotATagAnnotation()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>enhanceTagLibMetaClass</strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>hasNotATagAnnotation</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="methodMissingForTagLib(groovy.lang.MetaClass, java.lang.Class, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object, boolean)"><!-- --></a>
+ <a name="hasTagAnnotation()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic(value: TypeCheckingMode.SKIP)<br>static java.lang.Object <strong>methodMissingForTagLib</strong>(groovy.lang.MetaClass mc, java.lang.Class type, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, java.lang.Object argsParam, boolean addMethodsToMetaClass)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>hasTagAnnotation</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerMethodMissingForTags(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, boolean, boolean)"><!-- --></a>
+ <a name="isGenerated()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static java.lang.Object <strong>registerMethodMissingForTags</strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, boolean addAll, boolean overrideMethods)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isGenerated</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerMethodMissingForTags(groovy.lang.MetaClass, org.springframework.context.ApplicationContext, grails.core.gsp.GrailsTagLibClass, java.lang.String)"><!-- --></a>
+ <a name="isParameterClosureAssignable(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static java.lang.Object <strong>registerMethodMissingForTags</strong>(groovy.lang.MetaClass mc, <a href='../../../org.springframework.context.ApplicationContext.html'>ApplicationContext</a> ctx, <a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> tagLibraryClass, java.lang.String name)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isParameterClosureAssignable</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="registerNamespaceMetaProperties(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="isParameterMapAssignable(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerNamespaceMetaProperties</strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isParameterMapAssignable</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="registerNamespaceMetaProperty(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)"><!-- --></a>
+ <a name="isParameterNamePresent(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerNamespaceMetaProperty</strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isParameterNamePresent</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="registerPropertyMissingForTag(groovy.lang.MetaClass, java.lang.String, java.lang.Object)"><!-- --></a>
+ <a name="isParameterOptional(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerPropertyMissingForTag</strong>(groovy.lang.MetaClass metaClass, java.lang.String name, java.lang.Object result)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isParameterOptional</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)"><!-- --></a>
+ <a name="isPublic()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerTagMetaMethods</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, boolean overrideMethods)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isPublic</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerTagMethodContextMetaProperties(groovy.lang.MetaClass)"><!-- --></a>
+ <a name="isStatic()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerTagMethodContextMetaProperties</strong>(groovy.lang.MetaClass metaClass)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isStatic</strong>()</h4>
<p></p>
</li>
</ul>
@@ -414,20 +431,20 @@ extends java.lang.Object</pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagLibraryMetaUtils" target="_top">Frames</a></li>
- <li><a href="TagLibraryMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/AstTagMethodView" target="_top">Frames</a></li>
+ <li><a href="AstTagMethodView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html b/docs/snapshot/api/org/grails/taglib/discovery/ReflectedTagLibraryView.html
similarity index 69%
copy from docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
copy to docs/snapshot/api/org/grails/taglib/discovery/ReflectedTagLibraryView.html
index e41bcd7ea46..2080109a77e 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/ReflectedTagLibraryView.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)</title>
+ <title>ReflectedTagLibraryView (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="ReflectedTagLibraryView (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,20 +51,20 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/ReflectedTagLibraryView" target="_top">Frames</a></li>
+ <li><a href="ReflectedTagLibraryView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,25 +85,33 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.gsp</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.discovery</strong></div>
- <h2 title="[Groovy] Class GroovyPagesMetaUtils" class="title">[Groovy] Class GroovyPagesMetaUtils</h2>
+ <h2 title="[Java] Class ReflectedTagLibraryView" class="title">[Java] Class ReflectedTagLibraryView</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gsp.GroovyPagesMetaUtils
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.discovery.ReflectedTagLibraryView
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
+ <dl>
+ <dt>All Implemented Interfaces and Traits:</dt>
+ <dd><a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a></dd>
+ </dl>
+
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.transform.CompileStatic
-class GroovyPagesMetaUtils
-extends java.lang.Object</pre>
+<pre>public final class ReflectedTagLibraryView
+extends java.lang.Object
+implements <a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a></pre>
+
+ <p> A tag library read from its compiled class, as an application reads one when it registers it.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -140,7 +148,7 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#GroovyPagesMetaUtils()">GroovyPagesMetaUtils</a></strong>()</code><br></td>
+ <code><strong><a href="#ReflectedTagLibraryView(Class)">ReflectedTagLibraryView</a></strong>(java.lang.Class<?> type)</code><br></td>
</tr>
</table>
@@ -166,14 +174,20 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public java.util.List<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#declaredClosureFieldNames()">declaredClosureFieldNames</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public java.util.List<<a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a>></code></td>
+ <td class="colLast"><code><strong><a href="#declaredMethods()">declaredMethods</a></strong>()</code><br></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public <a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a></code></td>
+ <td class="colLast"><code><strong><a href="#superclassView()">superclassView</a></strong>()</code><br></td>
</tr>
</table>
@@ -223,10 +237,10 @@ extends java.lang.Object</pre>
</a>
<h3>Constructor Detail</h3>
- <a name="GroovyPagesMetaUtils()"><!-- --></a>
+ <a name="ReflectedTagLibraryView(Class)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>GroovyPagesMetaUtils</strong>()</h4>
+ <h4>public <strong>ReflectedTagLibraryView</strong>(java.lang.Class<?> type)</h4>
<p></p>
</li>
</ul>
@@ -244,18 +258,26 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="declaredClosureFieldNames()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@java.lang.Override<br>public java.util.List<java.lang.String> <strong>declaredClosureFieldNames</strong>()</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ <a name="declaredMethods()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>public java.util.List<<a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a>> <strong>declaredMethods</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="superclassView()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>public <a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a> <strong>superclassView</strong>()</h4>
<p></p>
</li>
</ul>
@@ -275,20 +297,20 @@ extends java.lang.Object</pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/ReflectedTagLibraryView" target="_top">Frames</a></li>
+ <li><a href="ReflectedTagLibraryView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html b/docs/snapshot/api/org/grails/taglib/discovery/ReflectedTagMethodView.html
similarity index 55%
copy from docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
copy to docs/snapshot/api/org/grails/taglib/discovery/ReflectedTagMethodView.html
index 43584df903c..055146703f9 100644
--- a/docs/snapshot/api/org/grails/taglib/TagLibraryMetaUtils.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/ReflectedTagMethodView.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>TagLibraryMetaUtils (Grails 8.0.0-SNAPSHOT)</title>
+ <title>ReflectedTagMethodView (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="TagLibraryMetaUtils (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="ReflectedTagMethodView (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,20 +51,20 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagLibraryMetaUtils" target="_top">Frames</a></li>
- <li><a href="TagLibraryMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/ReflectedTagMethodView" target="_top">Frames</a></li>
+ <li><a href="ReflectedTagMethodView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,24 +85,37 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.taglib</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.discovery</strong></div>
- <h2 title="[Groovy] Class TagLibraryMetaUtils" class="title">[Groovy] Class TagLibraryMetaUtils</h2>
+ <h2 title="[Java] Class ReflectedTagMethodView" class="title">[Java] Class ReflectedTagMethodView</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.taglib.TagLibraryMetaUtils
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.discovery.ReflectedTagMethodView
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
+ <dl>
+ <dt>All Implemented Interfaces and Traits:</dt>
+ <dd><a href='../../../../org/grails/taglib/discovery/TagMethodView.html'>TagMethodView</a></dd>
+ </dl>
+
<!-- todo: direct known subclasses -->
<hr>
-<pre>class TagLibraryMetaUtils
-extends java.lang.Object</pre>
+<pre>public final class ReflectedTagMethodView
+extends java.lang.Object
+implements <a href='../../../../org/grails/taglib/discovery/TagMethodView.html'>TagMethodView</a></pre>
+
+ <p> A compiled method, seen through <a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a> so that <a href='../../../../org/grails/taglib/discovery/TagDiscoveryRules.html' title='TagDiscoveryRules'>TagDiscoveryRules</a> can classify
+ it at runtime.
+
+ <p>Groovy compiles a parameter default into separate overloads, so by the time a method is
+ reflected on there are no optional parameters left to report.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -139,7 +152,7 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#TagLibraryMetaUtils()">TagLibraryMetaUtils</a></strong>()</code><br></td>
+ <code><strong><a href="#ReflectedTagMethodView(java.lang.reflect.Method)">ReflectedTagMethodView</a></strong>(java.lang.reflect.Method method)</code><br></td>
</tr>
</table>
@@ -165,74 +178,74 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#addTagLibMethodToMetaClass(groovy.lang.GroovyObject, groovy.lang.MetaMethod, groovy.lang.MetaClass)">addTagLibMethodToMetaClass</a></strong>(groovy.lang.GroovyObject tagBean, groovy.lang.MetaMethod method, groovy.lang.MetaClass mc)</code><br></td>
+ <td class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a href="#getName()">getName</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected static boolean</code></td>
- <td class="colLast"><code><strong><a href="#doesMethodExist(groovy.lang.MetaClass, java.lang.String, java.lang.Class, boolean, boolean)">doesMethodExist</a></strong>(groovy.lang.MetaClass mc, java.lang.String methodName, java.lang.Class[] parameterTypes, boolean staticScope, boolean onlyReal)</code><br></td>
+ <td class="colLast"><code>public int</code></td>
+ <td class="colLast"><code><strong><a href="#getParameterCount()">getParameterCount</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#enhanceTagLibMetaClass(grails.core.gsp.GrailsTagLibClass, org.grails.taglib.TagLibraryLookup)">enhanceTagLibMetaClass</a></strong>(<a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a href="#getParameterName(int)">getParameterName</a></strong>(int index)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#enhanceTagLibMetaClass(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)">enhanceTagLibMetaClass</a></strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#hasNotATagAnnotation()">hasNotATagAnnotation</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#methodMissingForTagLib(groovy.lang.MetaClass, java.lang.Class, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object, boolean)">methodMissingForTagLib</a></strong>(groovy.lang.MetaClass mc, java.lang.Class type, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, java.lang.Object args [...]
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#hasTagAnnotation()">hasTagAnnotation</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForTags(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, boolean, boolean)">registerMethodMissingForTags</a></strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, boolean addAll, boolean overrideMethods)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isGenerated()">isGenerated</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForTags(groovy.lang.MetaClass, org.springframework.context.ApplicationContext, grails.core.gsp.GrailsTagLibClass, java.lang.String)">registerMethodMissingForTags</a></strong>(groovy.lang.MetaClass mc, <a href='../../../org.springframework.context.ApplicationContext.html'>ApplicationContext</a> ctx, <a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> tagLibraryClass, ja [...]
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterClosureAssignable(int)">isParameterClosureAssignable</a></strong>(int index)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerNamespaceMetaProperties(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerNamespaceMetaProperties</a></strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterMapAssignable(int)">isParameterMapAssignable</a></strong>(int index)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerNamespaceMetaProperty(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)">registerNamespaceMetaProperty</a></strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterNamePresent(int)">isParameterNamePresent</a></strong>(int index)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerPropertyMissingForTag(groovy.lang.MetaClass, java.lang.String, java.lang.Object)">registerPropertyMissingForTag</a></strong>(groovy.lang.MetaClass metaClass, java.lang.String name, java.lang.Object result)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterOptional(int)">isParameterOptional</a></strong>(int index)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)">registerTagMetaMethods</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, boolean overrideMethods)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isPublic()">isPublic</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerTagMethodContextMetaProperties(groovy.lang.MetaClass)">registerTagMethodContextMetaProperties</a></strong>(groovy.lang.MetaClass metaClass)</code><br></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isStatic()">isStatic</a></strong>()</code><br></td>
</tr>
</table>
@@ -282,10 +295,10 @@ extends java.lang.Object</pre>
</a>
<h3>Constructor Detail</h3>
- <a name="TagLibraryMetaUtils()"><!-- --></a>
+ <a name="ReflectedTagMethodView(java.lang.reflect.Method)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>TagLibraryMetaUtils</strong>()</h4>
+ <h4>public <strong>ReflectedTagMethodView</strong>(java.lang.reflect.Method method)</h4>
<p></p>
</li>
</ul>
@@ -303,98 +316,98 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="addTagLibMethodToMetaClass(groovy.lang.GroovyObject, groovy.lang.MetaMethod, groovy.lang.MetaClass)"><!-- --></a>
+ <a name="getName()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static java.lang.Object <strong>addTagLibMethodToMetaClass</strong>(groovy.lang.GroovyObject tagBean, groovy.lang.MetaMethod method, groovy.lang.MetaClass mc)</h4>
+ <h4>@java.lang.Override<br>public java.lang.String <strong>getName</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="doesMethodExist(groovy.lang.MetaClass, java.lang.String, java.lang.Class, boolean, boolean)"><!-- --></a>
+ <a name="getParameterCount()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>protected static boolean <strong>doesMethodExist</strong>(groovy.lang.MetaClass mc, java.lang.String methodName, java.lang.Class[] parameterTypes, boolean staticScope, boolean onlyReal)</h4>
+ <h4>@java.lang.Override<br>public int <strong>getParameterCount</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="enhanceTagLibMetaClass(grails.core.gsp.GrailsTagLibClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="getParameterName(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>enhanceTagLibMetaClass</strong>(<a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> taglib, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>public java.lang.String <strong>getParameterName</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="enhanceTagLibMetaClass(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)"><!-- --></a>
+ <a name="hasNotATagAnnotation()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>enhanceTagLibMetaClass</strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>hasNotATagAnnotation</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="methodMissingForTagLib(groovy.lang.MetaClass, java.lang.Class, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, java.lang.Object, boolean)"><!-- --></a>
+ <a name="hasTagAnnotation()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic(value: TypeCheckingMode.SKIP)<br>static java.lang.Object <strong>methodMissingForTagLib</strong>(groovy.lang.MetaClass mc, java.lang.Class type, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, java.lang.Object argsParam, boolean addMethodsToMetaClass)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>hasTagAnnotation</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerMethodMissingForTags(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, java.lang.String, boolean, boolean)"><!-- --></a>
+ <a name="isGenerated()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static java.lang.Object <strong>registerMethodMissingForTags</strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace, java.lang.String name, boolean addAll, boolean overrideMethods)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isGenerated</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerMethodMissingForTags(groovy.lang.MetaClass, org.springframework.context.ApplicationContext, grails.core.gsp.GrailsTagLibClass, java.lang.String)"><!-- --></a>
+ <a name="isParameterClosureAssignable(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static java.lang.Object <strong>registerMethodMissingForTags</strong>(groovy.lang.MetaClass mc, <a href='../../../org.springframework.context.ApplicationContext.html'>ApplicationContext</a> ctx, <a href='../../../grails/core/gsp/GrailsTagLibClass.html'>GrailsTagLibClass</a> tagLibraryClass, java.lang.String name)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isParameterClosureAssignable</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="registerNamespaceMetaProperties(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="isParameterMapAssignable(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerNamespaceMetaProperties</strong>(groovy.lang.MetaClass mc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isParameterMapAssignable</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="registerNamespaceMetaProperty(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String)"><!-- --></a>
+ <a name="isParameterNamePresent(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerNamespaceMetaProperty</strong>(groovy.lang.MetaClass metaClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup, java.lang.String namespace)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isParameterNamePresent</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="registerPropertyMissingForTag(groovy.lang.MetaClass, java.lang.String, java.lang.Object)"><!-- --></a>
+ <a name="isParameterOptional(int)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerPropertyMissingForTag</strong>(groovy.lang.MetaClass metaClass, java.lang.String name, java.lang.Object result)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isParameterOptional</strong>(int index)</h4>
<p></p>
</li>
</ul>
- <a name="registerTagMetaMethods(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup, java.lang.String, boolean)"><!-- --></a>
+ <a name="isPublic()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerTagMetaMethods</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> lookup, java.lang.String namespace, boolean overrideMethods)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isPublic</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="registerTagMethodContextMetaProperties(groovy.lang.MetaClass)"><!-- --></a>
+ <a name="isStatic()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@groovy.transform.CompileStatic<br>static void <strong>registerTagMethodContextMetaProperties</strong>(groovy.lang.MetaClass metaClass)</h4>
+ <h4>@java.lang.Override<br>public boolean <strong>isStatic</strong>()</h4>
<p></p>
</li>
</ul>
@@ -414,20 +427,20 @@ extends java.lang.Object</pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagLibraryMetaUtils" target="_top">Frames</a></li>
- <li><a href="TagLibraryMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/ReflectedTagMethodView" target="_top">Frames</a></li>
+ <li><a href="ReflectedTagMethodView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html b/docs/snapshot/api/org/grails/taglib/discovery/TagDiscoveryRules.html
similarity index 56%
copy from docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html
copy to docs/snapshot/api/org/grails/taglib/discovery/TagDiscoveryRules.html
index 51e20ef8ec7..f3b961b4713 100644
--- a/docs/snapshot/api/grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/TagDiscoveryRules.html
@@ -27,7 +27,7 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>TagLibArtefactTypeAstTransformation (Grails 8.0.0-SNAPSHOT)</title>
+ <title>TagDiscoveryRules (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
@@ -37,7 +37,7 @@
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="TagLibArtefactTypeAstTransformation (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="TagDiscoveryRules (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -63,8 +63,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../index.html?grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation" target="_top">Frames</a></li>
- <li><a href="TagLibArtefactTypeAstTransformation.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/TagDiscoveryRules" target="_top">Frames</a></li>
+ <li><a href="TagDiscoveryRules.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,13 +85,13 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>grails.gsp.taglib.compiler</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.discovery</strong></div>
- <h2 title="[Java] Class TagLibArtefactTypeAstTransformation" class="title">[Java] Class TagLibArtefactTypeAstTransformation</h2>
+ <h2 title="[Java] Class TagDiscoveryRules" class="title">[Java] Class TagDiscoveryRules</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li><ul class="inheritance"></ul></li><li><ul class="inheritance"></ul></li><li>grails.gsp.taglib.compiler.TagLibArtefactTypeAstTransformation
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.discovery.TagDiscoveryRules
</ul>
<div class="description">
<ul class="blockList">
@@ -101,9 +101,25 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- todo: direct known subclasses -->
<hr>
-<pre>@org.codehaus.groovy.transform.GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
-public class TagLibArtefactTypeAstTransformation
-extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransformation.html'>ArtefactTypeAstTransformation</a></pre>
+<pre>public final class TagDiscoveryRules
+extends java.lang.Object</pre>
+
+ <p> Decides whether a method is a tag.
+
+ <p>The single statement of those rules. Both the reflective discovery an application performs at
+ startup and the syntax-tree discovery a build performs while compiling a tag library route through
+ here, so the two cannot drift apart: a method is a tag for a compiler exactly when it is a tag for
+ the runtime.
+
+ <p>The rules, in order:
+ <ol>
+ <li>plumbing — non-public, static, or compiler-generated methods are never tags;</li>
+ <li><CODE>@NotATag</CODE> excludes, <CODE>@Tag</CODE> includes, each overriding everything below;</li>
+ <li>names belonging to Object, Groovy, or the framework traits are never tags;</li>
+ <li>property accessors are never tags;</li>
+ <li>what remains is a tag if it can be called as <CODE>(attrs)</CODE> or <CODE>(attrs, body)</CODE>.</li>
+ </ol>
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -133,30 +149,20 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
<tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#WARN_DEPRECATED_CLOSURES_PROPERTY">WARN_DEPRECATED_CLOSURES_PROPERTY</a></code></td>
- <td class="colLast">System property to silence the closure-based tag deprecation warning emitted at compile time.
- </td>
+ <td class="colLast"><code><a href="#ATTRS_PARAMETER_NAME">ATTRS_PARAMETER_NAME</a></code></td>
+ <td class="colLast">The name a java.util.Map parameter must carry to be the attributes parameter, when the
+ method retains parameter names.</td>
</tr>
- </table>
- </ul>
- </li>
-
- <li class="blockList"><a name="field_summary"><!-- --></a>
- <ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited fields summary table">
- <caption><span>Inherited fields</span><span class="tabEnd"> </span></caption>
- <tr>
- <th class="colFirst" scope="col">Fields inherited from class</th>
- <th class="colLast" scope="col">Fields</th>
- </tr>
- <tr class="altColor">
- <td class="colFirst"><strong><code>class <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransformation.html'>ArtefactTypeAstTransformation</a></code></strong></td>
- <td class="colLast"><code><a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransformation.html#compilationUnit'>compilationUnit</a></code></td>
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#BODY_PARAMETER_NAME">BODY_PARAMETER_NAME</a></code></td>
+ <td class="colLast">The name a groovy.lang.Closure parameter must carry to be the body parameter, when the
+ method retains parameter names.</td>
</tr>
-
+
</table>
- </ul>
+ </ul>
</li>
</ul>
@@ -187,20 +193,20 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected void</code></td>
- <td class="colLast"><code><strong><a href="#addClosureTagDeprecationWarnings(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)">addClosureTagDeprecationWarnings</a></strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.ClassNode classNode)</code><br></td>
+ <td class="colLast"><code>public static java.util.Set<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#findTags(org.grails.taglib.discovery.TagLibraryView)">findTags</a></strong>(<a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a> view)</code><br>Finds every tag a tag library declares, from either view of it.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected org.codehaus.groovy.ast.ClassNode</code></td>
- <td class="colLast"><code><strong><a href="#getAnnotationType()">getAnnotationType</a></strong>()</code><br></td>
+ <td class="colLast"><code>public static java.util.Set<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#getFrameworkMethodNames()">getFrameworkMethodNames</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>the names that are never tags, whatever their shape</DD></DL></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.lang.String</code></td>
- <td class="colLast"><code><strong><a href="#resolveArtefactType(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.AnnotationNode, org.codehaus.groovy.ast.ClassNode)">resolveArtefactType</a></strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.AnnotationNode annotationNode, org.codehaus.groovy.ast.ClassNode classNode)</code><br></td>
+ <td class="colLast"><code>public static boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isTagMethod(org.grails.taglib.discovery.TagMethodView)">isTagMethod</a></strong>(<a href='../../../../org/grails/taglib/discovery/TagMethodView.html'>TagMethodView</a> method)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>method</code> - the method to classify</DD></DL></td>
</tr>
</table>
@@ -218,12 +224,8 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
</tr>
<tr class="altColor">
- <td class="colFirst"><code>class <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransformation.html'>ArtefactTypeAstTransformation</a></code></td>
- <td class="colLast"><code><a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransformation.html#findInjectors(java.lang.String, grails.compiler.ast.ClassInjector)'>findInjectors</a>, <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransformation.html#getAnnotationType()'>getAnnotationType</a>, <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransformation.html#getAnnotationTypeClass()'>getAnnotationTypeClass< [...]
- </tr>
- <tr class="altColor">
- <td class="colFirst"><code>class <a href='../../../../org/grails/compiler/injection/AbstractArtefactTypeAstTransformation.html'>AbstractArtefactTypeAstTransformation</a></code></td>
- <td class="colLast"><code><a href='../../../../org/grails/compiler/injection/AbstractArtefactTypeAstTransformation.html#performInjectionOnArtefactType(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode, java.lang.String)'>performInjectionOnArtefactType</a></code></td>
+ <td class="colFirst"><code>class java.lang.Object</code></td>
+ <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
</tr>
</table>
</ul>
@@ -248,12 +250,22 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
</a>
<h3>Field Detail</h3>
- <a name="WARN_DEPRECATED_CLOSURES_PROPERTY"><!-- --></a>
+ <a name="ATTRS_PARAMETER_NAME"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>ATTRS_PARAMETER_NAME</strong></h4>
+ <p> The name a java.util.Map parameter must carry to be the attributes parameter, when the
+ method retains parameter names.
+ </p>
+ </li>
+ </ul>
+
+ <a name="BODY_PARAMETER_NAME"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public static final java.lang.String <strong>WARN_DEPRECATED_CLOSURES_PROPERTY</strong></h4>
- <p> System property to silence the closure-based tag deprecation warning emitted at compile time.
- Set to <CODE>false</CODE> to suppress (default <CODE>true</CODE>).
+ <h4>public static final java.lang.String <strong>BODY_PARAMETER_NAME</strong></h4>
+ <p> The name a groovy.lang.Closure parameter must carry to be the body parameter, when the
+ method retains parameter names.
</p>
</li>
</ul>
@@ -277,27 +289,35 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
</a>
<h3>Method Detail</h3>
- <a name="addClosureTagDeprecationWarnings(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)"><!-- --></a>
+ <a name="findTags(org.grails.taglib.discovery.TagLibraryView)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>protected void <strong>addClosureTagDeprecationWarnings</strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.ClassNode classNode)</h4>
- <p></p>
+ <h4>public static java.util.Set<java.lang.String> <strong>findTags</strong>(<a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a> view)</h4>
+ <p> Finds every tag a tag library declares, from either view of it.
+
+ <p>The two kinds are enumerated differently, because the runtime dispatches them differently. A
+ method tag is read from the declaring class alone, since dispatch scans declared methods and an
+ inherited one is not callable as a tag. A closure tag is read up the whole hierarchy, since
+ dispatch finds it as a property and a property is inherited.
+ <DL><DT><B>Parameters:</B></DT><DD><code>view</code> - the tag library, from a syntax tree or from a compiled class</DD></DL><DL><DT><B>Returns:</B></DT><DD>every tag name the library declares</DD></DL></p>
</li>
</ul>
- <a name="getAnnotationType()"><!-- --></a>
+ <a name="getFrameworkMethodNames()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>protected org.codehaus.groovy.ast.ClassNode <strong>getAnnotationType</strong>()</h4>
- <p></p>
+ <h4>public static java.util.Set<java.lang.String> <strong>getFrameworkMethodNames</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>the names that are never tags, whatever their shape</DD></DL></p>
</li>
</ul>
- <a name="resolveArtefactType(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.AnnotationNode, org.codehaus.groovy.ast.ClassNode)"><!-- --></a>
+ <a name="isTagMethod(org.grails.taglib.discovery.TagMethodView)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>protected java.lang.String <strong>resolveArtefactType</strong>(org.codehaus.groovy.control.SourceUnit sourceUnit, org.codehaus.groovy.ast.AnnotationNode annotationNode, org.codehaus.groovy.ast.ClassNode classNode)</h4>
- <p></p>
+ <h4>public static boolean <strong>isTagMethod</strong>(<a href='../../../../org/grails/taglib/discovery/TagMethodView.html'>TagMethodView</a> method)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>method</code> - the method to classify</DD></DL><DL><DT><B>Returns:</B></DT><DD>true if the method can be invoked as a tag</DD></DL></p>
</li>
</ul>
@@ -328,8 +348,8 @@ extends <a href='../../../../org/grails/compiler/injection/ArtefactTypeAstTransf
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../index.html?grails/gsp/taglib/compiler/TagLibArtefactTypeAstTransformation" target="_top">Frames</a></li>
- <li><a href="TagLibArtefactTypeAstTransformation.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/TagDiscoveryRules" target="_top">Frames</a></li>
+ <li><a href="TagDiscoveryRules.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html b/docs/snapshot/api/org/grails/taglib/discovery/TagLibraryAstDiscovery.html
similarity index 58%
copy from docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
copy to docs/snapshot/api/org/grails/taglib/discovery/TagLibraryAstDiscovery.html
index e41bcd7ea46..75a3c282e36 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/TagLibraryAstDiscovery.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)</title>
+ <title>TagLibraryAstDiscovery (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="TagLibraryAstDiscovery (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,30 +51,30 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/TagLibraryAstDiscovery" target="_top">Frames</a></li>
+ <li><a href="TagLibraryAstDiscovery.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -85,13 +85,13 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.gsp</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.discovery</strong></div>
- <h2 title="[Groovy] Class GroovyPagesMetaUtils" class="title">[Groovy] Class GroovyPagesMetaUtils</h2>
+ <h2 title="[Java] Class TagLibraryAstDiscovery" class="title">[Java] Class TagLibraryAstDiscovery</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gsp.GroovyPagesMetaUtils
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.discovery.TagLibraryAstDiscovery
</ul>
<div class="description">
<ul class="blockList">
@@ -101,10 +101,16 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.transform.CompileStatic
-class GroovyPagesMetaUtils
+<pre>public final class TagLibraryAstDiscovery
extends java.lang.Object</pre>
+ <p> Reads a tag library's namespace and tag names from its syntax tree.
+
+ <p>Classification is delegated to <a href='../../../../org/grails/taglib/discovery/TagDiscoveryRules.html' title='TagDiscoveryRules'>TagDiscoveryRules</a>, the same rules an application applies
+ when it registers tag libraries, so the two cannot disagree about what a tag is. What remains here
+ is reading the namespace and gathering the candidate members from the tree.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
</li>
</ul>
</div>
@@ -119,34 +125,37 @@ extends java.lang.Object</pre>
<!-- =========== FIELD SUMMARY =========== -->
-
- <!-- =========== PROPERTY SUMMARY =========== -->
-
-
- <!-- =========== ELEMENT SUMMARY =========== -->
-
-
-
- <!-- ======== CONSTRUCTOR SUMMARY ======== -->
- <ul class="blockList">
- <li class="blockList"><a name="constructor_summary"><!-- --></a>
- <h3>Constructor Summary</h3>
+ <ul class="blockList">
+ <li class="blockList"><a name="field_summary"><!-- --></a>
+ <h3>Field Summary</h3>
<ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructors Summary table">
- <caption><span>Constructors</span><span class="tabEnd"> </span></caption>
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
+ <caption><span>Fields</span><span class="tabEnd"> </span></caption>
<tr>
- <th class="colFirst" scope="col">Constructor and description</th>
+ <th class="colFirst" scope="col">Modifiers</th>
+ <th class="colLast" scope="col">Name</th>
+ <th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
- <td class="colFirst">
- <code><strong><a href="#GroovyPagesMetaUtils()">GroovyPagesMetaUtils</a></strong>()</code><br></td>
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#DEFAULT_NAMESPACE">DEFAULT_NAMESPACE</a></code></td>
+ <td class="colLast"></td>
</tr>
</table>
</ul>
- </li>
- </ul>
+ </li>
+
+ </ul>
+
+
+ <!-- =========== PROPERTY SUMMARY =========== -->
+
+
+ <!-- =========== ELEMENT SUMMARY =========== -->
+
+
@@ -166,14 +175,15 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public static java.util.Set<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#findTags(org.codehaus.groovy.ast.ClassNode, boolean)">findTags</a></strong>(org.codehaus.groovy.ast.ClassNode classNode, boolean parameterNamesRetained)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>classNode</code> - the tag library</DD></DL></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public static java.lang.String</code></td>
+ <td class="colLast"><code><strong><a href="#resolveNamespace(org.codehaus.groovy.ast.ClassNode)">resolveNamespace</a></strong>(org.codehaus.groovy.ast.ClassNode classNode)</code><br>Resolves the namespace the way <CODE>DefaultGrailsTagLibClass</CODE> does at runtime, which reads the
+ static <CODE>namespace</CODE> property through the class hierarchy.</td>
</tr>
</table>
@@ -210,23 +220,17 @@ extends java.lang.Object</pre>
-
-
-
-
-
-
- <!-- =========== CONSTRUCTOR DETAIL =========== -->
+ <!-- =========== FIELD DETAIL =========== -->
<ul class="blockList">
- <li class="blockList"><a name="constructor_detail">
+ <li class="blockList"><a name="field_detail">
<!-- -->
</a>
- <h3>Constructor Detail</h3>
+ <h3>Field Detail</h3>
- <a name="GroovyPagesMetaUtils()"><!-- --></a>
+ <a name="DEFAULT_NAMESPACE"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>GroovyPagesMetaUtils</strong>()</h4>
+ <h4>public static final java.lang.String <strong>DEFAULT_NAMESPACE</strong></h4>
<p></p>
</li>
</ul>
@@ -235,6 +239,12 @@ extends java.lang.Object</pre>
</ul>
+
+
+
+
+
+
<!-- =========== METHOD DETAIL =========== -->
@@ -244,19 +254,23 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="findTags(org.codehaus.groovy.ast.ClassNode, boolean)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
- <p></p>
+ <h4>public static java.util.Set<java.lang.String> <strong>findTags</strong>(org.codehaus.groovy.ast.ClassNode classNode, boolean parameterNamesRetained)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>classNode</code> - the tag library</DD><DD><code>parameterNamesRetained</code> - whether this compilation writes parameter names into the class file</DD></DL><DL><DT><B>Returns:</B></DT><DD>every tag name the library declares</DD></DL></p>
</li>
</ul>
- <a name="registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="resolveNamespace(org.codehaus.groovy.ast.ClassNode)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
- <p></p>
+ <h4>public static java.lang.String <strong>resolveNamespace</strong>(org.codehaus.groovy.ast.ClassNode classNode)</h4>
+ <p> Resolves the namespace the way <CODE>DefaultGrailsTagLibClass</CODE> does at runtime, which reads the
+ static <CODE>namespace</CODE> property through the class hierarchy.
+ <DL><DT><B>Parameters:</B></DT><DD><code>classNode</code> - the tag library</DD></DL><DL><DT><B>Returns:</B></DT><DD>the namespace, or <CODE>null</CODE> when it cannot be determined without running the code, in
+ which case no descriptor should be written and the tag library resolves dynamically</DD></DL></p>
</li>
</ul>
@@ -275,30 +289,30 @@ extends java.lang.Object</pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/TagLibraryAstDiscovery" target="_top">Frames</a></li>
+ <li><a href="TagLibraryAstDiscovery.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html b/docs/snapshot/api/org/grails/taglib/discovery/TagLibraryView.html
similarity index 54%
copy from docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
copy to docs/snapshot/api/org/grails/taglib/discovery/TagLibraryView.html
index e41bcd7ea46..ddb9c393d01 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPagesMetaUtils.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/TagLibraryView.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)</title>
+ <title>TagLibraryView (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="GroovyPagesMetaUtils (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="TagLibraryView (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,30 +51,30 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/TagLibraryView" target="_top">Frames</a></li>
+ <li><a href="TagLibraryView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested Field <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ Field <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -85,25 +85,32 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.gsp</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.discovery</strong></div>
- <h2 title="[Groovy] Class GroovyPagesMetaUtils" class="title">[Groovy] Class GroovyPagesMetaUtils</h2>
+ <h2 title="[Java] Interface TagLibraryView" class="title">[Java] Interface TagLibraryView</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gsp.GroovyPagesMetaUtils
+
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
-
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.transform.CompileStatic
-class GroovyPagesMetaUtils
-extends java.lang.Object</pre>
+<pre>public interface TagLibraryView</pre>
+
+ <p> A tag library as the rules need to read it, whether from a syntax tree or from a compiled class.
+
+ <p><a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a> lets the two agree on whether a method is a tag. This lets them agree on
+ which members to ask about in the first place, which is the other half of the same question: a tag
+ declared as a <CODE>Closure</CODE> field is inherited, so enumerating one class is not enough, while a
+ tag declared as a method is not, because dispatch reads declared methods only. Keeping the walk
+ here rather than once per side is what stops the index describing a different set of tags from the
+ one an application registers.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -127,27 +134,6 @@ extends java.lang.Object</pre>
- <!-- ======== CONSTRUCTOR SUMMARY ======== -->
- <ul class="blockList">
- <li class="blockList"><a name="constructor_summary"><!-- --></a>
- <h3>Constructor Summary</h3>
- <ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructors Summary table">
- <caption><span>Constructors</span><span class="tabEnd"> </span></caption>
- <tr>
- <th class="colFirst" scope="col">Constructor and description</th>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst">
- <code><strong><a href="#GroovyPagesMetaUtils()">GroovyPagesMetaUtils</a></strong>()</code><br></td>
- </tr>
-
- </table>
- </ul>
- </li>
- </ul>
-
<!-- ========== METHOD SUMMARY =========== -->
@@ -166,38 +152,28 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
+ <td class="colLast"><code>public java.util.List<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#declaredClosureFieldNames()">declaredClosureFieldNames</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>the names of the non-static fields this class itself declares whose type is a
+ <CODE>Closure</CODE>, including a subclass of one</DD></DL></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>static void</code></td>
- <td class="colLast"><code><strong><a href="#registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)">registerMethodMissingForGSP</a></strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</code><br></td>
- </tr>
-
- </table>
- </ul>
- </li>
-
- <li class="blockList"><a name="method_summary"><!-- --></a>
- <h3>Inherited Methods Summary</h3>
- <ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
- <caption><span>Inherited Methods</span><span class="tabEnd"> </span></caption>
- <tr>
- <th class="colFirst" scope="col">Methods inherited from class</th>
- <th class="colLast" scope="col">Name</th>
+ <td class="colLast"><code>public java.util.List<<a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a>></code></td>
+ <td class="colLast"><code><strong><a href="#declaredMethods()">declaredMethods</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>the methods this class itself declares, excluding anything inherited</DD></DL></td>
</tr>
<tr class="altColor">
- <td class="colFirst"><code>class java.lang.Object</code></td>
- <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public <a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a></code></td>
+ <td class="colLast"><code><strong><a href="#superclassView()">superclassView</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>the superclass to continue the walk with, or <CODE>null</CODE> at the top of the hierarchy
+ or where the superclass cannot be read</DD></DL></td>
</tr>
+
</table>
</ul>
</li>
-
+
</ul>
</li>
@@ -216,24 +192,6 @@ extends java.lang.Object</pre>
- <!-- =========== CONSTRUCTOR DETAIL =========== -->
- <ul class="blockList">
- <li class="blockList"><a name="constructor_detail">
- <!-- -->
- </a>
- <h3>Constructor Detail</h3>
-
- <a name="GroovyPagesMetaUtils()"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4><strong>GroovyPagesMetaUtils</strong>()</h4>
- <p></p>
- </li>
- </ul>
-
- </li>
- </ul>
-
@@ -244,19 +202,32 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="registerMethodMissingForGSP(java.lang.Class, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="declaredClosureFieldNames()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.util.List<java.lang.String> <strong>declaredClosureFieldNames</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>the names of the non-static fields this class itself declares whose type is a
+ <CODE>Closure</CODE>, including a subclass of one</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="declaredMethods()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(java.lang.Class gspClass, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
- <p></p>
+ <h4>public java.util.List<<a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a>> <strong>declaredMethods</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>the methods this class itself declares, excluding anything inherited</DD></DL></p>
</li>
</ul>
- <a name="registerMethodMissingForGSP(groovy.lang.MetaClass, org.grails.taglib.TagLibraryLookup)"><!-- --></a>
+ <a name="superclassView()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>static void <strong>registerMethodMissingForGSP</strong>(groovy.lang.MetaClass emc, <a href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a> gspTagLibraryLookup)</h4>
- <p></p>
+ <h4>public <a href='../../../../org/grails/taglib/discovery/TagLibraryView.html'>TagLibraryView</a> <strong>superclassView</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>the superclass to continue the walk with, or <CODE>null</CODE> at the top of the hierarchy
+ or where the superclass cannot be read</DD></DL></p>
</li>
</ul>
@@ -275,30 +246,30 @@ extends java.lang.Object</pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/gsp/GroovyPagesMetaUtils" target="_top">Frames</a></li>
- <li><a href="GroovyPagesMetaUtils.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/TagLibraryView" target="_top">Frames</a></li>
+ <li><a href="TagLibraryView.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested Field <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ Field <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/taglib/discovery/TagMethodView.html b/docs/snapshot/api/org/grails/taglib/discovery/TagMethodView.html
new file mode 100644
index 00000000000..5167fa22aca
--- /dev/null
+++ b/docs/snapshot/api/org/grails/taglib/discovery/TagMethodView.html
@@ -0,0 +1,435 @@
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- **************************************************************** -->
+<!-- * PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
+<!-- * i.e. only iterate & print data where possible. Thanks, Jez. * -->
+<!-- **************************************************************** -->
+
+<html>
+<head>
+ <!-- Generated by groovydoc (5.1.0) -->
+ <title>TagMethodView (Grails 8.0.0-SNAPSHOT)</title>
+
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
+
+<body class="center">
+<script type="text/javascript"><!--
+if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="TagMethodView (Grails 8.0.0-SNAPSHOT)";
+}
+//-->
+</script>
+<noscript>
+ <div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+ <!-- -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/TagMethodView" target="_top">Frames</a></li>
+ <li><a href="TagMethodView.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested Field <li><a href="#method_summary">Method</a></li>
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ Field <li><a href="#method_detail">Method</a></li>
+ </ul>
+ </div>
+ <a name="skip-navbar_top">
+ <!-- -->
+ </a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+
+ <div class="subTitle">Package: <strong>org.grails.taglib.discovery</strong></div>
+
+ <h2 title="[Java] Interface TagMethodView" class="title">[Java] Interface TagMethodView</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+
+</ul>
+<div class="description">
+ <ul class="blockList">
+ <li class="blockList">
+
+ <!-- todo: direct known subclasses -->
+ <hr>
+
+<pre>public interface TagMethodView</pre>
+
+ <p> The properties of a method that decide whether it is a tag.
+
+ <p>Tag discovery happens twice: over <CODE>java.lang.reflect.Method</CODE> when an application is
+ running, and over the abstract syntax tree while a tag library is compiled. The two must reach the
+ same answer — a method treated as a tag by one and not the other either fails to dispatch after
+ compiling cleanly, or is reported as unknown despite being callable.
+
+ <p>This is the abstraction that lets <a href='../../../../org/grails/taglib/discovery/TagDiscoveryRules.html' title='TagDiscoveryRules'>TagDiscoveryRules</a> be the only place those rules are
+ written, with a small adapter for each source of truth rather than a second implementation.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
+ </li>
+ </ul>
+</div>
+
+<div class="summary">
+ <ul class="blockList">
+ <li class="blockList">
+ <!-- =========== NESTED CLASS SUMMARY =========== -->
+
+
+ <!-- =========== ENUM CONSTANT SUMMARY =========== -->
+
+ <!-- =========== FIELD SUMMARY =========== -->
+
+
+ <!-- =========== PROPERTY SUMMARY =========== -->
+
+
+ <!-- =========== ELEMENT SUMMARY =========== -->
+
+
+
+
+
+ <!-- ========== METHOD SUMMARY =========== -->
+ <ul class="blockList">
+
+ <li class="blockList"><a name="method_summary"><!-- --></a>
+ <h3>Methods Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+ <caption><span>Methods</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Type Params</th>
+ <th class="colLast" scope="col">Return Type</th>
+ <th class="colLast" scope="col">Name and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a href="#getName()">getName</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>the method name</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public int</code></td>
+ <td class="colLast"><code><strong><a href="#getParameterCount()">getParameterCount</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>the number of declared parameters</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a href="#getParameterName(int)">getParameterName</a></strong>(int index)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#hasNotATagAnnotation()">hasNotATagAnnotation</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>true if the method is annotated <CODE>@NotATag</CODE>, which excludes it whatever its shape</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#hasTagAnnotation()">hasTagAnnotation</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>true if the method is annotated <CODE>@Tag</CODE>, which makes it a tag whatever its shape</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isGenerated()">isGenerated</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>true if the method was generated by the compiler rather than written, covering bridge
+ methods and the accessors trait application produces</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterClosureAssignable(int)">isParameterClosureAssignable</a></strong>(int index)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterMapAssignable(int)">isParameterMapAssignable</a></strong>(int index)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterNamePresent(int)">isParameterNamePresent</a></strong>(int index)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isParameterOptional(int)">isParameterOptional</a></strong>(int index)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isPublic()">isPublic</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>true if the method is public</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isStatic()">isStatic</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>true if the method is static</DD></DL></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<div class="details">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+
+
+
+
+
+
+
+
+
+
+ <!-- =========== METHOD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="method_detail">
+ <!-- -->
+ </a>
+ <h3>Method Detail</h3>
+
+ <a name="getName()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.lang.String <strong>getName</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>the method name</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="getParameterCount()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public int <strong>getParameterCount</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>the number of declared parameters</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="getParameterName(int)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.lang.String <strong>getParameterName</strong>(int index)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL><DL><DT><B>Returns:</B></DT><DD>the parameter's name, meaningful only when <a href='#isParameterNamePresent(int)'>isParameterNamePresent(int)</a> is true</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="hasNotATagAnnotation()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>hasNotATagAnnotation</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>true if the method is annotated <CODE>@NotATag</CODE>, which excludes it whatever its shape</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="hasTagAnnotation()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>hasTagAnnotation</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>true if the method is annotated <CODE>@Tag</CODE>, which makes it a tag whatever its shape</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isGenerated()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isGenerated</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>true if the method was generated by the compiler rather than written, covering bridge
+ methods and the accessors trait application produces</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isParameterClosureAssignable(int)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isParameterClosureAssignable</strong>(int index)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL><DL><DT><B>Returns:</B></DT><DD>true if a groovy.lang.Closure may be passed for this parameter</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isParameterMapAssignable(int)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isParameterMapAssignable</strong>(int index)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL><DL><DT><B>Returns:</B></DT><DD>true if a java.util.Map may be passed for this parameter</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isParameterNamePresent(int)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isParameterNamePresent</strong>(int index)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL><DL><DT><B>Returns:</B></DT><DD>true if the compiled method retains parameter names, which decides whether a parameter
+ has to be named <CODE>attrs</CODE> or <CODE>body</CODE> to be recognised as such</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isParameterOptional(int)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isParameterOptional</strong>(int index)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>index</code> - a parameter position</DD></DL><DL><DT><B>Returns:</B></DT><DD>true if the parameter has a default value, so that Groovy will also generate overloads
+ that omit it</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isPublic()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isPublic</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>true if the method is public</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isStatic()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isStatic</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>true if the method is static</DD></DL></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+ <!-- -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/TagMethodView" target="_top">Frames</a></li>
+ <li><a href="TagMethodView.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested Field <li><a href="#method_summary">Method</a></li>
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ Field <li><a href="#method_detail">Method</a></li>
+ </ul>
+ </div>
+ <p><!-- Matomo -->
+<script>
+ var _paq = window._paq = window._paq || [];
+ /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
+ _paq.push(["setDoNotTrack", true]);
+ _paq.push(["disableCookies"]);
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ var u="https://analytics.apache.org/";
+ _paq.push(['setTrackerUrl', u+'matomo.php']);
+ _paq.push(['setSiteId', '79']);
+ var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+ g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+ })();
+</script>
+<!-- End Matomo Code --></p>
+ <a name="skip-navbar_bottom">
+ <!-- -->
+ </a>
+ </div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+</body>
+</html>
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html b/docs/snapshot/api/org/grails/taglib/discovery/package-frame.html
similarity index 50%
copy from docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html
copy to docs/snapshot/api/org/grails/taglib/discovery/package-frame.html
index 95a5d291caa..23dba6ccb0b 100644
--- a/docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/package-frame.html
@@ -21,10 +21,10 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
- <title>grails.gsp.taglib.compiler</title>
+ <title>org.grails.taglib.discovery</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <meta name="keywords" CONTENT="grails/gsp/taglib/compiler package">
+ <meta name="keywords" CONTENT="org/grails/taglib/discovery package">
<link href="groovy.ico" type="image/x-icon" rel="shortcut icon">
<link href="groovy.ico" type="image/x-icon" rel="icon">
@@ -33,17 +33,25 @@
<body class="left">
<div class="indexHeader">
- <b><a href="package-summary.html" target="classFrame">grails.gsp.taglib.compiler</a></b>
+ <b><a href="package-summary.html" target="classFrame">org.grails.taglib.discovery</a></b>
</div>
+<div class="indexContainer">
+ <h2>Interfaces</h2>
+ <ul>
+ <li><a href="TagLibraryView.html" title="interface in org.grails.taglib.discovery" target="classFrame"><em>TagLibraryView</em></a></li><li><a href="TagMethodView.html" title="interface in org.grails.taglib.discovery" target="classFrame"><em>TagMethodView</em></a></li>
+ </ul>
+</div>
+
+
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="TagLibArtefactTypeAstTransformation.html" title="class in grails.gsp.taglib.compiler" target="classFrame">TagLibArtefactTypeAstTransformation</a></li>
+ <li><a href="AstTagLibraryView.html" title="class in org.grails.taglib.discovery" target="classFrame">AstTagLibraryView</a></li><li><a href="AstTagMethodView.html" title="class in org.grails.taglib.discovery" target="classFrame">AstTagMethodView</a></li><li><a href="ReflectedTagLibraryView.html" title="class in org.grails.taglib.discovery" target="classFrame">ReflectedTagLibraryView</a></li><li><a href="ReflectedTagMethodView.html" title="class in org.grails.taglib.discovery" tar [...]
</ul>
</div>
diff --git a/docs/snapshot/api/grails/compiler/traits/package-summary.html b/docs/snapshot/api/org/grails/taglib/discovery/package-summary.html
similarity index 62%
copy from docs/snapshot/api/grails/compiler/traits/package-summary.html
copy to docs/snapshot/api/org/grails/taglib/discovery/package-summary.html
index 90e5689dd9e..c107e512087 100644
--- a/docs/snapshot/api/grails/compiler/traits/package-summary.html
+++ b/docs/snapshot/api/org/grails/taglib/discovery/package-summary.html
@@ -22,16 +22,16 @@
<html>
<head>
-<title>grails.compiler.traits (Grails 8.0.0-SNAPSHOT)</title>
-<meta name="keywords" content="grails.compiler.traits package">
+<title>org.grails.taglib.discovery (Grails 8.0.0-SNAPSHOT)</title>
+<meta name="keywords" content="org.grails.taglib.discovery package">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<link rel ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" title="Style">
-<link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
-<link href="../../../groovy.ico" type="image/x-icon" rel="icon">
+<link rel ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" title="Style">
+<link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+<link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
<script type="text/javascript">
function windowTitle()
{
- parent.document.title="grails.compiler.traits (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="org.grails.taglib.discovery (Grails 8.0.0-SNAPSHOT)";
}
</script>
<noscript>
@@ -49,18 +49,18 @@ function windowTitle()
</a>
<a name="navbar_top_firstrow"><!-- --></a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li class="navBarCell1Rev">Package</li>
<li>Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
- <li><a href="../../../index.html?grails/compiler/traits/package-summary.html" target="_top">Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/discovery/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.html" target="_top">No Frames</a></li>
</ul>
</div>
@@ -68,7 +68,7 @@ function windowTitle()
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
- <h1 class="title">Package grails.compiler.traits</h1>
+ <h1 class="title">Package org.grails.taglib.discovery</h1>
</div>
@@ -88,11 +88,19 @@ function windowTitle()
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="TraitInjector.html" title="class in grails/compiler/traits">
- TraitInjector
+ <strong><a href="TagLibraryView.html" title="class in org/grails/taglib/discovery">
+ TagLibraryView
</a></strong>
</td>
- <td> <DL><DT><B>Authors:</B></DT><DD>Jeff Brown</DD></DL></td>
+ <td>A tag library as the rules need to read it, whether from a syntax tree or from a compiled class.</td>
+ </tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="TagMethodView.html" title="class in org/grails/taglib/discovery">
+ TagMethodView
+ </a></strong>
+ </td>
+ <td>The properties of a method that decide whether it is a tag.</td>
</tr>
</tbody>
@@ -116,59 +124,53 @@ function windowTitle()
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="ControllerTagLibraryTraitInjector.html" title="class in grails/compiler/traits">
- ControllerTagLibraryTraitInjector
- </a></strong>
- </td>
- <td>A <a href='../../../grails/compiler/traits/TraitInjector.html' title='TraitInjector'>TraitInjector</a> that adds the ability to invoke tag libraries from a controller</td>
- </tr>
-<tr class="altColor">
- <td class="colOne">
- <strong><a href="ControllerTraitInjector.html" title="class in grails/compiler/traits">
- ControllerTraitInjector
+ <strong><a href="AstTagLibraryView.html" title="class in org/grails/taglib/discovery">
+ AstTagLibraryView
</a></strong>
</td>
- <td>A <a href='../../../grails/compiler/traits/TraitInjector.html' title='TraitInjector'>TraitInjector</a> that injects controllers with the Controller trait</td>
+ <td>A tag library read from its syntax tree, as a build reads one while compiling it.</td>
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="DomainClassTraitInjector.html" title="class in grails/compiler/traits">
- DomainClassTraitInjector
+ <strong><a href="AstTagMethodView.html" title="class in org/grails/taglib/discovery">
+ AstTagMethodView
</a></strong>
</td>
- <td> <DL><DT><B>Authors:</B></DT><DD>Jeff Brown</DD></DL></td>
+ <td>A method being compiled, seen through <a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a> so that <a href='../../../../org/grails/taglib/discovery/TagDiscoveryRules.html' title='TagDiscoveryRules'>TagDiscoveryRules</a> can
+ classify it before the class exists.</td>
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="InterceptorTraitInjector.html" title="class in grails/compiler/traits">
- InterceptorTraitInjector
+ <strong><a href="ReflectedTagLibraryView.html" title="class in org/grails/taglib/discovery">
+ ReflectedTagLibraryView
</a></strong>
</td>
- <td>Injects the groovy.lang.Interceptor trait by convention</td>
+ <td>A tag library read from its compiled class, as an application reads one when it registers it.</td>
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="RestResponderTraitInjector.html" title="class in grails/compiler/traits">
- RestResponderTraitInjector
+ <strong><a href="ReflectedTagMethodView.html" title="class in org/grails/taglib/discovery">
+ ReflectedTagMethodView
</a></strong>
</td>
- <td> <DL><DT><B>Authors:</B></DT><DD>Jeff Brown</DD></DL></td>
+ <td>A compiled method, seen through <a href='../../../../org/grails/taglib/discovery/TagMethodView.html' title='TagMethodView'>TagMethodView</a> so that <a href='../../../../org/grails/taglib/discovery/TagDiscoveryRules.html' title='TagDiscoveryRules'>TagDiscoveryRules</a> can classify
+ it at runtime.</td>
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="TagLibraryTraitInjector.html" title="class in grails/compiler/traits">
- TagLibraryTraitInjector
+ <strong><a href="TagDiscoveryRules.html" title="class in org/grails/taglib/discovery">
+ TagDiscoveryRules
</a></strong>
</td>
- <td> <DL><DT><B>Since:</B></DT><DD>3.0</DD></DL></td>
+ <td>Decides whether a method is a tag.</td>
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="WebDataBindingTraitInjector.html" title="class in grails/compiler/traits">
- WebDataBindingTraitInjector
+ <strong><a href="TagLibraryAstDiscovery.html" title="class in org/grails/taglib/discovery">
+ TagLibraryAstDiscovery
</a></strong>
</td>
- <td> <DL><DT><B>Authors:</B></DT><DD>Jeff Brown</DD></DL></td>
+ <td>Reads a tag library's namespace and tag names from its syntax tree.</td>
</tr>
</tbody>
diff --git a/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndex.html b/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndex.html
new file mode 100644
index 00000000000..16c3e2320a5
--- /dev/null
+++ b/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndex.html
@@ -0,0 +1,681 @@
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- **************************************************************** -->
+<!-- * PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
+<!-- * i.e. only iterate & print data where possible. Thanks, Jez. * -->
+<!-- **************************************************************** -->
+
+<html>
+<head>
+ <!-- Generated by groovydoc (5.1.0) -->
+ <title>TagLibraryIndex (Grails 8.0.0-SNAPSHOT)</title>
+
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
+
+<body class="center">
+<script type="text/javascript"><!--
+if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="TagLibraryIndex (Grails 8.0.0-SNAPSHOT)";
+}
+//-->
+</script>
+<noscript>
+ <div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+ <!-- -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../index.html?org/grails/taglib/index/TagLibraryIndex" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndex.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
+ </ul>
+ </div>
+ <a name="skip-navbar_top">
+ <!-- -->
+ </a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+
+ <div class="subTitle">Package: <strong>org.grails.taglib.index</strong></div>
+
+ <h2 title="[Java] Class TagLibraryIndex" class="title">[Java] Class TagLibraryIndex</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.index.TagLibraryIndex
+</ul>
+<div class="description">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+ <!-- todo: direct known subclasses -->
+ <hr>
+
+<pre>public final class TagLibraryIndex
+extends java.lang.Object</pre>
+
+ <p> The set of tag libraries and tag names known at compile time.
+
+ <p>Each tag library contributes one descriptor under {<DL><DT><B>value:</B></DT><DD>#INDEX_LOCATION}, written by the
+ <CODE>TagLib</CODE> AST transformation as the tag library is compiled. Descriptors are per class rather
+ than per module so that libraries packaged in separate jars merge on the classpath without any
+ build step having to combine them, in the same way <CODE>META-INF/services</CODE> entries do.
+
+ <p>Reading the index answers "which tags exist in namespace x" without loading or reflecting over a
+ single tag library class, which is what allows GSP expressions to be resolved when a page is
+ compiled rather than dispatched dynamically when it renders.</DD></DL>
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
+ </li>
+ </ul>
+</div>
+
+<div class="summary">
+ <ul class="blockList">
+ <li class="blockList">
+ <!-- =========== NESTED CLASS SUMMARY =========== -->
+
+
+ <!-- =========== ENUM CONSTANT SUMMARY =========== -->
+
+ <!-- =========== FIELD SUMMARY =========== -->
+
+ <ul class="blockList">
+ <li class="blockList"><a name="field_summary"><!-- --></a>
+ <h3>Field Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
+ <caption><span>Fields</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Modifiers</th>
+ <th class="colLast" scope="col">Name</th>
+ <th class="colLast" scope="col">Description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static int</strong></code> </td>
+ <td class="colLast"><code><a href="#FORMAT_VERSION">FORMAT_VERSION</a></code></td>
+ <td class="colLast">Descriptor format this build writes and understands. </td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#INCOMPLETE_LOCATION">INCOMPLETE_LOCATION</a></code></td>
+ <td class="colLast">What the index could not describe, written by whatever produced it.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#INDEX_LOCATION">INDEX_LOCATION</a></code></td>
+ <td class="colLast">Classpath directory holding one descriptor per compiled tag library.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#SETTINGS_LOCATION">SETTINGS_LOCATION</a></code></td>
+ <td class="colLast">Settings the build states for the compilation the index is read in, written alongside the
+ descriptors by the build and deliberately not packaged into the artifact: they describe how this
+ project is compiled, not what its tag libraries declare.</td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
+
+ <!-- =========== PROPERTY SUMMARY =========== -->
+
+
+ <!-- =========== ELEMENT SUMMARY =========== -->
+
+
+
+
+
+ <!-- ========== METHOD SUMMARY =========== -->
+ <ul class="blockList">
+
+ <li class="blockList"><a name="method_summary"><!-- --></a>
+ <h3>Methods Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+ <caption><span>Methods</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Type Params</th>
+ <th class="colLast" scope="col">Return Type</th>
+ <th class="colLast" scope="col">Name and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#declaresNamespace(java.lang.String)">declaresNamespace</a></strong>(java.lang.String namespace)</code><br>Whether this project's own tag libraries declare a namespace.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public static <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html'>TagLibraryIndex</a></code></td>
+ <td class="colLast"><code><strong><a href="#forClassLoader(java.lang.ClassLoader)">forClassLoader</a></strong>(java.lang.ClassLoader classLoader)</code><br>Reads the index for a class loader, reusing the one already read for it.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public java.util.Set<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#getDynamicNamespaces()">getDynamicNamespaces</a></strong>()</code><br>Namespaces the build declared as filled in at runtime, whose tags are therefore never reported
+ as unknown however complete the index is.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public java.util.Set<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#getNamespaces()">getNamespaces</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>every namespace contributed by a compiled tag library</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public java.util.Set<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#getTagNames(java.lang.String)">getTagNames</a></strong>(java.lang.String namespace)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public java.util.Set<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#getTagNamesForClass(java.lang.String)">getTagNamesForClass</a></strong>(java.lang.String tagLibraryClassName)</code><br>The tags a given tag library declares, as recorded when it was compiled.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#hasNamespace(java.lang.String)">hasNamespace</a></strong>(java.lang.String namespace)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace, for example <CODE>g</CODE></DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isAmbiguous(java.lang.String, java.lang.String)">isAmbiguous</a></strong>(java.lang.String namespace, java.lang.String tagName)</code><br>Whether more than one tag library declares this tag, in which case which one the runtime will
+ dispatch to depends on registration order and cannot be decided here.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isClassDescribed(java.lang.String)">isClassDescribed</a></strong>(java.lang.String tagLibraryClassName)</code><br>Whether a descriptor for this tag library already exists.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isDynamicNamespace(java.lang.String)">isDynamicNamespace</a></strong>(java.lang.String namespace)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isEmpty()">isEmpty</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>true when no compiled tag library was found, in which case callers must fall back to
+ runtime resolution</DD></DL></td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isKnown(java.lang.String, java.lang.String)">isKnown</a></strong>(java.lang.String namespace, java.lang.String tagName)</code><br>Whether a compiled tag library declares this tag, including one declared by more than one of
+ them. </td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isNamespaceComplete(java.lang.String)">isNamespaceComplete</a></strong>(java.lang.String namespace)</code><br>Whether everything in a namespace was described.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isStrict()">isStrict</a></strong>()</code><br>Whether the build asked for a tag no compiled tag library declares to fail compilation.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public static <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html'>TagLibraryIndex</a></code></td>
+ <td class="colLast"><code><strong><a href="#load(java.lang.ClassLoader)">load</a></strong>(java.lang.ClassLoader classLoader)</code><br>Reads every tag library descriptor visible to the given class loader.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public <a href='../../../../org/grails/taglib/index/TagLibraryIndexEntry.html'>TagLibraryIndexEntry</a></code></td>
+ <td class="colLast"><code><strong><a href="#lookup(java.lang.String, java.lang.String)">lookup</a></strong>(java.lang.String namespace, java.lang.String tagName)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a href="#rewritesUnqualifiedCalls()">rewritesUnqualifiedCalls</a></strong>()</code><br>Whether a call written without a namespace may be compiled into an invocation.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a href="#toString()">toString</a></strong>()</code><br></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ <li class="blockList"><a name="method_summary"><!-- --></a>
+ <h3>Inherited Methods Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
+ <caption><span>Inherited Methods</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Methods inherited from class</th>
+ <th class="colLast" scope="col">Name</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code>class java.lang.Object</code></td>
+ <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
+ </tr>
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<div class="details">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+
+ <!-- =========== FIELD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="field_detail">
+ <!-- -->
+ </a>
+ <h3>Field Detail</h3>
+
+ <a name="FORMAT_VERSION"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final int <strong>FORMAT_VERSION</strong></h4>
+ <p> Descriptor format this build writes and understands. A descriptor carrying anything else was
+ produced by a different version of Grails and is ignored, so its tags resolve dynamically rather
+ than being read under the wrong set of rules.
+ </p>
+ </li>
+ </ul>
+
+ <a name="INCOMPLETE_LOCATION"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>INCOMPLETE_LOCATION</strong></h4>
+ <p> What the index could not describe, written by whatever produced it.
+
+ <p>An index generated before its project is compiled cannot always read every tag library: one
+ referring to a type that does not exist yet, in a language it cannot parse, or generated by the
+ build itself, is left out. A namespace missing some of its tags must not have a call to one of
+ them reported as a misspelling, so what was missed is recorded rather than left to be inferred
+ from the absence.
+ </p>
+ </li>
+ </ul>
+
+ <a name="INDEX_LOCATION"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>INDEX_LOCATION</strong></h4>
+ <p> Classpath directory holding one descriptor per compiled tag library.
+ </p>
+ </li>
+ </ul>
+
+ <a name="SETTINGS_LOCATION"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>SETTINGS_LOCATION</strong></h4>
+ <p> Settings the build states for the compilation the index is read in, written alongside the
+ descriptors by the build and deliberately not packaged into the artifact: they describe how this
+ project is compiled, not what its tag libraries declare.
+ </p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+
+
+
+
+
+
+
+
+
+ <!-- =========== METHOD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="method_detail">
+ <!-- -->
+ </a>
+ <h3>Method Detail</h3>
+
+ <a name="declaresNamespace(java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>declaresNamespace</strong>(java.lang.String namespace)</h4>
+ <p> Whether this project's own tag libraries declare a namespace.
+
+ <p>What a namespace holds is only fully knowable for the namespaces this project describes.
+ Every other namespace is contributed to by tag libraries from elsewhere - a plugin built before
+ descriptors existed, one registered while the application runs - and a tag missing from such a
+ namespace is as likely to be one of those as a misspelling.
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL><DL><DT><B>Returns:</B></DT><DD>true when a tag library of this project declares it</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="forClassLoader(java.lang.ClassLoader)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html'>TagLibraryIndex</a> <strong>forClassLoader</strong>(java.lang.ClassLoader classLoader)</h4>
+ <p> Reads the index for a class loader, reusing the one already read for it.
+
+ <p>Reading walks every jar on the classpath, so a compiler that consults the index for each
+ source file it compiles would walk it once per file. Use this from compilation; use
+ <a href='#load(java.lang.ClassLoader)'>load(ClassLoader)</a> where a fresh read is wanted.
+ <DL><DT><B>Parameters:</B></DT><DD><code>classLoader</code> - the loader to scan; when <CODE>null</CODE> the thread context loader is used</DD></DL><DL><DT><B>Returns:</B></DT><DD>the merged index, never <CODE>null</CODE></DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="getDynamicNamespaces()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.util.Set<java.lang.String> <strong>getDynamicNamespaces</strong>()</h4>
+ <p> Namespaces the build declared as filled in at runtime, whose tags are therefore never reported
+ as unknown however complete the index is.
+ <DL><DT><B>Returns:</B></DT><DD>the declared dynamic namespaces, empty when none were declared</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="getNamespaces()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.util.Set<java.lang.String> <strong>getNamespaces</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>every namespace contributed by a compiled tag library</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="getTagNames(java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.util.Set<java.lang.String> <strong>getTagNames</strong>(java.lang.String namespace)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL><DL><DT><B>Returns:</B></DT><DD>the tag names declared in that namespace, empty when the namespace is unknown</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="getTagNamesForClass(java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.util.Set<java.lang.String> <strong>getTagNamesForClass</strong>(java.lang.String tagLibraryClassName)</h4>
+ <p> The tags a given tag library declares, as recorded when it was compiled.
+
+ <p>Answered from that tag library's own descriptor, so a tag it declares is reported whether or
+ not another tag library declares the same name. Which of two tag libraries answers to a name at
+ runtime is a separate question, asked through <a href='#lookup'>lookup</a> and <a href='#isAmbiguous'>isAmbiguous</a>.
+
+ <p>This describes the class as it was compiled. A class that has since been reloaded, or one
+ built without a descriptor, is not described here and has to be asked directly.
+ <DL><DT><B>Parameters:</B></DT><DD><code>tagLibraryClassName</code> - the binary name of a tag library</DD></DL><DL><DT><B>Returns:</B></DT><DD>its tags, or an empty set when it has no descriptor</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="hasNamespace(java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>hasNamespace</strong>(java.lang.String namespace)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace, for example <CODE>g</CODE></DD></DL><DL><DT><B>Returns:</B></DT><DD>true if any compiled tag library declared that namespace</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isAmbiguous(java.lang.String, java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isAmbiguous</strong>(java.lang.String namespace, java.lang.String tagName)</h4>
+ <p> Whether more than one tag library declares this tag, in which case which one the runtime will
+ dispatch to depends on registration order and cannot be decided here.
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD><DD><code>tagName</code> - a tag name within that namespace</DD></DL><DL><DT><B>Returns:</B></DT><DD>true when the tag is declared by more than one tag library</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isClassDescribed(java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isClassDescribed</strong>(java.lang.String tagLibraryClassName)</h4>
+ <p> Whether a descriptor for this tag library already exists.
+
+ <p>Lets a tag library being compiled tell whether something has already described it - the build
+ generating the index ahead of compilation - so that it does not write a second, separately
+ maintained copy. A tag library the build did not manage to describe is not covered here and
+ describes itself instead.
+ <DL><DT><B>Parameters:</B></DT><DD><code>tagLibraryClassName</code> - the binary name of a tag library</DD></DL><DL><DT><B>Returns:</B></DT><DD>true when a descriptor for it was read</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isDynamicNamespace(java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isDynamicNamespace</strong>(java.lang.String namespace)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL><DL><DT><B>Returns:</B></DT><DD>true when the build declared this namespace as filled in at runtime</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isEmpty()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isEmpty</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>true when no compiled tag library was found, in which case callers must fall back to
+ runtime resolution</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isKnown(java.lang.String, java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isKnown</strong>(java.lang.String namespace, java.lang.String tagName)</h4>
+ <p> Whether a compiled tag library declares this tag, including one declared by more than one of
+ them. Such a tag exists; which tag library answers to it is settled at runtime.
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD><DD><code>tagName</code> - a tag name within that namespace</DD></DL><DL><DT><B>Returns:</B></DT><DD>true when the tag is known to the index</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isNamespaceComplete(java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isNamespaceComplete</strong>(java.lang.String namespace)</h4>
+ <p> Whether everything in a namespace was described.
+
+ <p>An index generated before its project is compiled may not have been able to read every tag
+ library: one referring to a type that does not exist yet, written in a language it cannot parse,
+ or generated by the build. A tag missing from an incomplete namespace is not evidence of a
+ misspelling, so nothing about it should be reported.
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD></DL><DL><DT><B>Returns:</B></DT><DD>true when every tag library contributing to it was described</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="isStrict()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>isStrict</strong>()</h4>
+ <p> Whether the build asked for a tag no compiled tag library declares to fail compilation.
+ <DL><DT><B>Returns:</B></DT><DD>true when the build set <CODE>grails.compileStatic.strictTags</CODE></DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="load(java.lang.ClassLoader)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html'>TagLibraryIndex</a> <strong>load</strong>(java.lang.ClassLoader classLoader)</h4>
+ <p> Reads every tag library descriptor visible to the given class loader.
+ <DL><DT><B>Parameters:</B></DT><DD><code>classLoader</code> - the loader to scan; when <CODE>null</CODE> the thread context loader is used</DD></DL><DL><DT><B>Returns:</B></DT><DD>the merged index, never <CODE>null</CODE></DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="lookup(java.lang.String, java.lang.String)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public <a href='../../../../org/grails/taglib/index/TagLibraryIndexEntry.html'>TagLibraryIndexEntry</a> <strong>lookup</strong>(java.lang.String namespace, java.lang.String tagName)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - a tag library namespace</DD><DD><code>tagName</code> - a tag name within that namespace</DD></DL><DL><DT><B>Returns:</B></DT><DD>the declaring tag library, or <CODE>null</CODE> when the tag is not statically known</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="rewritesUnqualifiedCalls()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>rewritesUnqualifiedCalls</strong>()</h4>
+ <p> Whether a call written without a namespace may be compiled into an invocation.
+
+ <p>Off unless the build asks for it. A namespaced call says which tag library it means; an
+ unqualified one is a bare name, and whether that name is a tag depends on what else answers to
+ it - a method Groovy gives every object, a delegate the enclosing closure is handed, an
+ overload the tag library also declares. The compiler can rule those out only as far as it can
+ see, so the default is to leave such a call to be dispatched as it always was.
+ <DL><DT><B>Returns:</B></DT><DD>true when the build set <CODE>grails.compileStatic.unqualifiedTagCalls</CODE></DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="toString()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@java.lang.Override<br>public java.lang.String <strong>toString</strong>()</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+ <!-- -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../index.html?org/grails/taglib/index/TagLibraryIndex" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndex.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
+ </ul>
+ </div>
+ <p><!-- Matomo -->
+<script>
+ var _paq = window._paq = window._paq || [];
+ /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
+ _paq.push(["setDoNotTrack", true]);
+ _paq.push(["disableCookies"]);
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ var u="https://analytics.apache.org/";
+ _paq.push(['setTrackerUrl', u+'matomo.php']);
+ _paq.push(['setSiteId', '79']);
+ var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+ g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+ })();
+</script>
+<!-- End Matomo Code --></p>
+ <a name="skip-navbar_bottom">
+ <!-- -->
+ </a>
+ </div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+</body>
+</html>
diff --git a/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexEntry.html b/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexEntry.html
new file mode 100644
index 00000000000..41dc0c535f0
--- /dev/null
+++ b/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexEntry.html
@@ -0,0 +1,237 @@
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- **************************************************************** -->
+<!-- * PLEASE KEEP COMPLICATED EXPRESSIONS OUT OF THESE TEMPLATES, * -->
+<!-- * i.e. only iterate & print data where possible. Thanks, Jez. * -->
+<!-- **************************************************************** -->
+
+<html>
+<head>
+ <!-- Generated by groovydoc (5.1.0) -->
+ <title>TagLibraryIndexEntry (Grails 8.0.0-SNAPSHOT)</title>
+
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
+
+<body class="center">
+<script type="text/javascript"><!--
+if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="TagLibraryIndexEntry (Grails 8.0.0-SNAPSHOT)";
+}
+//-->
+</script>
+<noscript>
+ <div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+ <!-- -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../index.html?org/grails/taglib/index/TagLibraryIndexEntry" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndexEntry.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested Field Method
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ Field Method
+ </ul>
+ </div>
+ <a name="skip-navbar_top">
+ <!-- -->
+ </a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+
+ <div class="subTitle">Package: <strong>org.grails.taglib.index</strong></div>
+
+ <h2 title="[Java] Record TagLibraryIndexEntry" class="title">[Java] Record TagLibraryIndexEntry</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.index.TagLibraryIndexEntry
+</ul>
+<div class="description">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+ <!-- todo: direct known subclasses -->
+ <hr>
+
+<pre>public record TagLibraryIndexEntry</pre>
+
+ <p> One tag recorded in the <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html' title='TagLibraryIndex'>TagLibraryIndex</a> at compile time.
+ <DL><DT><B>Parameters:</B></DT><DD><code>namespace</code> - the tag library namespace the tag is reachable through</DD><DD><code>tagName</code> - the tag name within that namespace</DD><DD><code>tagLibraryClassName</code> - the binary name of the tag library declaring the tag</DD><DD><code>acceptsBody</code> - whether the tag can be called with a body</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
+ </li>
+ </ul>
+</div>
+
+<div class="summary">
+ <ul class="blockList">
+ <li class="blockList">
+ <!-- =========== NESTED CLASS SUMMARY =========== -->
+
+
+ <!-- =========== ENUM CONSTANT SUMMARY =========== -->
+
+ <!-- =========== FIELD SUMMARY =========== -->
+
+
+ <!-- =========== PROPERTY SUMMARY =========== -->
+
+
+ <!-- =========== ELEMENT SUMMARY =========== -->
+
+
+
+
+
+ <!-- ========== METHOD SUMMARY =========== -->
+ <ul class="blockList">
+
+ <li class="blockList"><a name="method_summary"><!-- --></a>
+ <h3>Inherited Methods Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
+ <caption><span>Inherited Methods</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Methods inherited from class</th>
+ <th class="colLast" scope="col">Name</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code>class java.lang.Object</code></td>
+ <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
+ </tr>
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
+ </li>
+ </ul>
+</div>
+
+<div class="details">
+ <ul class="blockList">
+ <li class="blockList">
+
+
+
+
+
+
+
+
+
+
+
+
+ </li>
+ </ul>
+</div>
+
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+ <!-- -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+ <!-- -->
+</a>
+ <ul class="navList" title="Navigation">
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="package-summary.html">Package</a></li>
+ <li class="navBarCell1Rev">Class</li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
+ </ul>
+</div>
+
+<div class="subNav">
+ <div>
+ <ul class="navList">
+ <li><a href="../../../../index.html?org/grails/taglib/index/TagLibraryIndexEntry" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndexEntry.html" target="_top">No Frames</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="subNavList">
+ <li>Summary: </li>
+ Nested Field Method
+ </ul>
+ <ul class="subNavList">
+ <li> | Detail: </li>
+ Field Method
+ </ul>
+ </div>
+ <p><!-- Matomo -->
+<script>
+ var _paq = window._paq = window._paq || [];
+ /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
+ _paq.push(["setDoNotTrack", true]);
+ _paq.push(["disableCookies"]);
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ var u="https://analytics.apache.org/";
+ _paq.push(['setTrackerUrl', u+'matomo.php']);
+ _paq.push(['setSiteId', '79']);
+ var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+ g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+ })();
+</script>
+<!-- End Matomo Code --></p>
+ <a name="skip-navbar_bottom">
+ <!-- -->
+ </a>
+ </div>
+</div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+</body>
+</html>
diff --git a/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html b/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexGenerator.html
similarity index 56%
copy from docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
copy to docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexGenerator.html
index 64351f4eb29..ead72717d22 100644
--- a/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
+++ b/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexGenerator.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>TagMethodInvoker (Grails 8.0.0-SNAPSHOT)</title>
+ <title>TagLibraryIndexGenerator (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="TagMethodInvoker (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="TagLibraryIndexGenerator (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,20 +51,20 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagMethodInvoker" target="_top">Frames</a></li>
- <li><a href="TagMethodInvoker.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/index/TagLibraryIndexGenerator" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndexGenerator.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,13 +85,13 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.taglib</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.index</strong></div>
- <h2 title="[Java] Class TagMethodInvoker" class="title">[Java] Class TagMethodInvoker</h2>
+ <h2 title="[Java] Class TagLibraryIndexGenerator" class="title">[Java] Class TagLibraryIndexGenerator</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.taglib.TagMethodInvoker
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.index.TagLibraryIndexGenerator
</ul>
<div class="description">
<ul class="blockList">
@@ -101,9 +101,23 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- todo: direct known subclasses -->
<hr>
-<pre>public final class TagMethodInvoker
+<pre>public final class TagLibraryIndexGenerator
extends java.lang.Object</pre>
+ <p> Writes the tag library index for a source set.
+
+ <p>Sources are parsed to the point where the syntax tree is complete and no further, so a tag
+ library is never loaded or executed to find out what it declares. Reading the tree rather than the
+ text means the answer follows Groovy's own understanding of the source.
+
+ <p>The index is rewritten in full each time rather than added to. A tag library that has been
+ renamed or deleted therefore disappears from it, where an index accumulated as each class compiled
+ would keep describing tags that no longer exist until the build directory was cleaned.
+
+ <p>Invoked in a forked process by the build, with the source set's own compile classpath, because
+ the rules it applies belong to the framework rather than to the build tooling.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
</li>
</ul>
</div>
@@ -144,44 +158,28 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.util.Map<java.lang.String, java.lang.reflect.Field></code></td>
- <td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class<?> type)</code><br></td>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.util.Map<java.lang.String, java.util.List<java.lang.reflect.Method>></code></td>
- <td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class<?> type)</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)">getClosureTagProperty</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</code><br></td>
+ <td class="colLast"><code>public static void</code></td>
+ <td class="colLast"><code><strong><a href="#generate(java.io.File, java.io.File, boolean, java.lang.String)">generate</a></strong>(java.io.File sourceDir, java.io.File outputDir, boolean parameterNamesRetained, java.lang.String encoding)</code><br>Regenerates the index describing every tag library under a source directory.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static java.util.Collection<java.lang.String></code></td>
- <td class="colLast"><code><strong><a href="#getInvokableTagMethodNames(Class)">getInvokableTagMethodNames</a></strong>(java.lang.Class<?> tagLibClass)</code><br></td>
+ <td class="colLast"><code>public static void</code></td>
+ <td class="colLast"><code><strong><a href="#generate(List, java.io.File, boolean, java.lang.String)">generate</a></strong>(java.util.List<java.io.File> sourceDirs, java.io.File outputDir, boolean parameterNamesRetained, java.lang.String encoding)</code><br>Regenerates the index, resolving a type this project declares from its source.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static boolean</code></td>
- <td class="colLast"><code><strong><a href="#hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)">hasInvokableTagMethod</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</code><br></td>
+ <td class="colLast"><code>public static void</code></td>
+ <td class="colLast"><code><strong><a href="#generate(List, List, java.io.File, boolean, java.lang.String)">generate</a></strong>(java.util.List<java.io.File> sourceDirs, java.util.List<java.io.File> resolutionRoots, java.io.File outputDir, boolean parameterNamesRetained, java.lang.String encoding)</code><br>Regenerates the index describing every tag library under any of several source directories.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map, Closure)">invokeTagMethod</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName, java.util.Map<?, ?> attrs, groovy.lang.Closure<?> body)</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static boolean</code></td>
- <td class="colLast"><code><strong><a href="#isTagMethodCandidate(java.lang.reflect.Method)">isTagMethodCandidate</a></strong>(java.lang.reflect.Method method)</code><br></td>
+ <td class="colLast"><code>public static void</code></td>
+ <td class="colLast"><code><strong><a href="#main(java.lang.String)">main</a></strong>(java.lang.String[] args)</code><br> <DL><DT><B>Parameters:</B></DT><DD><code>args</code> - the output directory, whether parameter names are retained, the source encoding, how
+ many source directories follow, those directories, and then the source roots a type this
+ project declares may be resolved from</DD></DL></td>
</tr>
</table>
@@ -234,59 +232,46 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="computeValue(Class)"><!-- --></a>
+ <a name="generate(java.io.File, java.io.File, boolean, java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>protected java.util.Map<java.lang.String, java.lang.reflect.Field> <strong>computeValue</strong>(java.lang.Class<?> type)</h4>
- <p></p>
+ <h4>public static void <strong>generate</strong>(java.io.File sourceDir, java.io.File outputDir, boolean parameterNamesRetained, java.lang.String encoding)</h4>
+ <p> Regenerates the index describing every tag library under a source directory.<DL><DT><B>throws:</B></DT><DD>IOException if the index cannot be written</DD></DL>
+ <DL><DT><B>Parameters:</B></DT><DD><code>sourceDir</code> - the directory to scan for tag libraries</DD><DD><code>outputDir</code> - the directory the index is written beneath</DD><DD><code>parameterNamesRetained</code> - whether the compilation writes parameter names into class files</DD><DD><code>encoding</code> - the source encoding</DD></DL></p>
</li>
</ul>
- <a name="computeValue(Class)"><!-- --></a>
+ <a name="generate(List, java.io.File, boolean, java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>protected java.util.Map<java.lang.String, java.util.List<java.lang.reflect.Method>> <strong>computeValue</strong>(java.lang.Class<?> type)</h4>
- <p></p>
+ <h4>public static void <strong>generate</strong>(java.util.List<java.io.File> sourceDirs, java.io.File outputDir, boolean parameterNamesRetained, java.lang.String encoding)</h4>
+ <p> Regenerates the index, resolving a type this project declares from its source.<DL><DT><B>throws:</B></DT><DD>IOException if the index cannot be written</DD></DL>
+ <DL><DT><B>Parameters:</B></DT><DD><code>sourceDirs</code> - the directories to scan for tag libraries</DD><DD><code>outputDir</code> - the directory the index is written beneath</DD><DD><code>parameterNamesRetained</code> - whether the compilation writes parameter names into class files</DD><DD><code>encoding</code> - the source encoding</DD></DL></p>
</li>
</ul>
- <a name="getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)"><!-- --></a>
+ <a name="generate(List, List, java.io.File, boolean, java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public static java.lang.Object <strong>getClosureTagProperty</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="getInvokableTagMethodNames(Class)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public static java.util.Collection<java.lang.String> <strong>getInvokableTagMethodNames</strong>(java.lang.Class<?> tagLibClass)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public static boolean <strong>hasInvokableTagMethod</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map, Closure)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public static java.lang.Object <strong>invokeTagMethod</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName, java.util.Map<?, ?> attrs, groovy.lang.Closure<?> body)</h4>
- <p></p>
+ <h4>public static void <strong>generate</strong>(java.util.List<java.io.File> sourceDirs, java.util.List<java.io.File> resolutionRoots, java.io.File outputDir, boolean parameterNamesRetained, java.lang.String encoding)</h4>
+ <p> Regenerates the index describing every tag library under any of several source directories.
+
+ <p>All of them are described in one pass. Describing them one at a time would mean either
+ erasing the previous directory's descriptors or leaving behind descriptors for tag libraries
+ that have since been renamed or deleted.<DL><DT><B>throws:</B></DT><DD>IOException if the index cannot be written</DD></DL>
+ <DL><DT><B>Parameters:</B></DT><DD><code>sourceDirs</code> - the directories to scan for tag libraries</DD><DD><code>resolutionRoots</code> - the source roots a type this project declares may be resolved from, so
+ that a base class, trait or parameter type it supplies is read rather than guessed</DD><DD><code>outputDir</code> - the directory the index is written beneath</DD><DD><code>parameterNamesRetained</code> - whether the compilation writes parameter names into class files</DD><DD><code>encoding</code> - the source encoding</DD></DL></p>
</li>
</ul>
- <a name="isTagMethodCandidate(java.lang.reflect.Method)"><!-- --></a>
+ <a name="main(java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public static boolean <strong>isTagMethodCandidate</strong>(java.lang.reflect.Method method)</h4>
- <p></p>
+ <h4>public static void <strong>main</strong>(java.lang.String[] args)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>args</code> - the output directory, whether parameter names are retained, the source encoding, how
+ many source directories follow, those directories, and then the source roots a type this
+ project declares may be resolved from</DD></DL></p>
</li>
</ul>
@@ -305,20 +290,20 @@ extends java.lang.Object</pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagMethodInvoker" target="_top">Frames</a></li>
- <li><a href="TagMethodInvoker.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/index/TagLibraryIndexGenerator" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndexGenerator.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html b/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexWriter.html
similarity index 56%
copy from docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
copy to docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexWriter.html
index 64351f4eb29..ada353cd624 100644
--- a/docs/snapshot/api/org/grails/taglib/TagMethodInvoker.html
+++ b/docs/snapshot/api/org/grails/taglib/index/TagLibraryIndexWriter.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>TagMethodInvoker (Grails 8.0.0-SNAPSHOT)</title>
+ <title>TagLibraryIndexWriter (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../stylesheet.css" title="Style">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="TagMethodInvoker (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="TagLibraryIndexWriter (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,20 +51,20 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagMethodInvoker" target="_top">Frames</a></li>
- <li><a href="TagMethodInvoker.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/index/TagLibraryIndexWriter" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndexWriter.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,13 +85,13 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.taglib</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.taglib.index</strong></div>
- <h2 title="[Java] Class TagMethodInvoker" class="title">[Java] Class TagMethodInvoker</h2>
+ <h2 title="[Java] Class TagLibraryIndexWriter" class="title">[Java] Class TagLibraryIndexWriter</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.taglib.TagMethodInvoker
+<li><ul class="inheritance"></ul></li><li>org.grails.taglib.index.TagLibraryIndexWriter
</ul>
<div class="description">
<ul class="blockList">
@@ -101,9 +101,17 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- todo: direct known subclasses -->
<hr>
-<pre>public final class TagMethodInvoker
+<pre>public final class TagLibraryIndexWriter
extends java.lang.Object</pre>
+ <p> Writes the compile-time descriptor for a single tag library.
+
+ <p>Two files are produced per tag library: a descriptor named after the tag library class, and an
+ entry in a shared <CODE>index.properties</CODE> manifest naming it. The manifest exists because a
+ classpath directory cannot be enumerated from inside a jar, so the reader needs the names up front.
+ Both live under <a href='../../../../org/grails/taglib/index/TagLibraryIndex.html#INDEX_LOCATION' title='TagLibraryIndex.INDEX_LOCATION'>TagLibraryIndex.INDEX_LOCATION</a> and merge across jars without a build step.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+
</li>
</ul>
</div>
@@ -144,44 +152,22 @@ extends java.lang.Object</pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.util.Map<java.lang.String, java.lang.reflect.Field></code></td>
- <td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class<?> type)</code><br></td>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.util.Map<java.lang.String, java.util.List<java.lang.reflect.Method>></code></td>
- <td class="colLast"><code><strong><a href="#computeValue(Class)">computeValue</a></strong>(java.lang.Class<?> type)</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)">getClosureTagProperty</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</code><br></td>
+ <td class="colLast"><code>public static void</code></td>
+ <td class="colLast"><code><strong><a href="#clear(java.io.File)">clear</a></strong>(java.io.File outputDirectory)</code><br>Removes any index previously written beneath a directory, so that a regenerated index describes
+ only the tag libraries that exist now. </td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static java.util.Collection<java.lang.String></code></td>
- <td class="colLast"><code><strong><a href="#getInvokableTagMethodNames(Class)">getInvokableTagMethodNames</a></strong>(java.lang.Class<?> tagLibClass)</code><br></td>
+ <td class="colLast"><code>public static void</code></td>
+ <td class="colLast"><code><strong><a href="#write(java.io.File, java.lang.String, java.lang.String, Collection)">write</a></strong>(java.io.File outputDirectory, java.lang.String className, java.lang.String namespace, java.util.Collection<java.lang.String> tagNames)</code><br>Writes the descriptor for a tag library into a compiler output directory.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static boolean</code></td>
- <td class="colLast"><code><strong><a href="#hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)">hasInvokableTagMethod</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</code><br></td>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map, Closure)">invokeTagMethod</a></strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName, java.util.Map<?, ?> attrs, groovy.lang.Closure<?> body)</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>public static boolean</code></td>
- <td class="colLast"><code><strong><a href="#isTagMethodCandidate(java.lang.reflect.Method)">isTagMethodCandidate</a></strong>(java.lang.reflect.Method method)</code><br></td>
+ <td class="colLast"><code>public static void</code></td>
+ <td class="colLast"><code><strong><a href="#writeIncomplete(java.io.File, Collection, boolean)">writeIncomplete</a></strong>(java.io.File outputDirectory, java.util.Collection<java.lang.String> namespaces, boolean everything)</code><br>Records what could not be described, so that a call to a tag of an incompletely described
+ namespace is never reported as a misspelling.</td>
</tr>
</table>
@@ -234,59 +220,34 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
- <a name="computeValue(Class)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>@java.lang.Override<br>protected java.util.Map<java.lang.String, java.lang.reflect.Field> <strong>computeValue</strong>(java.lang.Class<?> type)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="computeValue(Class)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>@java.lang.Override<br>protected java.util.Map<java.lang.String, java.util.List<java.lang.reflect.Method>> <strong>computeValue</strong>(java.lang.Class<?> type)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="getClosureTagProperty(groovy.lang.GroovyObject, java.lang.String)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public static java.lang.Object <strong>getClosureTagProperty</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="getInvokableTagMethodNames(Class)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public static java.util.Collection<java.lang.String> <strong>getInvokableTagMethodNames</strong>(java.lang.Class<?> tagLibClass)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="hasInvokableTagMethod(groovy.lang.GroovyObject, java.lang.String)"><!-- --></a>
+ <a name="clear(java.io.File)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public static boolean <strong>hasInvokableTagMethod</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName)</h4>
- <p></p>
+ <h4>public static void <strong>clear</strong>(java.io.File outputDirectory)</h4>
+ <p> Removes any index previously written beneath a directory, so that a regenerated index describes
+ only the tag libraries that exist now. Without this a renamed or deleted tag library would keep
+ a descriptor, and the manifest naming it, until the build directory was cleaned.<DL><DT><B>throws:</B></DT><DD>IOException if an existing index cannot be removed</DD></DL>
+ <DL><DT><B>Parameters:</B></DT><DD><code>outputDirectory</code> - the directory the index is written beneath</DD></DL></p>
</li>
</ul>
- <a name="invokeTagMethod(groovy.lang.GroovyObject, java.lang.String, Map, Closure)"><!-- --></a>
+ <a name="write(java.io.File, java.lang.String, java.lang.String, Collection)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public static java.lang.Object <strong>invokeTagMethod</strong>(groovy.lang.GroovyObject tagLib, java.lang.String tagName, java.util.Map<?, ?> attrs, groovy.lang.Closure<?> body)</h4>
- <p></p>
+ <h4>public static void <strong>write</strong>(java.io.File outputDirectory, java.lang.String className, java.lang.String namespace, java.util.Collection<java.lang.String> tagNames)</h4>
+ <p> Writes the descriptor for a tag library into a compiler output directory.<DL><DT><B>throws:</B></DT><DD>IOException if the descriptor cannot be written</DD></DL>
+ <DL><DT><B>Parameters:</B></DT><DD><code>outputDirectory</code> - the compilation target directory; nothing is written when <CODE>null</CODE></DD><DD><code>className</code> - the binary name of the tag library</DD><DD><code>namespace</code> - the namespace the tag library declares</DD><DD><code>tagNames</code> - the tag names the tag library declares</DD></DL></p>
</li>
</ul>
- <a name="isTagMethodCandidate(java.lang.reflect.Method)"><!-- --></a>
+ <a name="writeIncomplete(java.io.File, Collection, boolean)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public static boolean <strong>isTagMethodCandidate</strong>(java.lang.reflect.Method method)</h4>
- <p></p>
+ <h4>public static void <strong>writeIncomplete</strong>(java.io.File outputDirectory, java.util.Collection<java.lang.String> namespaces, boolean everything)</h4>
+ <p> Records what could not be described, so that a call to a tag of an incompletely described
+ namespace is never reported as a misspelling.<DL><DT><B>throws:</B></DT><DD>IOException if the record cannot be written</DD></DL>
+ <DL><DT><B>Parameters:</B></DT><DD><code>outputDirectory</code> - the directory the index is written beneath</DD><DD><code>namespaces</code> - the namespaces known to be missing some of their tags</DD><DD><code>everything</code> - true when what was missed could not be attributed to a namespace at all, in
+ which case nothing in the index may be treated as complete</DD></DL></p>
</li>
</ul>
@@ -305,20 +266,20 @@ extends java.lang.Object</pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../index-all.html">Index</a></li>
- <li><a href="../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../index.html?org/grails/taglib/TagMethodInvoker" target="_top">Frames</a></li>
- <li><a href="TagMethodInvoker.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/index/TagLibraryIndexWriter" target="_top">Frames</a></li>
+ <li><a href="TagLibraryIndexWriter.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html b/docs/snapshot/api/org/grails/taglib/index/package-frame.html
similarity index 70%
copy from docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html
copy to docs/snapshot/api/org/grails/taglib/index/package-frame.html
index 95a5d291caa..294cec0f8d7 100644
--- a/docs/snapshot/api/grails/gsp/taglib/compiler/package-frame.html
+++ b/docs/snapshot/api/org/grails/taglib/index/package-frame.html
@@ -21,10 +21,10 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
- <title>grails.gsp.taglib.compiler</title>
+ <title>org.grails.taglib.index</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <meta name="keywords" CONTENT="grails/gsp/taglib/compiler package">
+ <meta name="keywords" CONTENT="org/grails/taglib/index package">
<link href="groovy.ico" type="image/x-icon" rel="shortcut icon">
<link href="groovy.ico" type="image/x-icon" rel="icon">
@@ -33,7 +33,7 @@
<body class="left">
<div class="indexHeader">
- <b><a href="package-summary.html" target="classFrame">grails.gsp.taglib.compiler</a></b>
+ <b><a href="package-summary.html" target="classFrame">org.grails.taglib.index</a></b>
</div>
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="TagLibArtefactTypeAstTransformation.html" title="class in grails.gsp.taglib.compiler" target="classFrame">TagLibArtefactTypeAstTransformation</a></li>
+ <li><a href="TagLibraryIndex.html" title="class in org.grails.taglib.index" target="classFrame">TagLibraryIndex</a></li><li><a href="TagLibraryIndexGenerator.html" title="class in org.grails.taglib.index" target="classFrame">TagLibraryIndexGenerator</a></li><li><a href="TagLibraryIndexWriter.html" title="class in org.grails.taglib.index" target="classFrame">TagLibraryIndexWriter</a></li>
</ul>
</div>
diff --git a/docs/snapshot/api/grails/gsp/taglib/compiler/package-summary.html b/docs/snapshot/api/org/grails/taglib/index/package-summary.html
similarity index 75%
copy from docs/snapshot/api/grails/gsp/taglib/compiler/package-summary.html
copy to docs/snapshot/api/org/grails/taglib/index/package-summary.html
index 850d803c3b7..fdf26cc9bfc 100644
--- a/docs/snapshot/api/grails/gsp/taglib/compiler/package-summary.html
+++ b/docs/snapshot/api/org/grails/taglib/index/package-summary.html
@@ -22,8 +22,8 @@
<html>
<head>
-<title>grails.gsp.taglib.compiler (Grails 8.0.0-SNAPSHOT)</title>
-<meta name="keywords" content="grails.gsp.taglib.compiler package">
+<title>org.grails.taglib.index (Grails 8.0.0-SNAPSHOT)</title>
+<meta name="keywords" content="org.grails.taglib.index package">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" title="Style">
<link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
@@ -31,7 +31,7 @@
<script type="text/javascript">
function windowTitle()
{
- parent.document.title="grails.gsp.taglib.compiler (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="org.grails.taglib.index (Grails 8.0.0-SNAPSHOT)";
}
</script>
<noscript>
@@ -60,7 +60,7 @@ function windowTitle()
<div class="subNav">
<ul class="navList">
- <li><a href="../../../../index.html?grails/gsp/taglib/compiler/package-summary.html" target="_top">Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/taglib/index/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.html" target="_top">No Frames</a></li>
</ul>
</div>
@@ -68,7 +68,7 @@ function windowTitle()
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
- <h1 class="title">Package grails.gsp.taglib.compiler</h1>
+ <h1 class="title">Package org.grails.taglib.index</h1>
</div>
@@ -90,11 +90,27 @@ function windowTitle()
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="TagLibArtefactTypeAstTransformation.html" title="class in grails/gsp/taglib/compiler">
- TagLibArtefactTypeAstTransformation
+ <strong><a href="TagLibraryIndex.html" title="class in org/grails/taglib/index">
+ TagLibraryIndex
</a></strong>
</td>
- <td></td>
+ <td>The set of tag libraries and tag names known at compile time.</td>
+ </tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="TagLibraryIndexGenerator.html" title="class in org/grails/taglib/index">
+ TagLibraryIndexGenerator
+ </a></strong>
+ </td>
+ <td>Writes the tag library index for a source set.</td>
+ </tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="TagLibraryIndexWriter.html" title="class in org/grails/taglib/index">
+ TagLibraryIndexWriter
+ </a></strong>
+ </td>
+ <td>Writes the compile-time descriptor for a single tag library.</td>
</tr>
</tbody>
diff --git a/docs/snapshot/api/org/grails/taglib/package-frame.html b/docs/snapshot/api/org/grails/taglib/package-frame.html
index 706822aede9..ca034b03c8f 100644
--- a/docs/snapshot/api/org/grails/taglib/package-frame.html
+++ b/docs/snapshot/api/org/grails/taglib/package-frame.html
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="AbstractTemplateVariableBinding.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBinding</a></li><li><a href="AbstractTemplateVariableBinding.BindingMapEntry.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBinding.BindingMapEntry</a></li><li><a href="AbstractTemplateVariableBinding.TemplateVariableBindingMap.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBin [...]
+ <li><a href="AbstractTemplateVariableBinding.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBinding</a></li><li><a href="AbstractTemplateVariableBinding.BindingMapEntry.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBinding.BindingMapEntry</a></li><li><a href="AbstractTemplateVariableBinding.TemplateVariableBindingMap.html" title="class in org.grails.taglib" target="classFrame">AbstractTemplateVariableBin [...]
</ul>
</div>
diff --git a/docs/snapshot/api/org/grails/taglib/package-summary.html b/docs/snapshot/api/org/grails/taglib/package-summary.html
index 4d073928ee6..fdf43a9de72 100644
--- a/docs/snapshot/api/org/grails/taglib/package-summary.html
+++ b/docs/snapshot/api/org/grails/taglib/package-summary.html
@@ -112,6 +112,14 @@ function windowTitle()
</td>
<td></td>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="CompiledTagInvocation.html" title="class in org/grails/taglib">
+ CompiledTagInvocation
+ </a></strong>
+ </td>
+ <td>Invokes a tag whose namespace and name are known without going through Groovy's method dispatch.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="GroovyPageAttributes.html" title="class in org/grails/taglib">
@@ -169,7 +177,7 @@ function windowTitle()
TagLibraryMetaUtils
</a></strong>
</td>
- <td></td>
+ <td>Installs tags onto metaclasses.</td>
</tr>
<tr class="altColor">
<td class="colOne">
diff --git a/docs/snapshot/api/overview-frame.html b/docs/snapshot/api/overview-frame.html
index e724ba6668a..547019a6448 100644
--- a/docs/snapshot/api/overview-frame.html
+++ b/docs/snapshot/api/overview-frame.html
@@ -1997,9 +1997,15 @@
<li><a href="org/grails/taglib/package-frame.html"
target="packageFrame">org.grails.taglib</a></li>
+ <li><a href="org/grails/taglib/discovery/package-frame.html"
+ target="packageFrame">org.grails.taglib.discovery</a></li>
+
<li><a href="org/grails/taglib/encoder/package-frame.html"
target="packageFrame">org.grails.taglib.encoder</a></li>
+ <li><a href="org/grails/taglib/index/package-frame.html"
+ target="packageFrame">org.grails.taglib.index</a></li>
+
<li><a href="org/grails/test/io/package-frame.html"
target="packageFrame">org.grails.test.io</a></li>
diff --git a/docs/snapshot/api/overview-summary.html b/docs/snapshot/api/overview-summary.html
index 35c248d8d85..d15189ee51c 100644
--- a/docs/snapshot/api/overview-summary.html
+++ b/docs/snapshot/api/overview-summary.html
@@ -4010,11 +4010,23 @@ if (location.href.indexOf('is-external=true') == -1) {
<tr class="altColor">
+ <td class="colFirst"><a href="org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a></td>
+ <td class="colLast"> </td>
+</tr>
+
+
+<tr class="rowColor">
<td class="colFirst"><a href="org/grails/taglib/encoder/package-summary.html">org.grails.taglib.encoder</a></td>
<td class="colLast"> </td>
</tr>
+<tr class="altColor">
+ <td class="colFirst"><a href="org/grails/taglib/index/package-summary.html">org.grails.taglib.index</a></td>
+ <td class="colLast"> </td>
+</tr>
+
+
<tr class="rowColor">
<td class="colFirst"><a href="org/grails/test/io/package-summary.html">org.grails.test.io</a></td>
<td class="colLast"> </td>
diff --git a/docs/snapshot/api/package-list b/docs/snapshot/api/package-list
index 9595d98bb0c..d6d32bac7ba 100644
--- a/docs/snapshot/api/package-list
+++ b/docs/snapshot/api/package-list
@@ -652,7 +652,9 @@ org.grails.spring.context
org.grails.spring.context.annotation
org.grails.spring.context.support
org.grails.taglib
+org.grails.taglib.discovery
org.grails.taglib.encoder
+org.grails.taglib.index
org.grails.test.io
org.grails.test.spock
org.grails.test.support
diff --git a/docs/snapshot/grails-data/developer-manual/gettingStarted.html b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
index ad01576e89f..86160c84660 100644
--- a/docs/snapshot/grails-data/developer-manual/gettingStarted.html
+++ b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
@@ -523,7 +523,7 @@ cd grails-core</pre>
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/introduction.html b/docs/snapshot/grails-data/developer-manual/introduction.html
index 949ac8c166f..03fb2b823ce 100644
--- a/docs/snapshot/grails-data/developer-manual/introduction.html
+++ b/docs/snapshot/grails-data/developer-manual/introduction.html
@@ -476,7 +476,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/stepByStep.html b/docs/snapshot/grails-data/developer-manual/stepByStep.html
index e6a60431ee3..902c9126d39 100644
--- a/docs/snapshot/grails-data/developer-manual/stepByStep.html
+++ b/docs/snapshot/grails-data/developer-manual/stepByStep.html
@@ -621,7 +621,7 @@ class XyzTestSuite {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/testing.html b/docs/snapshot/grails-data/developer-manual/testing.html
index 05081b21dae..c6c50e98ee4 100644
--- a/docs/snapshot/grails-data/developer-manual/testing.html
+++ b/docs/snapshot/grails-data/developer-manual/testing.html
@@ -511,7 +511,7 @@ class PagedResultSpec extends GormDatastoreSpec{
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi.html b/docs/snapshot/grails-data/developer-manual/understandingApi.html
index 9639e0e3118..45748b3efb1 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi.html
@@ -454,7 +454,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
index bef9f047138..f95968c47e1 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
@@ -561,7 +561,7 @@ protected Session createSession(PropertyResolver connDetails) {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
index 40e9b3239aa..38dc942c6a9 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
@@ -496,7 +496,7 @@ class Neo4jEntityTraitProvider implements GormEntityTraitProvider {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
index bde77ce7746..02707adc076 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
@@ -488,7 +488,7 @@ enhancer.enhance()</code></pre>
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
index 9696139cfd2..4f932bc7c04 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
@@ -673,7 +673,7 @@ protected void deleteEntry(String family, final Object key, final Object entry)
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
index 877734e4a9b..f1a7b0049d6 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
@@ -588,7 +588,7 @@ If, for instance, the underlying datastore does not support the calculation of a
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
index ea9c59b2606..edee03b35c8 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
@@ -526,7 +526,7 @@ If the underlying datastore supports secondary indexes then it is ok to just ret
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/whats-new-manual/index.html b/docs/snapshot/grails-data/whats-new-manual/index.html
index eb09faed8c6..f6fd806fff9 100644
--- a/docs/snapshot/grails-data/whats-new-manual/index.html
+++ b/docs/snapshot/grails-data/whats-new-manual/index.html
@@ -527,7 +527,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-08-21 20:56:54 UTC
+Last updated 2026-08-23 05:24:26 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/guide/index.html b/docs/snapshot/guide/index.html
index 6f6a45d618e..c793d373d4c 100644
--- a/docs/snapshot/guide/index.html
+++ b/docs/snapshot/guide/index.html
@@ -388,9 +388,11 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#namespaces"><strong>8.2.7.5</strong><span>Tag Namespaces</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#usingJSPTagLibraries"><strong>8.2.7.6</strong><span>Using JSP Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#compiledTags"><strong>8.2.7.6</strong><span>Compiled Tag Resolution</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#tagReturnValue"><strong>8.2.7.7</strong><span>Tag return value</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#usingJSPTagLibraries"><strong>8.2.7.7</strong><span>Using JSP Tag Libraries</span></a></div>
+
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#tagReturnValue"><strong>8.2.7.8</strong><span>Tag return value</span></a></div>
<div class="toc-item" style="margin-left:10px"><a href="../guide/theWebLayer.html#fields"><strong>8.3</strong><span>Fields Plugin</span></a></div>
diff --git a/docs/snapshot/guide/introduction.html b/docs/snapshot/guide/introduction.html
index 44f26867507..6eef3fa993d 100644
--- a/docs/snapshot/guide/introduction.html
+++ b/docs/snapshot/guide/introduction.html
@@ -712,6 +712,55 @@ rather than <code>messages.properties</code> — so that two plugins cannot shad
</div>
</div>
</div>
+<div class="sect2">
+<h3 id="_compiled_tag_resolution">Compiled Tag Resolution</h3>
+<div class="paragraph">
+<p>Tag libraries are now described when they are compiled, and that description resolves tag calls in
+pages, tag libraries and controllers compiled afterwards. In a tag library or a controller, a call
+whose namespace and tag are known is compiled into a direct invocation rather than being dispatched
+through the metaclass, and no tag methods are installed onto tag library, page or dispatcher
+metaclasses to make dispatch work:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">BookController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="predefined-type">String</span> markup = g.link(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// compiled into a direct invocation</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The same applies to a call written without a namespace, to calls written inside a closure such as a
+tag body, and to a tag expression in a GSP declaring <code>compileStatic</code>. The tag itself is still selected
+by name when the call runs, so a tag library that overrides another, one registered while the
+application is running, and the order tag libraries are registered in all behave exactly as before. A
+namespace no compiled tag library declares, and a name something else in scope answers to, are left to
+dispatch as they did.</p>
+</div>
+<div class="paragraph">
+<p>A tag that no compiled tag library declares is left to resolve at runtime with nothing reported, since
+a namespace can legitimately hold tag libraries carrying no description. An application whose tag
+libraries are all described can ask for an error instead:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ strictTags = <span class="predefined-constant">true</span>
+ dynamicTagNamespaces = [<span class="string"><span class="delimiter">'</span><span class="content">legacy</span><span class="delimiter">'</span></span>] <span class="comment">// registered while the application runs</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Defining a tag as a <code>Closure</code> field remains supported but is deprecated and now warns at compile time:
+a closure carries no signature, so nothing about a call to such a tag can be checked. Define tags as
+methods taking <code>Map attrs</code> and, where a body is needed, <code>Closure body</code>. See
+<a href="theWebLayer.html#compiledTags">Compiled Tag Resolution</a>.</p>
+</div>
+</div>
<h2 id="dependencyUpgrades">1.1.1 Updated Dependencies</h2>
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index b07b5014c3e..9c0dd1e3b8a 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -388,9 +388,11 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="toc-item" style="margin-left:30px"><a href="#namespaces"><strong>8.2.7.5</strong><span>Tag Namespaces</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#usingJSPTagLibraries"><strong>8.2.7.6</strong><span>Using JSP Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#compiledTags"><strong>8.2.7.6</strong><span>Compiled Tag Resolution</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#tagReturnValue"><strong>8.2.7.7</strong><span>Tag return value</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#usingJSPTagLibraries"><strong>8.2.7.7</strong><span>Using JSP Tag Libraries</span></a></div>
+
+ <div class="toc-item" style="margin-left:30px"><a href="#tagReturnValue"><strong>8.2.7.8</strong><span>Tag return value</span></a></div>
<div class="toc-item" style="margin-left:10px"><a href="#fields"><strong>8.3</strong><span>Fields Plugin</span></a></div>
@@ -1321,6 +1323,55 @@ rather than <code>messages.properties</code> — so that two plugins cannot shad
</div>
</div>
</div>
+<div class="sect2">
+<h3 id="_compiled_tag_resolution">Compiled Tag Resolution</h3>
+<div class="paragraph">
+<p>Tag libraries are now described when they are compiled, and that description resolves tag calls in
+pages, tag libraries and controllers compiled afterwards. In a tag library or a controller, a call
+whose namespace and tag are known is compiled into a direct invocation rather than being dispatched
+through the metaclass, and no tag methods are installed onto tag library, page or dispatcher
+metaclasses to make dispatch work:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">BookController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="predefined-type">String</span> markup = g.link(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// compiled into a direct invocation</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The same applies to a call written without a namespace, to calls written inside a closure such as a
+tag body, and to a tag expression in a GSP declaring <code>compileStatic</code>. The tag itself is still selected
+by name when the call runs, so a tag library that overrides another, one registered while the
+application is running, and the order tag libraries are registered in all behave exactly as before. A
+namespace no compiled tag library declares, and a name something else in scope answers to, are left to
+dispatch as they did.</p>
+</div>
+<div class="paragraph">
+<p>A tag that no compiled tag library declares is left to resolve at runtime with nothing reported, since
+a namespace can legitimately hold tag libraries carrying no description. An application whose tag
+libraries are all described can ask for an error instead:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ strictTags = <span class="predefined-constant">true</span>
+ dynamicTagNamespaces = [<span class="string"><span class="delimiter">'</span><span class="content">legacy</span><span class="delimiter">'</span></span>] <span class="comment">// registered while the application runs</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Defining a tag as a <code>Closure</code> field remains supported but is deprecated and now warns at compile time:
+a closure carries no signature, so nothing about a call to such a tag can be checked. Define tags as
+methods taking <code>Map attrs</code> and, where a body is needed, <code>Closure body</code>. See
+<a href="theWebLayer.html#compiledTags">Compiled Tag Resolution</a>.</p>
+</div>
+</div>
<h2 id="dependencyUpgrades">1.1.1 Updated Dependencies</h2>
@@ -6555,6 +6606,202 @@ normally; it is simply never reload-checked, which was already the case for view
jar.</p>
</div>
</div>
+<div class="sect3">
+<h4 id="_50_tag_libraries_are_described_when_compiled">50. Tag Libraries Are Described When Compiled</h4>
+<div class="paragraph">
+<p>Tag calls are resolved against a description each tag library contributes as it is compiled, and a
+resolved call is compiled into a direct invocation. The tag itself is still selected by name when the
+call runs, through the same lookup dynamic dispatch uses, so a tag library that overrides another and
+the order tag libraries are registered in behave as before. A call into a namespace no compiled tag
+library declares — a tag library from a plugin built against an earlier version of Grails, or one
+registered while the application runs — is left to dispatch exactly as it did.</p>
+</div>
+<div class="paragraph">
+<p>Three things are worth knowing when upgrading.</p>
+</div>
+<div class="paragraph">
+<p>A tag that no compiled tag library declares is left to resolve at runtime, and nothing is reported.
+Setting <code>grails { compileStatic { strictTags = true } }</code> makes it a compilation error instead, which
+is worth doing once to find misspelled tags, but is not the default because a namespace can
+legitimately hold tag libraries that carry no description. Where an application registers tag
+libraries while it runs, name their namespaces in
+<code>grails { compileStatic { dynamicTagNamespaces = […​] } }</code> so that they are never checked.</p>
+</div>
+<div class="paragraph">
+<p>Strict checking applies only where the source says a call is a tag: one naming its namespace, and one
+written as markup. A call written without a namespace is never checked, and a namespaced expression in
+a page is checked only when that page declares <code>compileStatic</code>.</p>
+</div>
+<div class="paragraph">
+<p>A call written without a namespace is not compiled at all unless the build asks for it with
+<code>grails { compileStatic { unqualifiedTagCalls = true } }</code>. Whether a bare name is a tag depends on what
+else answers to it, and not all of that is visible when compiling — a method Groovy gives every object,
+a delegate an enclosing closure is handed, an overload the tag library also declares — so by default
+such a call is dispatched exactly as it was before this release.</p>
+</div>
+<div class="paragraph">
+<p>Where it is turned on, a call written without a namespace reaches a tag only when nothing nearer
+answers to the name: not a method of the class, not one it inherits, not a field, property or local,
+not a method Groovy provides, and not a name inside a closure, whose delegate is only known when it
+runs. A method added to a controller or tag library <strong>while the application runs</strong>, through a plugin’s
+<code>doWithDynamicMethods</code>, is not visible when the calling code is compiled, so a call that used to reach
+such a method and shares its name with a tag would reach the tag instead. Declare the method on the
+class, name the namespace in <code>dynamicTagNamespaces</code>, or call the tag with its namespace.</p>
+</div>
+<div class="paragraph">
+<p>Naming a namespace in <code>dynamicTagNamespaces</code> turns rewriting off for it entirely, not just the
+reporting: calls into it are dispatched exactly as they were before this release. That is the escape
+hatch for a namespace whose tags are decided while the application runs.</p>
+</div>
+<div class="paragraph">
+<p>Tags defined as closures now warn at compile time. They still work and are called the same way, but a
+closure carries no signature, so nothing about a call to such a tag can be checked. This covers the
+<code>def</code> form as well as the explicitly typed one, and the <code>def</code> form is the one most tag libraries are
+written in:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// Before - both forms warn</span>
+<span class="keyword">def</span> hello = { attrs ->
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Hello </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}
+
+Closure goodbye = { <span class="predefined-type">Map</span> attrs ->
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Goodbye </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}
+
+<span class="comment">// After</span>
+<span class="keyword">def</span> <span class="function">hello</span>(<span class="predefined-type">Map</span> attrs) {
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Hello </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}
+
+<span class="keyword">def</span> <span class="function">goodbye</span>(<span class="predefined-type">Map</span> attrs) {
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Goodbye </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A tag taking a body becomes a method with a second <code>Closure body</code> parameter:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// Before</span>
+<span class="keyword">def</span> wrapped = { attrs, body ->
+ out << <span class="string"><span class="delimiter">'</span><span class="content"><div></span><span class="delimiter">'</span></span> << body() << <span class="string"><span class="delimiter">'</span><span class="content"></div></span><span class="delimiter">'</span></span>
+}
+
+<span class="comment">// After</span>
+<span class="keyword">def</span> <span class="function">wrapped</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
+ out << <span class="string"><span class="delimiter">'</span><span class="content"><div></span><span class="delimiter">'</span></span> << body() << <span class="string"><span class="delimiter">'</span><span class="content"></div></span><span class="delimiter">'</span></span>
+}</code></pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_tags_are_no_longer_installed_onto_metaclasses">Tags Are No Longer Installed Onto Metaclasses</h5>
+<div class="paragraph">
+<p>Dispatching a tag no longer works by installing a method for every tag, and a property for every
+namespace, onto the metaclass of every tag library, controller and page. Tags are resolved through the
+tag library lookup instead. Calling a tag — from a page, a tag library or a controller, with or
+without its namespace — is unaffected.</p>
+</div>
+<div class="paragraph">
+<p>What changes is code that inspected the metaclass to find tags. A check such as</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">tagLib.metaClass.respondsTo(tagLib, <span class="string"><span class="delimiter">'</span><span class="content">someTag</span><span class="delimiter">'</span></span>)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>answered <code>true</code> before because the tag had been installed there, and now answers <code>false</code>. Call the tag,
+or consult the tag library lookup, instead of asking the metaclass what it holds.</p>
+</div>
+<div class="paragraph">
+<p>The methods that performed the installation are deprecated or removed:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 40%;">
+<col style="width: 60%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Member</th>
+<th class="tableblock halign-left valign-top">Replacement</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>NamespacedTagDispatcher.initializeMetaClass()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Removed. Nothing needs to be initialised.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>NamespacedTagDispatcher.registerTagMetaMethods(ExpandoMetaClass)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Removed.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>TemplateNamespacedTagDispatcher.registerTagMetaMethods(ExpandoMetaClass)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Removed.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>GroovyPagesMetaUtils.registerMethodMissingForGSP(…​)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Retained but does nothing. A page now declares <code>methodMissing</code> itself.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>TagLibraryMetaUtils.enhanceTagLibMetaClass</code>, <code>registerTagMetaMethods</code>, <code>registerMethodMissingForTags</code>, <code>registerNamespaceMetaProperties</code>, <code>registerPropertyMissingForTag</code>, <code>addTagLibMethodToMetaClass</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Deprecated. Unit test support still uses them so that a tag method can be called directly on a tag library under test.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p><code>TagLibraryMetaUtils.methodMissingForTagLib</code> is not deprecated — it is the dynamic dispatch path a call
+into an undescribed namespace still takes.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_a_method_declared_tag_called_without_a_namespace_returns_its_output">A Method-Declared Tag Called Without a Namespace Returns Its Output</h5>
+<div class="paragraph">
+<p>A class that can call tags but is not a tag library — a controller — reaches a tag written without a
+namespace through <code>methodMissing</code> on the <code>TagLibraryInvoker</code> trait. That used to end in a direct call
+on the tag library bean. For a tag declared as a closure this made no difference, because the call
+landed on a generated wrapper that captured output anyway; for one declared as a method there was no
+wrapper, so the method ran with nothing captured and its own return value came back.</p>
+</div>
+<div class="paragraph">
+<p>Both forms now capture, so a method-declared tag returns what it wrote:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">ReportTagLib</span> {
+ <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">g</span><span class="delimiter">'</span></span>
+
+ <span class="keyword">def</span> <span class="function">summary</span>(<span class="predefined-type">Map</span> attrs) {
+ out << <span class="string"><span class="delimiter">'</span><span class="content">the output</span><span class="delimiter">'</span></span>
+ <span class="string"><span class="delimiter">'</span><span class="content">the return value</span><span class="delimiter">'</span></span> <i class="conum" data-value="1"></i><b>(1)</b>
+ }
+}
+
+<span class="type">class</span> <span class="class">ReportController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="predefined-type">String</span> result = summary(<span class="key">id</span>: <span class="integer">1</span>) <span class="comment">// 'the output', previously 'the return value'</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>a tag’s return value is not what a caller receives; what it writes is</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>A tag called <strong>with</strong> its namespace, and any tag called from a GSP, already captured, so only an
+unqualified call from a controller to a method-declared tag changes.</p>
+</div>
+</div>
+</div>
</div>
@@ -22614,8 +22861,360 @@ Note the usage of the parenthesis around the variable name. If you omit these Gr
<p>This works from GSP, controllers or tag libraries</p>
</div>
+
+<h2 id="compiledTags">8.2.7.6 Compiled Tag Resolution</h2>
+
+<div class='contribute-btn'>
+ <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/compiledTags.adoc"'>
+ <i class='fa fa-pencil-square-o'></i> Improve this doc
+ </button>
+</div>
+
+
+<div class="paragraph">
+<p>Tag libraries are described when they are compiled, and that description is used to resolve tag calls
+in pages, tag libraries and controllers compiled afterwards.</p>
+</div>
+<div class="sect3">
+<h4 id="_defining_tags_as_methods">Defining tags as methods</h4>
+<div class="paragraph">
+<p>Define a tag as a method:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">GreetingTagLib</span> {
+
+ <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">greet</span><span class="delimiter">'</span></span>
+
+ <span class="keyword">def</span> <span class="function">hello</span>(<span class="predefined-type">Map</span> attrs) {
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Hello </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+ }
+
+ <span class="keyword">def</span> <span class="function">wrapped</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
+ out << <span class="string"><span class="delimiter">'</span><span class="content"><div></span><span class="delimiter">'</span></span> << body() << <span class="string"><span class="delimiter">'</span><span class="content"></div></span><span class="delimiter">'</span></span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The attributes parameter must be a <code>Map</code> named <code>attrs</code>, and the body parameter a <code>Closure</code> named
+<code>body</code>. A method taking anything else is an ordinary method of the tag library rather than a tag.
+Where that convention does not suit, <code>@Tag</code> marks a method as a tag whatever its signature and
+<code>@NotATag</code> excludes one that would otherwise match.</p>
+</div>
+<div class="paragraph">
+<p>The older form, a <code>Closure</code> field, still works:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// Deprecated</span>
+Closure hello = { <span class="predefined-type">Map</span> attrs ->
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Hello </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A tag declared this way is described and called like any other — the tag is selected by name when the
+call runs, and a closure answers to a name as readily as a method does. The form remains deprecated
+because a closure carries no signature, so nothing about the call can be checked, and because a
+closure field is inherited where a tag method is not, which makes what a tag library declares harder
+to read. Compiling a tag library that declares one produces a warning naming the tag.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_calling_tags">Calling tags</h4>
+<div class="paragraph">
+<p>In a tag library or a controller, a call to a tag whose namespace and name are known is compiled into
+a direct invocation rather than being dispatched through the metaclass:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">BookController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="predefined-type">String</span> markup = g.createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// compiled into a direct invocation</span>
+ <span class="predefined-type">String</span> other = greet.hello(<span class="key">name</span>: <span class="string"><span class="delimiter">'</span><span class="content">Grails</span><span class="delimiter">'</span></span>) <span class="comment">// likewise</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The attributes and body are passed straight through where the call says what they are. Where it does
+not — attributes assembled at runtime, or a single value the tag reads under its own name — the
+arguments are forwarded as written and sorted out by the same rules dynamic dispatch applies:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="predefined-type">Map</span> attrs = buildAttributes()
+g.createLink(attrs) <span class="comment">// still compiled into an invocation</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The tag is always selected by name when the call runs, through the same lookup dynamic dispatch uses.
+A tag library that overrides another, one registered while the application is running, and the order
+tag libraries are registered in all decide the outcome exactly as they did before. Nothing is bound to
+a particular tag library class, so a tag declared by more than one of them is compiled the same way.</p>
+</div>
+<div class="paragraph">
+<p>A call into a namespace no compiled tag library declares is left alone, which is what allows a tag
+library registered while an application is running to keep working.</p>
+</div>
+<div class="paragraph">
+<p>A controller declared by convention, under <code>grails-app/controllers</code>, has its tag calls compiled. One
+declared by annotation outside that directory does not:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// src/main/groovy/demo/ReportController.groovy</span>
+<span class="annotation">@Artefact</span>(<span class="string"><span class="delimiter">'</span><span class="content">Controller</span><span class="delimiter">'</span></span>)
+<span class="type">class</span> <span class="class">ReportController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ g.createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// dispatched dynamically</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The ability to call tags reaches such a class from the <code>@Artefact</code> annotation, which is applied later
+in the compilation than the rewriting runs, so the rewriting cannot see that the class calls tags. The
+call behaves exactly as it did before this release; it simply does not take the faster path. Moving
+the class under <code>grails-app/controllers</code> gets it compiled.</p>
+</div>
+<div class="paragraph">
+<p>A name that something else in scope already answers to is not a namespace. A local variable, a
+parameter or a property called <code>g</code> is that thing, and a call on it is left alone:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="keyword">def</span> g = someClient
+ g.createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// someClient.createLink, not the tag</span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A call written without a namespace is not compiled unless the build asks for it. Whether a bare name
+is a tag depends on what else answers to it, and not all of that is visible when compiling: a method
+Groovy gives every object, a delegate an enclosing closure is handed when it runs, an overload the tag
+library also declares. Such a call is dispatched as it always was:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">BookController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="predefined-type">String</span> markup = createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// dispatched dynamically</span>
+ <span class="predefined-type">String</span> other = g.createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// compiled into an invocation</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A project whose tag names are known not to collide can compile those calls too:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ unqualifiedTagCalls = <span class="predefined-constant">true</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Turning it on widens which calls are considered, not which names may be captured: a name that Groovy,
+a local, a field, a parameter or the calling class answers to is still left alone.</p>
+</div>
+<div class="paragraph">
+<p>A call that names its namespace is compiled wherever it appears, including inside a closure. The
+namespace itself is a name a closure’s delegate could in principle answer to, and that is not checked
+— the guard above applies to the tag name, not to the namespace in front of it. No delegate in
+ordinary use answers to a namespace name, so a call written as <code>g.createLink(…​)</code> reaches the tag as
+written; a DSL whose delegate did answer to <code>g</code> would be the exception.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_tags_in_pages">Tags in pages</h4>
+<div class="paragraph">
+<p>A page resolves a name against the model it was rendered with before it reaches a tag library, and
+that model is not known when the page is compiled. A page therefore keeps resolving its tags as it
+always has, unless it declares <code>compileStatic</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="html"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span>
+${g.createLink(controller: 'book')} <span class="error"><</span>%-- compiled into a direct invocation --%<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Declaring <code>compileStatic</code> on a page reserves the namespace names for tag libraries: a model attribute
+called <code>g</code> no longer shadows the <code>g</code> namespace there. Without it, an expression is dispatched exactly
+as before. Set <code>grails.views.gsp.compileStatic</code> in configuration to apply it to every page.</p>
+</div>
+<div class="paragraph">
+<p>Two things hold in a page either way. A call written without a namespace, as
+<code>${createLink(controller: 'book')}</code> is, is always left to resolve against the binding. And a name the
+page puts into its own binding is that variable rather than a namespace:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="html"><span class="tag"><g:set</span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">g</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">${someObject}</span><span class="delimiter">"</span></span><span class="tag">/></span>
+${g.createLink(controller: 'book')} <span class="error"><</span>%-- someObject.createLink, not the tag --%<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A tag written as markup, as <code><g:createLink controller="book"/></code> is, already compiles into a direct
+call naming the tag and needs no rewriting. It is unambiguously a tag whatever the page does, so under
+strict checking it is checked in every page. An expression is checked only where it is resolved, in a
+page declaring <code>compileStatic</code>, since elsewhere the receiver may be part of the model.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_reporting_unknown_tags">Reporting unknown tags</h4>
+<div class="paragraph">
+<p>By default nothing is reported: a tag that no compiled tag library declares is left to resolve at
+runtime, exactly as it did before. A namespace can hold tag libraries that were not compiled with a
+description — a plugin built against an earlier version of Grails contributes tags to <code>g</code> without one,
+and a tag library registered at runtime contributes more — so a tag missing from the description is
+not necessarily a misspelling, and reporting one by default would mean complaining about correct code.</p>
+</div>
+<div class="paragraph">
+<p>An application whose tag libraries are all described can ask for an error instead:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ strictTags = <span class="predefined-constant">true</span>
+ dynamicTagNamespaces = [<span class="string"><span class="delimiter">'</span><span class="content">legacy</span><span class="delimiter">'</span></span>] <i class="conum" data-value="1"></i><b>(1)</b>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>namespaces genuinely filled in while the application runs</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>Strict checking applies where the source says a call is a tag: one naming its namespace, as
+<code>g.message(code: 'x')</code> does, and one written as markup, as <code><g:message/></code> is. A call written without a
+namespace is never checked — such a name may equally be a method contributed while the application
+runs, and in a page it may come from the model. A namespaced expression in a page is checked only when
+that page declares <code>compileStatic</code>, for the same reason its calls are only rewritten there.</p>
+</div>
+<div class="paragraph">
+<p><code>dynamicTagNamespaces</code> names the namespaces whose tags are decided while the application runs rather
+than described when it is compiled. It turns compile-time resolution off for them completely: a call
+into such a namespace is never rewritten, never reported, and is dispatched exactly as it was before
+this release, whether or not a compiled tag library also declares the namespace. Declare a namespace
+here when a tag library is registered at runtime, or when the tags in it are contributed by
+metaprogramming.</p>
+</div>
+<div class="paragraph">
+<p>Both settings are read from the build, not from a system property, so changing either recompiles what
+depends on it.</p>
+</div>
+<div class="sect4">
+<h5 id="_what_strict_checking_covers">What strict checking covers</h5>
+<div class="paragraph">
+<p>Strict checking applies to the namespaces this project’s own tag libraries declare. Those are the only
+namespaces whose contents are knowable when compiling: a tag missing from one of them is a misspelling,
+because nothing else contributes to it.</p>
+</div>
+<div class="paragraph">
+<p>Every other namespace is left alone, <code>g</code> included. A plugin built against an earlier version of Grails
+contributes tags to <code>g</code> with no description, as does one that declares its tag libraries by convention
+without applying the GSP Gradle plugin, and a tag library registered while the application runs
+contributes more. A tag missing from such a namespace is as likely to be one of those as a mistake, so
+reporting it would fail a build over correct code.</p>
+</div>
+<div class="paragraph">
+<p>So <code>strictTags</code> catches a misspelling of your own tags, in your own namespaces, and never complains
+about a plugin’s. Nothing has to be listed in <code>dynamicTagNamespaces</code> to get that — it remains for the
+narrower case of a namespace <strong>this project</strong> declares but fills in while the application runs.</p>
+</div>
+<div class="paragraph">
+<p>An index generated from source before compilation also records what it could not describe, and no tag
+in a namespace it failed to read completely is reported either.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_where_the_description_lives">Where the description lives</h4>
+<div class="paragraph">
+<p>Each tag library contributes one file under <code>META-INF/grails/taglibs</code> in the artifact it is packaged
+in. Descriptions from every jar on the classpath are combined, so a plugin’s tag libraries are
+resolvable by an application that depends on it without any extra build configuration.</p>
+</div>
+<div class="paragraph">
+<p>Under the Grails Gradle plugin the description is written twice, because the two things that read it
+need different guarantees.</p>
+</div>
+<div class="paragraph">
+<p><code>generateTagLibraryIndex</code> runs before compilation and reads the sources under <code>grails-app/taglib</code>, so
+tags an application declares are resolvable in the same compilation that defines them. Being read from
+source it cannot describe everything: a tag library referring to a type written in Java, or generated
+by the build, is left out. What it missed is recorded, and nothing in a namespace it could not fully
+describe is ever reported as an unknown tag, so strict checking cannot fail a build over a tag that
+does exist. This index is used only to compile this project, and is never packaged.</p>
+</div>
+<div class="paragraph">
+<p><code>packageTagLibraryIndex</code> runs after compilation, with the project’s own classes on its classpath,
+where every tag library resolves whatever language its collaborators were written in. That index is
+the authoritative one: pages are compiled against it, it travels with the artifact, and a project
+depending on this one reads it. Every run replaces the directory, so a tag library that is renamed or
+deleted disappears from it.</p>
+</div>
+<div class="paragraph">
+<p>A project keeping tag libraries elsewhere adds those directories once, by task type, so that both
+indexes describe the same set — configuring them separately would let the index this project compiles
+against differ from the one it publishes:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">org.grails.gradle.plugin.views.gsp.GenerateTagLibraryIndexTask</span>
+
+tasks.withType(GenerateTagLibraryIndexTask).configureEach {
+ sourceDirectories.from(file(<span class="string"><span class="delimiter">'</span><span class="content">src/main/groovy</span><span class="delimiter">'</span></span>))
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Before compilation, a tag library referring to something the same project declares — a service it
+injects, a base class it extends, a trait it carries — is described too, by reading that Groovy source
+alongside it, so an inherited namespace, a tag a trait contributes and an attributes parameter of a
+project-declared type are all read rather than guessed. A tag library naming a type that does not
+exist is left out, as it would be by the compiler.</p>
+</div>
+<div class="paragraph">
+<p>Where no build writes the index — a plain Groovy compilation, or one that does not apply the Grails
+Gradle plugin — a tag library annotated <code>@TagLib</code> describes itself as it is compiled instead, which
+makes it resolvable to anything compiled after it.</p>
+</div>
+<div class="paragraph">
+<p>That fallback reaches annotated tag libraries only. A tag library declared by convention, as an
+unannotated class under <code>grails-app/taglib</code>, is recognised as an artefact too late in the compilation
+for it to describe itself, so without the Gradle plugin it contributes no description. Nothing breaks:
+a tag with no description is dispatched dynamically, exactly as it was before any of this existed. But
+a plugin that declares its tag libraries by convention and does not apply the Grails GSP Gradle plugin
+publishes no descriptors, and its tags are resolved at runtime in applications that depend on it.
+Annotate those tag libraries with <code>@TagLib</code>, or apply the plugin, to have them described.</p>
+</div>
+<div class="paragraph">
+<p>A descriptor written this way is also never removed. Renaming or deleting a tag library leaves its
+description behind until the build directory is cleaned, and a description naming a class that no
+longer exists puts tags into the index that nothing will answer to. Builds using the Gradle plugin do
+not have this problem: the task rewrites the index from the sources each time it runs.</p>
+</div>
+</div>
+
<a name="7.3.6 Using JSP Tag Libraries"><!-- Legacy link --></a>
-<h2 id="usingJSPTagLibraries">8.2.7.6 Using JSP Tag Libraries</h2>
+<h2 id="usingJSPTagLibraries">8.2.7.7 Using JSP Tag Libraries</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/usingJSPTagLibraries.adoc"'>
@@ -22693,7 +23292,7 @@ This is configured with the <code>grails.gsp.tldScanPattern</code> setting. It a
</div>
<a name="7.3.7 Tag return value"><!-- Legacy link --></a>
-<h2 id="tagReturnValue">8.2.7.7 Tag return value</h2>
+<h2 id="tagReturnValue">8.2.7.8 Tag return value</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/tagReturnValue.adoc"'>
diff --git a/docs/snapshot/guide/theWebLayer.html b/docs/snapshot/guide/theWebLayer.html
index 9979f62f475..6d5b53e0e2a 100644
--- a/docs/snapshot/guide/theWebLayer.html
+++ b/docs/snapshot/guide/theWebLayer.html
@@ -299,10 +299,13 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="toc-item" style="margin-left:20px"><a href="#namespaces"><strong>8.2.7.5</strong><span>Tag Namespaces</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#usingJSPTagLibraries"><strong>8.2.7.6</strong><span>Using JSP Tag Libraries</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#compiledTags"><strong>8.2.7.6</strong><span>Compiled Tag Resolution</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#tagReturnValue"><strong>8.2.7.7</strong><span>Tag return value</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#usingJSPTagLibraries"><strong>8.2.7.7</strong><span>Using JSP Tag Libraries</span></a>
+ </div>
+
+ <div class="toc-item" style="margin-left:20px"><a href="#tagReturnValue"><strong>8.2.7.8</strong><span>Tag return value</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#fields"><strong>8.3</strong><span>Fields Plugin</span></a>
@@ -5258,8 +5261,360 @@ Note the usage of the parenthesis around the variable name. If you omit these Gr
<p>This works from GSP, controllers or tag libraries</p>
</div>
+
+<h2 id="compiledTags">8.2.7.6 Compiled Tag Resolution</h2>
+
+<div class='contribute-btn'>
+ <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/compiledTags.adoc"'>
+ <i class='fa fa-pencil-square-o'></i> Improve this doc
+ </button>
+</div>
+
+
+<div class="paragraph">
+<p>Tag libraries are described when they are compiled, and that description is used to resolve tag calls
+in pages, tag libraries and controllers compiled afterwards.</p>
+</div>
+<div class="sect3">
+<h4 id="_defining_tags_as_methods">Defining tags as methods</h4>
+<div class="paragraph">
+<p>Define a tag as a method:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">GreetingTagLib</span> {
+
+ <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">greet</span><span class="delimiter">'</span></span>
+
+ <span class="keyword">def</span> <span class="function">hello</span>(<span class="predefined-type">Map</span> attrs) {
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Hello </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+ }
+
+ <span class="keyword">def</span> <span class="function">wrapped</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
+ out << <span class="string"><span class="delimiter">'</span><span class="content"><div></span><span class="delimiter">'</span></span> << body() << <span class="string"><span class="delimiter">'</span><span class="content"></div></span><span class="delimiter">'</span></span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The attributes parameter must be a <code>Map</code> named <code>attrs</code>, and the body parameter a <code>Closure</code> named
+<code>body</code>. A method taking anything else is an ordinary method of the tag library rather than a tag.
+Where that convention does not suit, <code>@Tag</code> marks a method as a tag whatever its signature and
+<code>@NotATag</code> excludes one that would otherwise match.</p>
+</div>
+<div class="paragraph">
+<p>The older form, a <code>Closure</code> field, still works:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// Deprecated</span>
+Closure hello = { <span class="predefined-type">Map</span> attrs ->
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Hello </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A tag declared this way is described and called like any other — the tag is selected by name when the
+call runs, and a closure answers to a name as readily as a method does. The form remains deprecated
+because a closure carries no signature, so nothing about the call can be checked, and because a
+closure field is inherited where a tag method is not, which makes what a tag library declares harder
+to read. Compiling a tag library that declares one produces a warning naming the tag.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_calling_tags">Calling tags</h4>
+<div class="paragraph">
+<p>In a tag library or a controller, a call to a tag whose namespace and name are known is compiled into
+a direct invocation rather than being dispatched through the metaclass:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">BookController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="predefined-type">String</span> markup = g.createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// compiled into a direct invocation</span>
+ <span class="predefined-type">String</span> other = greet.hello(<span class="key">name</span>: <span class="string"><span class="delimiter">'</span><span class="content">Grails</span><span class="delimiter">'</span></span>) <span class="comment">// likewise</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The attributes and body are passed straight through where the call says what they are. Where it does
+not — attributes assembled at runtime, or a single value the tag reads under its own name — the
+arguments are forwarded as written and sorted out by the same rules dynamic dispatch applies:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="predefined-type">Map</span> attrs = buildAttributes()
+g.createLink(attrs) <span class="comment">// still compiled into an invocation</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The tag is always selected by name when the call runs, through the same lookup dynamic dispatch uses.
+A tag library that overrides another, one registered while the application is running, and the order
+tag libraries are registered in all decide the outcome exactly as they did before. Nothing is bound to
+a particular tag library class, so a tag declared by more than one of them is compiled the same way.</p>
+</div>
+<div class="paragraph">
+<p>A call into a namespace no compiled tag library declares is left alone, which is what allows a tag
+library registered while an application is running to keep working.</p>
+</div>
+<div class="paragraph">
+<p>A controller declared by convention, under <code>grails-app/controllers</code>, has its tag calls compiled. One
+declared by annotation outside that directory does not:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// src/main/groovy/demo/ReportController.groovy</span>
+<span class="annotation">@Artefact</span>(<span class="string"><span class="delimiter">'</span><span class="content">Controller</span><span class="delimiter">'</span></span>)
+<span class="type">class</span> <span class="class">ReportController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ g.createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// dispatched dynamically</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The ability to call tags reaches such a class from the <code>@Artefact</code> annotation, which is applied later
+in the compilation than the rewriting runs, so the rewriting cannot see that the class calls tags. The
+call behaves exactly as it did before this release; it simply does not take the faster path. Moving
+the class under <code>grails-app/controllers</code> gets it compiled.</p>
+</div>
+<div class="paragraph">
+<p>A name that something else in scope already answers to is not a namespace. A local variable, a
+parameter or a property called <code>g</code> is that thing, and a call on it is left alone:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="keyword">def</span> g = someClient
+ g.createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// someClient.createLink, not the tag</span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A call written without a namespace is not compiled unless the build asks for it. Whether a bare name
+is a tag depends on what else answers to it, and not all of that is visible when compiling: a method
+Groovy gives every object, a delegate an enclosing closure is handed when it runs, an overload the tag
+library also declares. Such a call is dispatched as it always was:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">BookController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="predefined-type">String</span> markup = createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// dispatched dynamically</span>
+ <span class="predefined-type">String</span> other = g.createLink(<span class="key">controller</span>: <span class="string"><span class="delimiter">'</span><span class="content">book</span><span class="delimiter">'</span></span>) <span class="comment">// compiled into an invocation</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A project whose tag names are known not to collide can compile those calls too:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ unqualifiedTagCalls = <span class="predefined-constant">true</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Turning it on widens which calls are considered, not which names may be captured: a name that Groovy,
+a local, a field, a parameter or the calling class answers to is still left alone.</p>
+</div>
+<div class="paragraph">
+<p>A call that names its namespace is compiled wherever it appears, including inside a closure. The
+namespace itself is a name a closure’s delegate could in principle answer to, and that is not checked
+— the guard above applies to the tag name, not to the namespace in front of it. No delegate in
+ordinary use answers to a namespace name, so a call written as <code>g.createLink(…​)</code> reaches the tag as
+written; a DSL whose delegate did answer to <code>g</code> would be the exception.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_tags_in_pages">Tags in pages</h4>
+<div class="paragraph">
+<p>A page resolves a name against the model it was rendered with before it reaches a tag library, and
+that model is not known when the page is compiled. A page therefore keeps resolving its tags as it
+always has, unless it declares <code>compileStatic</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="html"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span>
+${g.createLink(controller: 'book')} <span class="error"><</span>%-- compiled into a direct invocation --%<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Declaring <code>compileStatic</code> on a page reserves the namespace names for tag libraries: a model attribute
+called <code>g</code> no longer shadows the <code>g</code> namespace there. Without it, an expression is dispatched exactly
+as before. Set <code>grails.views.gsp.compileStatic</code> in configuration to apply it to every page.</p>
+</div>
+<div class="paragraph">
+<p>Two things hold in a page either way. A call written without a namespace, as
+<code>${createLink(controller: 'book')}</code> is, is always left to resolve against the binding. And a name the
+page puts into its own binding is that variable rather than a namespace:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="html"><span class="tag"><g:set</span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">g</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">${someObject}</span><span class="delimiter">"</span></span><span class="tag">/></span>
+${g.createLink(controller: 'book')} <span class="error"><</span>%-- someObject.createLink, not the tag --%<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A tag written as markup, as <code><g:createLink controller="book"/></code> is, already compiles into a direct
+call naming the tag and needs no rewriting. It is unambiguously a tag whatever the page does, so under
+strict checking it is checked in every page. An expression is checked only where it is resolved, in a
+page declaring <code>compileStatic</code>, since elsewhere the receiver may be part of the model.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_reporting_unknown_tags">Reporting unknown tags</h4>
+<div class="paragraph">
+<p>By default nothing is reported: a tag that no compiled tag library declares is left to resolve at
+runtime, exactly as it did before. A namespace can hold tag libraries that were not compiled with a
+description — a plugin built against an earlier version of Grails contributes tags to <code>g</code> without one,
+and a tag library registered at runtime contributes more — so a tag missing from the description is
+not necessarily a misspelling, and reporting one by default would mean complaining about correct code.</p>
+</div>
+<div class="paragraph">
+<p>An application whose tag libraries are all described can ask for an error instead:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ strictTags = <span class="predefined-constant">true</span>
+ dynamicTagNamespaces = [<span class="string"><span class="delimiter">'</span><span class="content">legacy</span><span class="delimiter">'</span></span>] <i class="conum" data-value="1"></i><b>(1)</b>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>namespaces genuinely filled in while the application runs</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>Strict checking applies where the source says a call is a tag: one naming its namespace, as
+<code>g.message(code: 'x')</code> does, and one written as markup, as <code><g:message/></code> is. A call written without a
+namespace is never checked — such a name may equally be a method contributed while the application
+runs, and in a page it may come from the model. A namespaced expression in a page is checked only when
+that page declares <code>compileStatic</code>, for the same reason its calls are only rewritten there.</p>
+</div>
+<div class="paragraph">
+<p><code>dynamicTagNamespaces</code> names the namespaces whose tags are decided while the application runs rather
+than described when it is compiled. It turns compile-time resolution off for them completely: a call
+into such a namespace is never rewritten, never reported, and is dispatched exactly as it was before
+this release, whether or not a compiled tag library also declares the namespace. Declare a namespace
+here when a tag library is registered at runtime, or when the tags in it are contributed by
+metaprogramming.</p>
+</div>
+<div class="paragraph">
+<p>Both settings are read from the build, not from a system property, so changing either recompiles what
+depends on it.</p>
+</div>
+<div class="sect4">
+<h5 id="_what_strict_checking_covers">What strict checking covers</h5>
+<div class="paragraph">
+<p>Strict checking applies to the namespaces this project’s own tag libraries declare. Those are the only
+namespaces whose contents are knowable when compiling: a tag missing from one of them is a misspelling,
+because nothing else contributes to it.</p>
+</div>
+<div class="paragraph">
+<p>Every other namespace is left alone, <code>g</code> included. A plugin built against an earlier version of Grails
+contributes tags to <code>g</code> with no description, as does one that declares its tag libraries by convention
+without applying the GSP Gradle plugin, and a tag library registered while the application runs
+contributes more. A tag missing from such a namespace is as likely to be one of those as a mistake, so
+reporting it would fail a build over correct code.</p>
+</div>
+<div class="paragraph">
+<p>So <code>strictTags</code> catches a misspelling of your own tags, in your own namespaces, and never complains
+about a plugin’s. Nothing has to be listed in <code>dynamicTagNamespaces</code> to get that — it remains for the
+narrower case of a namespace <strong>this project</strong> declares but fills in while the application runs.</p>
+</div>
+<div class="paragraph">
+<p>An index generated from source before compilation also records what it could not describe, and no tag
+in a namespace it failed to read completely is reported either.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_where_the_description_lives">Where the description lives</h4>
+<div class="paragraph">
+<p>Each tag library contributes one file under <code>META-INF/grails/taglibs</code> in the artifact it is packaged
+in. Descriptions from every jar on the classpath are combined, so a plugin’s tag libraries are
+resolvable by an application that depends on it without any extra build configuration.</p>
+</div>
+<div class="paragraph">
+<p>Under the Grails Gradle plugin the description is written twice, because the two things that read it
+need different guarantees.</p>
+</div>
+<div class="paragraph">
+<p><code>generateTagLibraryIndex</code> runs before compilation and reads the sources under <code>grails-app/taglib</code>, so
+tags an application declares are resolvable in the same compilation that defines them. Being read from
+source it cannot describe everything: a tag library referring to a type written in Java, or generated
+by the build, is left out. What it missed is recorded, and nothing in a namespace it could not fully
+describe is ever reported as an unknown tag, so strict checking cannot fail a build over a tag that
+does exist. This index is used only to compile this project, and is never packaged.</p>
+</div>
+<div class="paragraph">
+<p><code>packageTagLibraryIndex</code> runs after compilation, with the project’s own classes on its classpath,
+where every tag library resolves whatever language its collaborators were written in. That index is
+the authoritative one: pages are compiled against it, it travels with the artifact, and a project
+depending on this one reads it. Every run replaces the directory, so a tag library that is renamed or
+deleted disappears from it.</p>
+</div>
+<div class="paragraph">
+<p>A project keeping tag libraries elsewhere adds those directories once, by task type, so that both
+indexes describe the same set — configuring them separately would let the index this project compiles
+against differ from the one it publishes:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">org.grails.gradle.plugin.views.gsp.GenerateTagLibraryIndexTask</span>
+
+tasks.withType(GenerateTagLibraryIndexTask).configureEach {
+ sourceDirectories.from(file(<span class="string"><span class="delimiter">'</span><span class="content">src/main/groovy</span><span class="delimiter">'</span></span>))
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Before compilation, a tag library referring to something the same project declares — a service it
+injects, a base class it extends, a trait it carries — is described too, by reading that Groovy source
+alongside it, so an inherited namespace, a tag a trait contributes and an attributes parameter of a
+project-declared type are all read rather than guessed. A tag library naming a type that does not
+exist is left out, as it would be by the compiler.</p>
+</div>
+<div class="paragraph">
+<p>Where no build writes the index — a plain Groovy compilation, or one that does not apply the Grails
+Gradle plugin — a tag library annotated <code>@TagLib</code> describes itself as it is compiled instead, which
+makes it resolvable to anything compiled after it.</p>
+</div>
+<div class="paragraph">
+<p>That fallback reaches annotated tag libraries only. A tag library declared by convention, as an
+unannotated class under <code>grails-app/taglib</code>, is recognised as an artefact too late in the compilation
+for it to describe itself, so without the Gradle plugin it contributes no description. Nothing breaks:
+a tag with no description is dispatched dynamically, exactly as it was before any of this existed. But
+a plugin that declares its tag libraries by convention and does not apply the Grails GSP Gradle plugin
+publishes no descriptors, and its tags are resolved at runtime in applications that depend on it.
+Annotate those tag libraries with <code>@TagLib</code>, or apply the plugin, to have them described.</p>
+</div>
+<div class="paragraph">
+<p>A descriptor written this way is also never removed. Renaming or deleting a tag library leaves its
+description behind until the build directory is cleaned, and a description naming a class that no
+longer exists puts tags into the index that nothing will answer to. Builds using the Gradle plugin do
+not have this problem: the task rewrites the index from the sources each time it runs.</p>
+</div>
+</div>
+
<a name="7.3.6 Using JSP Tag Libraries"><!-- Legacy link --></a>
-<h2 id="usingJSPTagLibraries">8.2.7.6 Using JSP Tag Libraries</h2>
+<h2 id="usingJSPTagLibraries">8.2.7.7 Using JSP Tag Libraries</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/usingJSPTagLibraries.adoc"'>
@@ -5337,7 +5692,7 @@ This is configured with the <code>grails.gsp.tldScanPattern</code> setting. It a
</div>
<a name="7.3.7 Tag return value"><!-- Legacy link --></a>
-<h2 id="tagReturnValue">8.2.7.7 Tag return value</h2>
+<h2 id="tagReturnValue">8.2.7.8 Tag return value</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/tagReturnValue.adoc"'>
diff --git a/docs/snapshot/guide/upgrading.html b/docs/snapshot/guide/upgrading.html
index b73ef5a3564..e67f9db1589 100644
--- a/docs/snapshot/guide/upgrading.html
+++ b/docs/snapshot/guide/upgrading.html
@@ -4040,6 +4040,202 @@ normally; it is simply never reload-checked, which was already the case for view
jar.</p>
</div>
</div>
+<div class="sect3">
+<h4 id="_50_tag_libraries_are_described_when_compiled">50. Tag Libraries Are Described When Compiled</h4>
+<div class="paragraph">
+<p>Tag calls are resolved against a description each tag library contributes as it is compiled, and a
+resolved call is compiled into a direct invocation. The tag itself is still selected by name when the
+call runs, through the same lookup dynamic dispatch uses, so a tag library that overrides another and
+the order tag libraries are registered in behave as before. A call into a namespace no compiled tag
+library declares — a tag library from a plugin built against an earlier version of Grails, or one
+registered while the application runs — is left to dispatch exactly as it did.</p>
+</div>
+<div class="paragraph">
+<p>Three things are worth knowing when upgrading.</p>
+</div>
+<div class="paragraph">
+<p>A tag that no compiled tag library declares is left to resolve at runtime, and nothing is reported.
+Setting <code>grails { compileStatic { strictTags = true } }</code> makes it a compilation error instead, which
+is worth doing once to find misspelled tags, but is not the default because a namespace can
+legitimately hold tag libraries that carry no description. Where an application registers tag
+libraries while it runs, name their namespaces in
+<code>grails { compileStatic { dynamicTagNamespaces = […​] } }</code> so that they are never checked.</p>
+</div>
+<div class="paragraph">
+<p>Strict checking applies only where the source says a call is a tag: one naming its namespace, and one
+written as markup. A call written without a namespace is never checked, and a namespaced expression in
+a page is checked only when that page declares <code>compileStatic</code>.</p>
+</div>
+<div class="paragraph">
+<p>A call written without a namespace is not compiled at all unless the build asks for it with
+<code>grails { compileStatic { unqualifiedTagCalls = true } }</code>. Whether a bare name is a tag depends on what
+else answers to it, and not all of that is visible when compiling — a method Groovy gives every object,
+a delegate an enclosing closure is handed, an overload the tag library also declares — so by default
+such a call is dispatched exactly as it was before this release.</p>
+</div>
+<div class="paragraph">
+<p>Where it is turned on, a call written without a namespace reaches a tag only when nothing nearer
+answers to the name: not a method of the class, not one it inherits, not a field, property or local,
+not a method Groovy provides, and not a name inside a closure, whose delegate is only known when it
+runs. A method added to a controller or tag library <strong>while the application runs</strong>, through a plugin’s
+<code>doWithDynamicMethods</code>, is not visible when the calling code is compiled, so a call that used to reach
+such a method and shares its name with a tag would reach the tag instead. Declare the method on the
+class, name the namespace in <code>dynamicTagNamespaces</code>, or call the tag with its namespace.</p>
+</div>
+<div class="paragraph">
+<p>Naming a namespace in <code>dynamicTagNamespaces</code> turns rewriting off for it entirely, not just the
+reporting: calls into it are dispatched exactly as they were before this release. That is the escape
+hatch for a namespace whose tags are decided while the application runs.</p>
+</div>
+<div class="paragraph">
+<p>Tags defined as closures now warn at compile time. They still work and are called the same way, but a
+closure carries no signature, so nothing about a call to such a tag can be checked. This covers the
+<code>def</code> form as well as the explicitly typed one, and the <code>def</code> form is the one most tag libraries are
+written in:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// Before - both forms warn</span>
+<span class="keyword">def</span> hello = { attrs ->
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Hello </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}
+
+Closure goodbye = { <span class="predefined-type">Map</span> attrs ->
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Goodbye </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}
+
+<span class="comment">// After</span>
+<span class="keyword">def</span> <span class="function">hello</span>(<span class="predefined-type">Map</span> attrs) {
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Hello </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}
+
+<span class="keyword">def</span> <span class="function">goodbye</span>(<span class="predefined-type">Map</span> attrs) {
+ out << <span class="string"><span class="delimiter">"</span><span class="content">Goodbye </span><span class="inline"><span class="inline-delimiter">${</span>attrs.name<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A tag taking a body becomes a method with a second <code>Closure body</code> parameter:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="comment">// Before</span>
+<span class="keyword">def</span> wrapped = { attrs, body ->
+ out << <span class="string"><span class="delimiter">'</span><span class="content"><div></span><span class="delimiter">'</span></span> << body() << <span class="string"><span class="delimiter">'</span><span class="content"></div></span><span class="delimiter">'</span></span>
+}
+
+<span class="comment">// After</span>
+<span class="keyword">def</span> <span class="function">wrapped</span>(<span class="predefined-type">Map</span> attrs, Closure body) {
+ out << <span class="string"><span class="delimiter">'</span><span class="content"><div></span><span class="delimiter">'</span></span> << body() << <span class="string"><span class="delimiter">'</span><span class="content"></div></span><span class="delimiter">'</span></span>
+}</code></pre>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_tags_are_no_longer_installed_onto_metaclasses">Tags Are No Longer Installed Onto Metaclasses</h5>
+<div class="paragraph">
+<p>Dispatching a tag no longer works by installing a method for every tag, and a property for every
+namespace, onto the metaclass of every tag library, controller and page. Tags are resolved through the
+tag library lookup instead. Calling a tag — from a page, a tag library or a controller, with or
+without its namespace — is unaffected.</p>
+</div>
+<div class="paragraph">
+<p>What changes is code that inspected the metaclass to find tags. A check such as</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">tagLib.metaClass.respondsTo(tagLib, <span class="string"><span class="delimiter">'</span><span class="content">someTag</span><span class="delimiter">'</span></span>)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>answered <code>true</code> before because the tag had been installed there, and now answers <code>false</code>. Call the tag,
+or consult the tag library lookup, instead of asking the metaclass what it holds.</p>
+</div>
+<div class="paragraph">
+<p>The methods that performed the installation are deprecated or removed:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 40%;">
+<col style="width: 60%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Member</th>
+<th class="tableblock halign-left valign-top">Replacement</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>NamespacedTagDispatcher.initializeMetaClass()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Removed. Nothing needs to be initialised.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>NamespacedTagDispatcher.registerTagMetaMethods(ExpandoMetaClass)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Removed.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>TemplateNamespacedTagDispatcher.registerTagMetaMethods(ExpandoMetaClass)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Removed.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>GroovyPagesMetaUtils.registerMethodMissingForGSP(…​)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Retained but does nothing. A page now declares <code>methodMissing</code> itself.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>TagLibraryMetaUtils.enhanceTagLibMetaClass</code>, <code>registerTagMetaMethods</code>, <code>registerMethodMissingForTags</code>, <code>registerNamespaceMetaProperties</code>, <code>registerPropertyMissingForTag</code>, <code>addTagLibMethodToMetaClass</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Deprecated. Unit test support still uses them so that a tag method can be called directly on a tag library under test.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p><code>TagLibraryMetaUtils.methodMissingForTagLib</code> is not deprecated — it is the dynamic dispatch path a call
+into an undescribed namespace still takes.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_a_method_declared_tag_called_without_a_namespace_returns_its_output">A Method-Declared Tag Called Without a Namespace Returns Its Output</h5>
+<div class="paragraph">
+<p>A class that can call tags but is not a tag library — a controller — reaches a tag written without a
+namespace through <code>methodMissing</code> on the <code>TagLibraryInvoker</code> trait. That used to end in a direct call
+on the tag library bean. For a tag declared as a closure this made no difference, because the call
+landed on a generated wrapper that captured output anyway; for one declared as a method there was no
+wrapper, so the method ran with nothing captured and its own return value came back.</p>
+</div>
+<div class="paragraph">
+<p>Both forms now capture, so a method-declared tag returns what it wrote:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">ReportTagLib</span> {
+ <span class="directive">static</span> namespace = <span class="string"><span class="delimiter">'</span><span class="content">g</span><span class="delimiter">'</span></span>
+
+ <span class="keyword">def</span> <span class="function">summary</span>(<span class="predefined-type">Map</span> attrs) {
+ out << <span class="string"><span class="delimiter">'</span><span class="content">the output</span><span class="delimiter">'</span></span>
+ <span class="string"><span class="delimiter">'</span><span class="content">the return value</span><span class="delimiter">'</span></span> <i class="conum" data-value="1"></i><b>(1)</b>
+ }
+}
+
+<span class="type">class</span> <span class="class">ReportController</span> {
+ <span class="keyword">def</span> <span class="function">index</span>() {
+ <span class="predefined-type">String</span> result = summary(<span class="key">id</span>: <span class="integer">1</span>) <span class="comment">// 'the output', previously 'the return value'</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="colist arabic">
+<table>
+<tr>
+<td><i class="conum" data-value="1"></i><b>1</b></td>
+<td>a tag’s return value is not what a caller receives; what it writes is</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>A tag called <strong>with</strong> its namespace, and any tag called from a GSP, already captured, so only an
+unqualified call from a controller to a method-declared tag changes.</p>
+</div>
+</div>
+</div>
</div>
diff --git a/docs/snapshot/index.html b/docs/snapshot/index.html
index 6ae95f73e85..b80a24bcb96 100644
--- a/docs/snapshot/index.html
+++ b/docs/snapshot/index.html
@@ -388,9 +388,11 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#namespaces"><strong>8.2.7.5</strong><span>Tag Namespaces</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#usingJSPTagLibraries"><strong>8.2.7.6</strong><span>Using JSP Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#compiledTags"><strong>8.2.7.6</strong><span>Compiled Tag Resolution</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#tagReturnValue"><strong>8.2.7.7</strong><span>Tag return value</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#usingJSPTagLibraries"><strong>8.2.7.7</strong><span>Using JSP Tag Libraries</span></a></div>
+
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#tagReturnValue"><strong>8.2.7.8</strong><span>Tag return value</span></a></div>
<div class="toc-item" style="margin-left:10px"><a href="./guide/theWebLayer.html#fields"><strong>8.3</strong><span>Fields Plugin</span></a></div>