public class CompiledTagCallRewriter extends org.codehaus.groovy.ast.ClassCodeExpressionTransformer
Rewrites a call to a known tag into a direct invocation.
Writing g.message(code: 'x') reaches the tag library through propertyMissing to
find the namespace and invokeMethod 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.
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.
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.
| Constructor and description |
|---|
CompiledTagCallRewriter(org.codehaus.groovy.control.SourceUnit sourceUnit, TagLibraryIndex index, org.codehaus.groovy.ast.ClassNode classNode) |
| Type Params | Return Type | Name and description |
|---|---|---|
|
public int |
getRewrittenCount()
|
|
protected org.codehaus.groovy.control.SourceUnit |
getSourceUnit() |
|
public void |
rewrite() |
|
public org.codehaus.groovy.ast.expr.Expression |
transform(org.codehaus.groovy.ast.expr.Expression expression) |
| Methods inherited from class | Name |
|---|---|
class org.codehaus.groovy.ast.ClassCodeExpressionTransformer |
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.ClassCodeExpressionTransformer#notifyAll(), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#toString(), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#transform(org.codehaus.groovy.ast.expr.Expression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visit(org.codehaus.groovy.ast.expr.Expression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visit(org.codehaus.groovy.ast.stmt.Statement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitAnnotations(org.codehaus.groovy.ast.AnnotatedNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitArgumentlistExpression(org.codehaus.groovy.ast.expr.ArgumentListExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitArrayExpression(org.codehaus.groovy.ast.expr.ArrayExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitAssertStatement(org.codehaus.groovy.ast.stmt.AssertStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitAttributeExpression(org.codehaus.groovy.ast.expr.AttributeExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitBinaryExpression(org.codehaus.groovy.ast.expr.BinaryExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitBitwiseNegationExpression(org.codehaus.groovy.ast.expr.BitwiseNegationExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitBlockStatement(org.codehaus.groovy.ast.stmt.BlockStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitBooleanExpression(org.codehaus.groovy.ast.expr.BooleanExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitBreakStatement(org.codehaus.groovy.ast.stmt.BreakStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitBytecodeExpression(org.codehaus.groovy.classgen.BytecodeExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitCaseStatement(org.codehaus.groovy.ast.stmt.CaseStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitCastExpression(org.codehaus.groovy.ast.expr.CastExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitCatchStatement(org.codehaus.groovy.ast.stmt.CatchStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitClass(org.codehaus.groovy.ast.ClassNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitClassExpression(org.codehaus.groovy.ast.expr.ClassExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitClosureExpression(org.codehaus.groovy.ast.expr.ClosureExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitClosureListExpression(org.codehaus.groovy.ast.expr.ClosureListExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitConstantExpression(org.codehaus.groovy.ast.expr.ConstantExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitConstructor(org.codehaus.groovy.ast.ConstructorNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitConstructorCallExpression(org.codehaus.groovy.ast.expr.ConstructorCallExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitContinueStatement(org.codehaus.groovy.ast.stmt.ContinueStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitDeclarationExpression(org.codehaus.groovy.ast.expr.DeclarationExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitDoWhileLoop(org.codehaus.groovy.ast.stmt.DoWhileStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitEmptyExpression(org.codehaus.groovy.ast.expr.EmptyExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitEmptyStatement(org.codehaus.groovy.ast.stmt.EmptyStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitExpressionStatement(org.codehaus.groovy.ast.stmt.ExpressionStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitField(org.codehaus.groovy.ast.FieldNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitFieldExpression(org.codehaus.groovy.ast.expr.FieldExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitForLoop(org.codehaus.groovy.ast.stmt.ForStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitGStringExpression(org.codehaus.groovy.ast.expr.GStringExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitIfElse(org.codehaus.groovy.ast.stmt.IfStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitImports(org.codehaus.groovy.ast.ModuleNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitLambdaExpression(org.codehaus.groovy.ast.expr.LambdaExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitListExpression(org.codehaus.groovy.ast.expr.ListExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitListOfExpressions(java.util.List), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitMapEntryExpression(org.codehaus.groovy.ast.expr.MapEntryExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitMapExpression(org.codehaus.groovy.ast.expr.MapExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitMethod(org.codehaus.groovy.ast.MethodNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitMethodCallExpression(org.codehaus.groovy.ast.expr.MethodCallExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitMethodPointerExpression(org.codehaus.groovy.ast.expr.MethodPointerExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitMethodReferenceExpression(org.codehaus.groovy.ast.expr.MethodReferenceExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitNotExpression(org.codehaus.groovy.ast.expr.NotExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitPackage(org.codehaus.groovy.ast.PackageNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitPostfixExpression(org.codehaus.groovy.ast.expr.PostfixExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitPrefixExpression(org.codehaus.groovy.ast.expr.PrefixExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitProperty(org.codehaus.groovy.ast.PropertyNode), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitPropertyExpression(org.codehaus.groovy.ast.expr.PropertyExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitRangeExpression(org.codehaus.groovy.ast.expr.RangeExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitReturnStatement(org.codehaus.groovy.ast.stmt.ReturnStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitShortTernaryExpression(org.codehaus.groovy.ast.expr.ElvisOperatorExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitSpreadExpression(org.codehaus.groovy.ast.expr.SpreadExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitSpreadMapExpression(org.codehaus.groovy.ast.expr.SpreadMapExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitStaticMethodCallExpression(org.codehaus.groovy.ast.expr.StaticMethodCallExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitSwitch(org.codehaus.groovy.ast.stmt.SwitchStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitSynchronizedStatement(org.codehaus.groovy.ast.stmt.SynchronizedStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitTernaryExpression(org.codehaus.groovy.ast.expr.TernaryExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitThrowStatement(org.codehaus.groovy.ast.stmt.ThrowStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitTryCatchFinally(org.codehaus.groovy.ast.stmt.TryCatchStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitTupleExpression(org.codehaus.groovy.ast.expr.TupleExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitUnaryMinusExpression(org.codehaus.groovy.ast.expr.UnaryMinusExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitUnaryPlusExpression(org.codehaus.groovy.ast.expr.UnaryPlusExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitVariableExpression(org.codehaus.groovy.ast.expr.VariableExpression), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#visitWhileLoop(org.codehaus.groovy.ast.stmt.WhileStatement), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#wait(), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#wait(long), org.codehaus.groovy.ast.ClassCodeExpressionTransformer#wait(long, int) |