-
Notifications
You must be signed in to change notification settings - Fork 226
Expand file tree
/
Copy pathArgListCompiler.java
More file actions
108 lines (95 loc) · 3.53 KB
/
ArgListCompiler.java
File metadata and controls
108 lines (95 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Copyright (c) Corporation for National Research Initiatives
package org.python.compiler;
import java.util.ArrayList;
import java.util.List;
import org.python.antlr.ParseException;
import org.python.antlr.Visitor;
import org.python.antlr.ast.Assign;
import org.python.antlr.ast.Name;
import org.python.antlr.ast.Suite;
import org.python.antlr.ast.Tuple;
import org.python.antlr.ast.arguments;
import org.python.antlr.ast.expr_contextType;
import org.python.antlr.base.expr;
import org.python.antlr.base.stmt;
public class ArgListCompiler extends Visitor
{
public boolean arglist, keywordlist;
public List<expr> defaults;
public List<String> names;
public List<String> fpnames;
public List<stmt> init_code;
public ArgListCompiler() {
arglist = keywordlist = false;
defaults = null;
names = new ArrayList<String>();
fpnames = new ArrayList<String>();
init_code = new ArrayList<stmt>();
}
public void reset() {
arglist = keywordlist = false;
defaults = null;
names.clear();
init_code.clear();
}
public void appendInitCode(Suite node) {
node.getInternalBody().addAll(0, init_code);
}
public List<expr> getDefaults() {
return defaults;
}
public void visitArgs(arguments args) throws Exception {
for (int i = 0; i < args.getInternalArgs().size(); i++) {
String name = (String) visit(args.getInternalArgs().get(i));
names.add(name);
if (args.getInternalArgs().get(i) instanceof Tuple) {
List<expr> targets = new ArrayList<expr>();
targets.add(args.getInternalArgs().get(i));
Assign ass = new Assign(args.getInternalArgs().get(i),
targets,
new Name(args.getInternalArgs().get(i), name, expr_contextType.Load));
init_code.add(ass);
}
}
if (args.getInternalVararg() != null) {
arglist = true;
names.add(args.getInternalVararg());
}
if (args.getInternalKwarg() != null) {
keywordlist = true;
names.add(args.getInternalKwarg());
}
defaults = args.getInternalDefaults();
for (int i = 0; i < defaults.size(); i++) {
if (defaults.get(i) == null)
throw new ParseException(
"non-default argument follows default argument",
args.getInternalArgs().get(args.getInternalArgs().size() - defaults.size() + i));
}
}
@Override
public Object visitName(Name node) throws Exception {
//FIXME: do we need Store and Param, or just Param?
if (node.getInternalCtx() != expr_contextType.Store && node.getInternalCtx() != expr_contextType.Param) {
return null;
}
if (fpnames.contains(node.getInternalId())) {
throw new ParseException("duplicate argument name found: " +
node.getInternalId(), node);
}
fpnames.add(node.getInternalId());
return node.getInternalId();
}
@Override
public Object visitTuple(Tuple node) throws Exception {
StringBuffer name = new StringBuffer("(");
int n = node.getInternalElts().size();
for (int i = 0; i < n-1; i++) {
name.append(visit(node.getInternalElts().get(i)));
name.append(", ");
}
name.append(visit(node.getInternalElts().get(n - 1)));
name.append(")");
return name.toString();
}
}