1 package net.sourceforge.pmd.lang.vm.directive; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 /** 23 * This class acts as a proxy for potential macros. When the AST is built 24 * this class is inserted as a placeholder for the macro (whether or not 25 * the macro is actually defined). At render time we check whether there is 26 * a implementation for the macro call. If an implementation cannot be 27 * found the literal text is rendered. 28 * @since 1.6 29 */ 30 public class RuntimeMacro extends Directive 31 { 32 /** 33 * Name of the macro 34 */ 35 private String macroName; 36 37 /** 38 * Create a RuntimeMacro instance. Macro name and source 39 * template stored for later use. 40 * 41 * @param macroName name of the macro 42 */ 43 public RuntimeMacro(String macroName) 44 { 45 if (macroName == null) 46 { 47 throw new IllegalArgumentException("Null arguments"); 48 } 49 50 this.macroName = macroName.intern(); 51 } 52 53 /** 54 * Return name of this Velocimacro. 55 * 56 * @return The name of this Velocimacro. 57 */ 58 public String getName() 59 { 60 return macroName; 61 } 62 63 /** 64 * Override to always return "macro". We don't want to use 65 * the macro name here, since when writing VTL that uses the 66 * scope, we are within a #macro call. The macro name will instead 67 * be used as the scope name when defining the body of a BlockMacro. 68 */ 69 public String getScopeName() 70 { 71 return "macro"; 72 } 73 74 /** 75 * Velocimacros are always LINE 76 * type directives. 77 * 78 * @return The type of this directive. 79 */ 80 public int getType() 81 { 82 return LINE; 83 } 84 85 }