org.python.indexer.AstConverter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-slim Show documentation
Show all versions of jython-slim Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
/**
* Copyright 2009, Google Inc. All rights reserved.
* Licensed to PSF under a Contributor Agreement.
*/
package org.python.indexer;
import org.python.antlr.PythonTree;
import org.python.antlr.Visitor;
import org.python.antlr.ast.Assert;
import org.python.antlr.ast.Assign;
import org.python.antlr.ast.Attribute;
import org.python.antlr.ast.AugAssign;
import org.python.antlr.ast.BinOp;
import org.python.antlr.ast.BoolOp;
import org.python.antlr.ast.Break;
import org.python.antlr.ast.Call;
import org.python.antlr.ast.ClassDef;
import org.python.antlr.ast.Compare;
import org.python.antlr.ast.Continue;
import org.python.antlr.ast.Delete;
import org.python.antlr.ast.Dict;
import org.python.antlr.ast.Ellipsis;
import org.python.antlr.ast.ExceptHandler;
import org.python.antlr.ast.Exec;
import org.python.antlr.ast.Expr;
import org.python.antlr.ast.For;
import org.python.antlr.ast.FunctionDef;
import org.python.antlr.ast.GeneratorExp;
import org.python.antlr.ast.Global;
import org.python.antlr.ast.If;
import org.python.antlr.ast.IfExp;
import org.python.antlr.ast.Import;
import org.python.antlr.ast.ImportFrom;
import org.python.antlr.ast.Index;
import org.python.antlr.ast.Lambda;
import org.python.antlr.ast.ListComp;
import org.python.antlr.ast.Module;
import org.python.antlr.ast.Name;
import org.python.antlr.ast.Num;
import org.python.antlr.ast.Pass;
import org.python.antlr.ast.Print;
import org.python.antlr.ast.Raise;
import org.python.antlr.ast.Repr;
import org.python.antlr.ast.Return;
import org.python.antlr.ast.Slice;
import org.python.antlr.ast.Str;
import org.python.antlr.ast.Subscript;
import org.python.antlr.ast.TryExcept;
import org.python.antlr.ast.TryFinally;
import org.python.antlr.ast.Tuple;
import org.python.antlr.ast.UnaryOp;
import org.python.antlr.ast.While;
import org.python.antlr.ast.With;
import org.python.antlr.ast.Yield;
import org.python.antlr.ast.alias;
import org.python.antlr.ast.arguments;
import org.python.antlr.ast.boolopType;
import org.python.antlr.ast.cmpopType;
import org.python.antlr.ast.comprehension;
import org.python.antlr.ast.keyword;
import org.python.antlr.ast.operatorType;
import org.python.antlr.ast.unaryopType;
import org.python.antlr.base.excepthandler;
import org.python.antlr.base.expr;
import org.python.antlr.base.stmt;
import org.python.indexer.ast.NAlias;
import org.python.indexer.ast.NAssert;
import org.python.indexer.ast.NAssign;
import org.python.indexer.ast.NAttribute;
import org.python.indexer.ast.NAugAssign;
import org.python.indexer.ast.NBinOp;
import org.python.indexer.ast.NBlock;
import org.python.indexer.ast.NBoolOp;
import org.python.indexer.ast.NBreak;
import org.python.indexer.ast.NCall;
import org.python.indexer.ast.NClassDef;
import org.python.indexer.ast.NCompare;
import org.python.indexer.ast.NComprehension;
import org.python.indexer.ast.NContinue;
import org.python.indexer.ast.NDelete;
import org.python.indexer.ast.NDict;
import org.python.indexer.ast.NEllipsis;
import org.python.indexer.ast.NExceptHandler;
import org.python.indexer.ast.NExec;
import org.python.indexer.ast.NFor;
import org.python.indexer.ast.NFunctionDef;
import org.python.indexer.ast.NGeneratorExp;
import org.python.indexer.ast.NGlobal;
import org.python.indexer.ast.NIf;
import org.python.indexer.ast.NIfExp;
import org.python.indexer.ast.NImport;
import org.python.indexer.ast.NImportFrom;
import org.python.indexer.ast.NIndex;
import org.python.indexer.ast.NKeyword;
import org.python.indexer.ast.NLambda;
import org.python.indexer.ast.NList;
import org.python.indexer.ast.NListComp;
import org.python.indexer.ast.NModule;
import org.python.indexer.ast.NName;
import org.python.indexer.ast.NNode;
import org.python.indexer.ast.NNum;
import org.python.indexer.ast.NPass;
import org.python.indexer.ast.NPrint;
import org.python.indexer.ast.NQname;
import org.python.indexer.ast.NRaise;
import org.python.indexer.ast.NRepr;
import org.python.indexer.ast.NReturn;
import org.python.indexer.ast.NExprStmt;
import org.python.indexer.ast.NSlice;
import org.python.indexer.ast.NStr;
import org.python.indexer.ast.NSubscript;
import org.python.indexer.ast.NTryExcept;
import org.python.indexer.ast.NTryFinally;
import org.python.indexer.ast.NTuple;
import org.python.indexer.ast.NUnaryOp;
import org.python.indexer.ast.NWhile;
import org.python.indexer.ast.NWith;
import org.python.indexer.ast.NYield;
import java.util.ArrayList;
import java.util.List;
/**
* Converts the antlr AST into the indexer's AST format.
*/
public class AstConverter extends Visitor {
public String convOp(Object t) {
if (t instanceof operatorType) {
switch((operatorType)t) {
case Add:
return "+";
case Sub:
return "-";
case Mult:
return "*";
case Div:
return "/";
case Mod:
return "%";
case Pow:
return "**";
case LShift:
return "<<";
case RShift:
return ">>";
case BitOr:
return "|";
case BitXor:
return "^";
case BitAnd:
return "&";
case FloorDiv:
return "//";
default:
return null;
}
}
if (t instanceof boolopType) {
switch ((boolopType)t) {
case And:
return "and";
case Or:
return "or";
default:
return null;
}
}
if (t instanceof unaryopType) {
switch ((unaryopType)t) {
case Invert:
return "~";
case Not:
return "not";
case USub:
return "-";
case UAdd:
return "+";
default:
return null;
}
}
if (t instanceof cmpopType) {
switch ((cmpopType)t) {
case Eq:
return "==";
case NotEq:
return "!=";
case Gt:
return ">";
case GtE:
return ">=";
case Lt:
return "<";
case LtE:
return "<=";
case In:
return "in";
case NotIn:
return "not in";
case Is:
return "is";
case IsNot:
return "is not";
default:
return null;
}
}
return null;
}
// Helpers for converting lists of things
private List convertListExceptHandler(List in) throws Exception {
List out = new ArrayList(in == null ? 0 : in.size());
if (in != null) {
for (excepthandler e : in) {
@SuppressWarnings("unchecked")
NExceptHandler nxh = (NExceptHandler)e.accept(this);
if (nxh != null) {
out.add(nxh);
}
}
}
return out;
}
private List convertListExpr(List in) throws Exception {
List out = new ArrayList(in == null ? 0 : in.size());
if (in != null) {
for (expr e : in) {
@SuppressWarnings("unchecked")
NNode nx = (NNode)e.accept(this);
if (nx != null) {
out.add(nx);
}
}
}
return out;
}
private List convertListName(List in) throws Exception {
List out = new ArrayList(in == null ? 0 : in.size());
if (in != null) {
for (expr e : in) {
@SuppressWarnings("unchecked")
NName nn = (NName)e.accept(this);
if (nn != null) {
out.add(nn);
}
}
}
return out;
}
private NQname convertQname(List in) throws Exception {
if (in == null) {
return null;
}
// This would be less ugly if we generated Qname nodes in the antlr ast.
NQname out = null;
int end = -1;
for (int i = in.size() - 1; i >= 0; i--) {
Name n = in.get(i);
if (end == -1) {
end = n.getCharStopIndex();
}
@SuppressWarnings("unchecked")
NName nn = (NName)n.accept(this);
out = new NQname(out, nn, n.getCharStartIndex(), end);
}
return out;
}
private List convertListKeyword(List in) throws Exception {
List out = new ArrayList(in == null ? 0 : in.size());
if (in != null) {
for (keyword e : in) {
NKeyword nkw = new NKeyword(e.getInternalArg(), convExpr(e.getInternalValue()));
if (nkw != null) {
out.add(nkw);
}
}
}
return out;
}
private NBlock convertListStmt(List in) throws Exception {
List out = new ArrayList(in == null ? 0 : in.size());
if (in != null) {
for (stmt e : in) {
@SuppressWarnings("unchecked")
NNode nx = (NNode)e.accept(this);
if (nx != null) {
out.add(nx);
}
}
}
return new NBlock(out, 0, 0);
}
private NNode convExpr(PythonTree e) throws Exception {
if (e == null) {
return null;
}
@SuppressWarnings("unchecked")
Object o = e.accept(this);
if (o instanceof NNode) {
return (NNode)o;
}
return null;
}
private int start(PythonTree tree) {
return tree.getCharStartIndex();
}
private int stop(PythonTree tree) {
return tree.getCharStopIndex();
}
@Override
public Object visitAssert(Assert n) throws Exception {
return new NAssert(convExpr(n.getInternalTest()),
convExpr(n.getInternalMsg()),
start(n), stop(n));
}
@Override
public Object visitAssign(Assign n) throws Exception {
return new NAssign(convertListExpr(n.getInternalTargets()),
convExpr(n.getInternalValue()),
start(n), stop(n));
}
@Override
public Object visitAttribute(Attribute n) throws Exception {
return new NAttribute(convExpr(n.getInternalValue()),
(NName)convExpr(n.getInternalAttrName()),
start(n), stop(n));
}
@Override
public Object visitAugAssign(AugAssign n) throws Exception {
return new NAugAssign(convExpr(n.getInternalTarget()),
convExpr(n.getInternalValue()),
convOp(n.getInternalOp()),
start(n), stop(n));
}
@Override
public Object visitBinOp(BinOp n) throws Exception {
return new NBinOp(convExpr(n.getInternalLeft()),
convExpr(n.getInternalRight()),
convOp(n.getInternalOp()),
start(n), stop(n));
}
@Override
public Object visitBoolOp(BoolOp n) throws Exception {
NBoolOp.OpType op;
switch (n.getInternalOp()) {
case And:
op = NBoolOp.OpType.AND;
break;
case Or:
op = NBoolOp.OpType.OR;
break;
default:
op = NBoolOp.OpType.UNDEFINED;
break;
}
return new NBoolOp(op, convertListExpr(n.getInternalValues()), start(n), stop(n));
}
@Override
public Object visitBreak(Break n) throws Exception {
return new NBreak(start(n), stop(n));
}
@Override
public Object visitCall(Call n) throws Exception {
return new NCall(convExpr(n.getInternalFunc()),
convertListExpr(n.getInternalArgs()),
convertListKeyword(n.getInternalKeywords()),
convExpr(n.getInternalKwargs()),
convExpr(n.getInternalStarargs()),
start(n), stop(n));
}
@Override
public Object visitClassDef(ClassDef n) throws Exception {
return new NClassDef((NName)convExpr(n.getInternalNameNode()),
convertListExpr(n.getInternalBases()),
convertListStmt(n.getInternalBody()),
start(n), stop(n));
}
@Override
public Object visitCompare(Compare n) throws Exception {
return new NCompare(convExpr(n.getInternalLeft()),
null, // XXX: why null?
convertListExpr(n.getInternalComparators()),
start(n), stop(n));
}
@Override
public Object visitContinue(Continue n) throws Exception {
return new NContinue(start(n), stop(n));
}
@Override
public Object visitDelete(Delete n) throws Exception {
return new NDelete(convertListExpr(n.getInternalTargets()), start(n), stop(n));
}
@Override
public Object visitDict(Dict n) throws Exception {
return new NDict(convertListExpr(n.getInternalKeys()),
convertListExpr(n.getInternalValues()),
start(n), stop(n));
}
@Override
public Object visitEllipsis(Ellipsis n) throws Exception {
return new NEllipsis(start(n), stop(n));
}
@Override
public Object visitExceptHandler(ExceptHandler n) throws Exception {
return new NExceptHandler(convExpr(n.getInternalName()),
convExpr(n.getInternalType()),
convertListStmt(n.getInternalBody()),
start(n), stop(n));
}
@Override
public Object visitExec(Exec n) throws Exception {
return new NExec(convExpr(n.getInternalBody()),
convExpr(n.getInternalGlobals()),
convExpr(n.getInternalLocals()),
start(n), stop(n));
}
@Override
public Object visitExpr(Expr n) throws Exception {
return new NExprStmt(convExpr(n.getInternalValue()), start(n), stop(n));
}
@Override
public Object visitFor(For n) throws Exception {
return new NFor(convExpr(n.getInternalTarget()),
convExpr(n.getInternalIter()),
convertListStmt(n.getInternalBody()),
convertListStmt(n.getInternalOrelse()),
start(n), stop(n));
}
@Override
public Object visitFunctionDef(FunctionDef n) throws Exception {
arguments args = n.getInternalArgs();
NFunctionDef fn = new NFunctionDef((NName)convExpr(n.getInternalNameNode()),
convertListExpr(args.getInternalArgs()),
convertListStmt(n.getInternalBody()),
convertListExpr(args.getInternalDefaults()),
(NName)convExpr(args.getInternalVarargName()),
(NName)convExpr(args.getInternalKwargName()),
start(n), stop(n));
fn.setDecoratorList(convertListExpr(n.getInternalDecorator_list()));
return fn;
}
@Override
public Object visitGeneratorExp(GeneratorExp n) throws Exception {
List generators =
new ArrayList(n.getInternalGenerators().size());
for (comprehension c : n.getInternalGenerators()) {
generators.add(new NComprehension(convExpr(c.getInternalTarget()),
convExpr(c.getInternalIter()),
convertListExpr(c.getInternalIfs()),
start(c), stop(c)));
}
return new NGeneratorExp(convExpr(n.getInternalElt()), generators, start(n), stop(n));
}
@Override
public Object visitGlobal(Global n) throws Exception {
return new NGlobal(convertListName(n.getInternalNameNodes()),
start(n), stop(n));
}
@Override
public Object visitIf(If n) throws Exception {
return new NIf(convExpr(n.getInternalTest()),
convertListStmt(n.getInternalBody()),
convertListStmt(n.getInternalOrelse()),
start(n), stop(n));
}
@Override
public Object visitIfExp(IfExp n) throws Exception {
return new NIfExp(convExpr(n.getInternalTest()),
convExpr(n.getInternalBody()),
convExpr(n.getInternalOrelse()),
start(n), stop(n));
}
@Override
public Object visitImport(Import n) throws Exception {
List aliases = new ArrayList(n.getInternalNames().size());
for (alias e : n.getInternalNames()) {
aliases.add(new NAlias(e.getInternalName(),
convertQname(e.getInternalNameNodes()),
(NName)convExpr(e.getInternalAsnameNode()),
start(e), stop(e)));
}
return new NImport(aliases, start(n), stop(n));
}
@Override
public Object visitImportFrom(ImportFrom n) throws Exception {
List aliases = new ArrayList(n.getInternalNames().size());
for (alias e : n.getInternalNames()) {
aliases.add(new NAlias(e.getInternalName(),
convertQname(e.getInternalNameNodes()),
(NName)convExpr(e.getInternalAsnameNode()),
start(e), stop(e)));
}
return new NImportFrom(n.getInternalModule(),
convertQname(n.getInternalModuleNames()),
aliases, start(n), stop(n));
}
@Override
public Object visitIndex(Index n) throws Exception {
return new NIndex(convExpr(n.getInternalValue()), start(n), stop(n));
}
@Override
public Object visitLambda(Lambda n) throws Exception {
arguments args = n.getInternalArgs();
return new NLambda(convertListExpr(args.getInternalArgs()),
convExpr(n.getInternalBody()),
convertListExpr(args.getInternalDefaults()),
(NName)convExpr(args.getInternalVarargName()),
(NName)convExpr(args.getInternalKwargName()),
start(n), stop(n));
}
@Override
public Object visitList(org.python.antlr.ast.List n) throws Exception {
return new NList(convertListExpr(n.getInternalElts()), start(n), stop(n));
}
// This is more complex than it should be, but let's wait until Jython add
// visitors to comprehensions
@Override
public Object visitListComp(ListComp n) throws Exception {
List generators =
new ArrayList(n.getInternalGenerators().size());
for (comprehension c : n.getInternalGenerators()) {
generators.add(new NComprehension(convExpr(c.getInternalTarget()),
convExpr(c.getInternalIter()),
convertListExpr(c.getInternalIfs()),
start(c), stop(c)));
}
return new NListComp(convExpr(n.getInternalElt()), generators, start(n), stop(n));
}
@Override
public Object visitModule(Module n) throws Exception {
return new NModule(convertListStmt(n.getInternalBody()), start(n), stop(n));
}
@Override
public Object visitName(Name n) throws Exception {
return new NName(n.getInternalId(), start(n), stop(n));
}
@Override
public Object visitNum(Num n) throws Exception {
return new NNum(n.getInternalN(), start(n), stop(n));
}
@Override
public Object visitPass(Pass n) throws Exception {
return new NPass(start(n), stop(n));
}
@Override
public Object visitPrint(Print n) throws Exception {
return new NPrint(convExpr(n.getInternalDest()),
convertListExpr(n.getInternalValues()),
start(n), stop(n));
}
@Override
public Object visitRaise(Raise n) throws Exception {
return new NRaise(convExpr(n.getInternalType()),
convExpr(n.getInternalInst()),
convExpr(n.getInternalTback()),
start(n), stop(n));
}
@Override
public Object visitRepr(Repr n) throws Exception {
return new NRepr(convExpr(n.getInternalValue()), start(n), stop(n));
}
@Override
public Object visitReturn(Return n) throws Exception {
return new NReturn(convExpr(n.getInternalValue()), start(n), stop(n));
}
@Override
public Object visitSlice(Slice n) throws Exception {
return new NSlice(convExpr(n.getInternalLower()),
convExpr(n.getInternalStep()),
convExpr(n.getInternalUpper()),
start(n), stop(n));
}
@Override
public Object visitStr(Str n) throws Exception {
return new NStr(n.getInternalS(), start(n), stop(n));
}
@Override
public Object visitSubscript(Subscript n) throws Exception {
return new NSubscript(convExpr(n.getInternalValue()),
convExpr(n.getInternalSlice()),
start(n), stop(n));
}
@Override
public Object visitTryExcept(TryExcept n) throws Exception {
return new NTryExcept(convertListExceptHandler(n.getInternalHandlers()),
convertListStmt(n.getInternalBody()),
convertListStmt(n.getInternalOrelse()),
start(n), stop(n));
}
@Override
public Object visitTryFinally(TryFinally n) throws Exception {
return new NTryFinally(convertListStmt(n.getInternalBody()),
convertListStmt(n.getInternalFinalbody()),
start(n), stop(n));
}
@Override
public Object visitTuple(Tuple n) throws Exception {
return new NTuple(convertListExpr(n.getInternalElts()), start(n), stop(n));
}
@Override
public Object visitUnaryOp(UnaryOp n) throws Exception {
return new NUnaryOp(null, // XXX: why null for operator?
convExpr(n.getInternalOperand()),
start(n), stop(n));
}
@Override
public Object visitWhile(While n) throws Exception {
return new NWhile(convExpr(n.getInternalTest()),
convertListStmt(n.getInternalBody()),
convertListStmt(n.getInternalOrelse()),
start(n), stop(n));
}
@Override
public Object visitWith(With n) throws Exception {
return new NWith(convExpr(n.getInternalOptional_vars()),
convExpr(n.getInternalContext_expr()),
convertListStmt(n.getInternalBody()),
start(n), stop(n));
}
@Override
public Object visitYield(Yield n) throws Exception {
return new NYield(convExpr(n.getInternalValue()), start(n), stop(n));
}
}