@Override public RubyNode visitArgsNode(org.jruby.ast.ArgsNode node) { argsNode = node; final SourceSection sourceSection = translate(node.getPosition()); final List<RubyNode> sequence = new ArrayList<>(); int localIndex = 0; if (node.getPre() != null) { state = State.PRE; for (org.jruby.ast.Node arg : node.getPre().childNodes()) { sequence.add(arg.accept(this)); index = ++localIndex; } } if (node.getOptArgs() != null) { // (BlockNode 0, (OptArgNode:a 0, (LocalAsgnNode:a 0, (FixnumNode 0))), ...) state = State.OPT; for (org.jruby.ast.Node arg : node.getOptArgs().childNodes()) { sequence.add(arg.accept(this)); index = ++localIndex; } } if (node.getPost() != null) { state = State.POST; for (org.jruby.ast.Node arg : node.getPost().childNodes()) { sequence.add(arg.accept(this)); index = ++localIndex; } } if (node.getRestArgNode() != null) { methodBodyTranslator.getEnvironment().hasRestParameter = true; sequence.add(node.getRestArgNode().accept(this)); } if (node.getBlock() != null) { sequence.add(node.getBlock().accept(this)); } return SequenceNode.sequence(context, sourceSection, sequence); }
@JRubyMethod(name = "parameters", compat = CompatVersion.RUBY1_9) public IRubyObject parameters(ThreadContext context) { Ruby runtime = context.getRuntime(); RubyArray parms = RubyArray.newEmptyArray(runtime); ArgsNode args; if (!(this.getBlock().getBody() instanceof Interpreted19Block)) { return parms; } // argument names are easily accessible from interpreter RubyArray elem = RubyArray.newEmptyArray(runtime); args = ((Interpreted19Block) this.getBlock().getBody()).getArgs(); // required parameters List<Node> children = new ArrayList(); if (args.getPreCount() > 0) children.addAll(args.getPre().childNodes()); if (args.getPostCount() > 0) children.addAll(args.getPost().childNodes()); Iterator iter = children.iterator(); while (iter.hasNext()) { Node node = (Node) iter.next(); elem = RubyArray.newEmptyArray(runtime); elem.add(RubySymbol.newSymbol(runtime, this.isLambda() ? "req" : "opt")); if (node instanceof ArgumentNode) { elem.add(RubySymbol.newSymbol(runtime, ((ArgumentNode) node).getName())); } parms.add(elem); } // optional parameters if (args.getOptArgs() != null) { children = args.getOptArgs().childNodes(); if (!children.isEmpty()) { iter = children.iterator(); while (iter.hasNext()) { Node node = (Node) iter.next(); elem = RubyArray.newEmptyArray(runtime); elem.add(RubySymbol.newSymbol(runtime, "opt")); if (node instanceof OptArgNode) { elem.add(RubySymbol.newSymbol(runtime, ((OptArgNode) node).getName())); } parms.add(elem); } } } ArgumentNode rest = args.getRestArgNode(); if (rest != null) { elem = RubyArray.newEmptyArray(runtime); elem.add(RubySymbol.newSymbol(runtime, "rest")); elem.add(RubySymbol.newSymbol(runtime, rest.getName())); parms.add(elem); } BlockArgNode blockArg = args.getBlock(); if (blockArg != null) { elem = RubyArray.newEmptyArray(runtime); elem.add(RubySymbol.newSymbol(runtime, "block")); elem.add(RubySymbol.newSymbol(runtime, blockArg.getName())); parms.add(elem); } return parms; }