package org.yinwang.pysonar.ast; import org.jetbrains.annotations.NotNull; import org.yinwang.pysonar.Binding; import org.yinwang.pysonar.Indexer; import org.yinwang.pysonar.Scope; import org.yinwang.pysonar.types.FunType; import org.yinwang.pysonar.types.Type; import java.util.List; public class Lambda extends FunctionDef { public Lambda(List<Node> args, Node body, List<Node> defaults, Name varargs, Name kwargs, int start, int end) { super(null, args, null, defaults, varargs, kwargs, start, end); this.body = body instanceof Block ? (Block)body : body; addChildren(this.body); } @Override public boolean isLambda() { return true; } private static int lambdaCounter = 0; @NotNull public static String genLambdaName() { lambdaCounter = lambdaCounter + 1; return "lambda%" + lambdaCounter; } @Override public Name getName() { if (name != null) { return name; } else { String fn = genLambdaName(); name = new Name(fn, start, start + "lambda".length()); addChildren(name); return name; } } @NotNull @Override public Type resolve(@NotNull Scope outer, int tag) { this.defaultTypes = resolveAndConstructList(defaults, outer, tag); FunType cl = new FunType(this, outer.getForwarding()); cl.getTable().setParent(outer); cl.getTable().setPath(outer.extendPath(getName().getId())); NameBinder.bind(outer, getName(), cl, Binding.Kind.FUNCTION, tag); cl.setDefaultTypes(resolveAndConstructList(defaults, outer, tag)); Indexer.idx.addUncalled(cl); return cl; } @NotNull @Override public String toString() { return "<Lambda:" + start + ":" + args + ":" + body + ">"; } @Override public void visit(@NotNull NodeVisitor v) { if (v.visit(this)) { visitNodeList(args, v); visitNodeList(defaults, v); visitNode(vararg, v); visitNode(kwarg, v); visitNode(body, v); } } }