KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jruby > ast > ArgsNode


1 /***** BEGIN LICENSE BLOCK *****
2  * Version: CPL 1.0/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Common Public
5  * License Version 1.0 (the "License"); you may not use this file
6  * except in compliance with the License. You may obtain a copy of
7  * the License at http://www.eclipse.org/legal/cpl-v10.html
8  *
9  * Software distributed under the License is distributed on an "AS
10  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * rights and limitations under the License.
13  *
14  * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com>
15  * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr>
16  * Copyright (C) 2001-2002 Jan Arne Petersen <jpetersen@uni-bonn.de>
17  * Copyright (C) 2002 Anders Bengtsson <ndrsbngtssn@yahoo.se>
18  * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org>
19  *
20  * Alternatively, the contents of this file may be used under the terms of
21  * either of the GNU General Public License Version 2 or later (the "GPL"),
22  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
23  * in which case the provisions of the GPL or the LGPL are applicable instead
24  * of those above. If you wish to allow use of your version of this file only
25  * under the terms of either the GPL or the LGPL, and not to allow others to
26  * use your version of this file under the terms of the CPL, indicate your
27  * decision by deleting the provisions above and replace them with the notice
28  * and other provisions required by the GPL or the LGPL. If you do not delete
29  * the provisions above, a recipient may use your version of this file under
30  * the terms of any one of the CPL, the GPL or the LGPL.
31  ***** END LICENSE BLOCK *****/

32 package org.jruby.ast;
33
34 import java.util.List JavaDoc;
35
36 import org.jruby.ast.visitor.NodeVisitor;
37 import org.jruby.evaluator.Instruction;
38 import org.jruby.lexer.yacc.ISourcePosition;
39 import org.jruby.runtime.Arity;
40
41 /**
42  * arguments for a function.
43  * this is used both in the function definition
44  * and in actual function calls
45  * <ul>
46  * <li>
47  * u1 ==&gt; optNode (BlockNode) Optional argument description
48  * </li>
49  * <li>
50  * u2 ==&gt; rest (int) index of the rest argument (the array arg with a * in front
51  * </li>
52  * <li>
53  * u3 ==&gt; count (int) number of arguments
54  * </li>
55  * </ul>
56  *
57  * @author jpetersen
58  */

59 public class ArgsNode extends Node {
60     static final long serialVersionUID = 3709437716296564785L;
61
62     private final ListNode arguments;
63     private final ListNode optArgs;
64     private final int restArg;
65     private final BlockArgNode blockArgNode;
66     private final Arity arity;
67
68     /**
69      *
70      * @param optionalArguments Node describing the optional arguments
71      * This Block will contain assignments to locals (LAsgnNode)
72      * @param restArguments index of the rest argument in the local table
73      * (the array argument prefixed by a * which collects
74      * all additional params)
75      * or -1 if there is none.
76      * @param argsCount number of regular arguments
77      * @param blockArgNode An optional block argument (&amp;arg).
78      **/

79     public ArgsNode(ISourcePosition position, ListNode arguments, ListNode optionalArguments,
80             int restArguments, BlockArgNode blockArgNode) {
81         super(position, NodeTypes.ARGSNODE);
82
83         this.arguments = arguments;
84         this.optArgs = optionalArguments;
85         this.restArg = restArguments;
86         this.blockArgNode = blockArgNode;
87         
88         if (getRestArg() == -2) {
89             arity = Arity.optional();
90         } else if (getOptArgs() != null || getRestArg() >= 0) {
91             arity = Arity.required(getArgsCount());
92         } else {
93             arity = Arity.createArity(getArgsCount());
94         }
95     }
96     
97     /**
98      * Accept for the visitor pattern.
99      * @param iVisitor the visitor
100      **/

101     public Instruction accept(NodeVisitor iVisitor) {
102         return iVisitor.visitArgsNode(this);
103     }
104
105     /**
106      * Gets main arguments (as Tokens)
107      */

108     public ListNode getArgs() {
109         return arguments;
110     }
111
112     public Arity getArity() {
113         return arity;
114     }
115     
116     public int getArgsCount() {
117         return arguments == null ? 0 : arguments.size();
118     }
119
120     /**
121      * Gets the optArgs.
122      * @return Returns a ListNode
123      */

124     public ListNode getOptArgs() {
125         return optArgs;
126     }
127
128     /**
129      * Gets the restArg.
130      * @return Returns a int
131      */

132     public int getRestArg() {
133         return restArg;
134     }
135
136     /**
137      * Gets the blockArgNode.
138      * @return Returns a BlockArgNode
139      */

140     public BlockArgNode getBlockArgNode() {
141         return blockArgNode;
142     }
143     
144     public List JavaDoc childNodes() {
145         return Node.createList(arguments, optArgs, blockArgNode);
146     }
147
148 }
149
Popular Tags