"use strict"
;
function
FlexiJSON() {}
FlexiJSON.treeType =
function
(name) {
return
Java.type(
"jdk.nashorn.api.tree."
+ name);
}
FlexiJSON.ArrayLiteral = FlexiJSON.treeType(
"ArrayLiteralTree"
);
FlexiJSON.ExpressionStatement = FlexiJSON.treeType(
"ExpressionStatementTree"
);
FlexiJSON.ObjectLiteral = FlexiJSON.treeType(
"ObjectLiteralTree"
);
FlexiJSON.RegExpLiteral = FlexiJSON.treeType(
"RegExpLiteralTree"
);
FlexiJSON.Literal = FlexiJSON.treeType(
"LiteralTree"
);
FlexiJSON.Parser = FlexiJSON.treeType(
"Parser"
);
FlexiJSON.SimpleTreeVisitor = FlexiJSON.treeType(
"SimpleTreeVisitorES5_1"
);
FlexiJSON.parse =
function
(str) {
var
parser = (
typeof
$OPTIONS ==
"undefined"
)?
FlexiJSON.Parser.create() :
FlexiJSON.Parser.create(
"-scripting"
);
str =
"("
+ str +
")"
;
var
ast = parser.parse(
""
, str,
null
);
if
(!ast) {
return
undefined;
}
function
isLiteral(node) {
return
node
instanceof
FlexiJSON.ArrayLiteral ||
node
instanceof
FlexiJSON.Literal ||
node
instanceof
FlexiJSON.ObjectLiteral ||
node
instanceof
FlexiJSON.RegExpLiteral;
}
var
visitor;
ast.accept(visitor =
new
(Java.extend(FlexiJSON.SimpleTreeVisitor)) {
lineMap:
null
,
throwError:
function
(msg, node) {
if
(
this
.lineMap) {
var
pos = node.startPosition;
var
line =
this
.lineMap.getLineNumber(pos);
var
column =
this
.lineMap.getColumnNumber(pos);
msg = msg +
" @ "
+ line +
":"
+ (column - 1);
}
throw
new
TypeError(msg);
},
visitLiteral:
function
(node, extra) {
print(node.value);
},
visitExpressionStatement:
function
(node, extra) {
var
expr = node.expression;
if
(isLiteral(expr)) {
expr.accept(visitor, extra);
}
else
{
this
.throwError(
"only literals can occur"
, expr);
}
},
visitArrayLiteral:
function
(node, extra) {
for
each (
var
elem
in
node.elements) {
if
(isLiteral(elem)) {
elem.accept(visitor, extra);
}
else
{
this
.throwError(
"only literal array element value allowed"
, elem);
}
}
},
visitObjectLiteral:
function
(node, extra) {
for
each (
var
prop
in
node.properties) {
if
(prop.getter !=
null
|| prop.setter !=
null
) {
this
.throwError(
"getter/setter property not allowed"
, node);
}
var
value = prop.value;
if
(isLiteral(value)) {
value.accept(visitor, extra);
}
else
{
this
.throwError(
"only literal property value allowed"
, value);
}
}
},
visitCompilationUnit:
function
(node, extra) {
this
.lineMap = node.lineMap;
var
elements = node.sourceElements;
if
(elements.length > 1) {
this
.throwError(
"more than one top level expression"
, node.sourceElements[1]);
}
var
stat = node.sourceElements[0];
if
(! (stat
instanceof
FlexiJSON.ExpressionStatement)) {
this
.throwError(
"only one top level expresion allowed"
, stat);
}
stat.accept(visitor, extra);
},
},
null
);
return
eval(str);
}