vox-core
Version:
Runtime de aplicaciones multiplataforma
591 lines (528 loc) • 20.8 kB
JavaScript
var ClassPreset= module.exports= function(){
}
ClassPreset.prototype.MethodDefinition= function(ev){
var classdef= this.getClassDef(ev);
if(!classdef){
return;
}
var id;
if(ev.ast.key.name=="constructor"){
id=classdef.id;
ev.ast.key.name="$constructor"
}
else{
if(ev.ast.static){
id= classdef.id;
}
else{
id={
"type": "MemberExpression",
"computed": false,
"object": classdef.id,
"property": {
"type": "Identifier",
"name": "prototype"
}
}
}
}
var exp;
if(ev.ast.kind=="get" || ev.ast.kind=="set"){
exp= {
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "MemberExpression",
"computed": false,
"object": id,
"property": {
"type": "Identifier",
"name": (ev.ast.kind=="get") ? "__defineGetter__" : "__defineSetter__"
}
},
"arguments": [
ev.ast.computed ?
ev.ast.key
: {
"type":"Literal",
"value": ev.ast.key.name,
"raw": JSON.stringify(ev.ast.key.name)
},
ev.ast.value
]
}
}
}
else{
exp={
"type": "ExpressionStatement",
"expression": {
"type": "AssignmentExpression",
"operator": "=",
"left": {
"type": "MemberExpression",
"computed": ev.ast.computed,
"object": id,
"property": ev.ast.key
},
"right": ev.ast.value/*{
"type": "FunctionExpression",
"id": null,
"params": ev.ast.value.params,
"defaults": [],
"body": {
"type": "BlockStatement",
"body": ev.ast.value.body.body
},
"generator": false,
"expression": false
}*/
}
}
}
//ev.iteratorObject= exp.expression;//ev.ast.value.body.body;
ev.replacement=exp;
}
ClassPreset.prototype._CallExpression=function(ev){
var ast= ev.ast
if(ast.callee.type=="MemberExpression"){
if(ast.callee.object.type=="Super"){
ast.callee= {
type:"MemberExpression",
"object":ast.callee,
"property": {
"type": "Identifier",
"name": "call"
}
}
ast.arguments=[ {
"type": "ThisExpression"
}].concat(ast.arguments)
return true
}
}
}
ClassPreset.prototype.MemberExpression=function(ev){
var classdef= this.getClassDef(ev);
if(!classdef){
return;
}
if(ev.ast.object&&ev.ast.object.type=="Super"){
//var mdef=this.getMethodDef(ev);
ev.ast.object={
"type": "MemberExpression",
"computed": false,
"object": classdef.id,
"property": {
"type": "Identifier",
"name": "$super"
}
}
}
}
ClassPreset.prototype.CallExpression=function(ev){
var classdef= this.getClassDef(ev);
if(!classdef){
return;
}
if(this._CallExpression(ev))
return
if(ev.ast.callee&&ev.ast.callee.type=="Super"){
//var mdef=this.getMethodDef(ev);
ev.ast.arguments=[{
"type": "ThisExpression"
}].concat(ev.ast.arguments);
ev.ast.callee={
"type": "MemberExpression",
"computed": false,
"object": /*{
"type": "MemberExpression",
"computed": false,
"object": */{
"type": "MemberExpression",
"computed": false,
"object": classdef.id,
"property": {
"type": "Identifier",
"name": "$superClass"
}
}/*,
"property": {
"type": "Identifier",
"name": "constructor"
}
}*/,
"property": {
"type": "Identifier",
"name": "call"
}
}
}
}
/*
ClassPreset.prototype.ExpressionStatement= function(ev){
var classdef= this.getClassDef(ev);
if(!classdef){
return;
}
if(ev.ast.expression&&ev.ast.expression.callee&&ev.ast.expression.callee.type=="Super"){
var args=[{
"type": "ThisExpression"
}];
for(var i=0;i<ev.ast.expression.arguments.length;i++){
args.push(ev.ast.expression.arguments[i]);
}
var exp= {
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "MemberExpression",
"computed": false,
"object": {
"type": "MemberExpression",
"computed": false,
"object": {
"type": "MemberExpression",
"computed": false,
"object": classdef.id,
"property": {
"type": "Identifier",
"name": "$super"
}
},
"property": {
"type": "Identifier",
"name": "constructor"
}
},
"property": {
"type": "Identifier",
"name": "call"
}
},
"arguments": args
}
}
ev.replacement= exp;
}
}
*/
ClassPreset.prototype.getClassDef= function(ev){
while(ev.parent){
if(ev.parent.type=="ClassDeclaration"){
return ev.parent.ast;
}
ev=ev.parent;
}
return null;
}
ClassPreset.prototype.getMethodDef= function(ev){
while(ev.parent){
if(ev.parent.type=="MethodDefinition"){
return ev.parent.ast;
}
ev=ev.parent;
}
return null;
}
ClassPreset.prototype.ClassDeclaration= function(ev){
var exp= {
"type": "BlockStatement",
"body": [
{
"kind":"var",
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": ev.ast.id,
"init": {
"type": "FunctionExpression",
"id": ev.ast.id,
"params": [],
"defaults": [],
"body": {
"type": "BlockStatement",
"body": [
{
"type": "ExpressionStatement",
"expression": {
"type": "ConditionalExpression",
"test": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "$constructor"
}
},
"consequent": {
"type": "CallExpression",
"callee": {
"type": "MemberExpression",
"computed": false,
"object": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "$constructor"
}
},
"property": {
"type": "Identifier",
"name": "apply"
}
},
"arguments": [
{
"type": "ThisExpression"
},
{
"type": "Identifier",
"name": "arguments"
}
]
},
"alternate": {
"type": "LogicalExpression",
"operator": "&&",
"left": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "$superClass"
}
},
"right": {
"type": "CallExpression",
"callee": {
"type": "MemberExpression",
"computed": false,
"object": /*{
"type": "MemberExpression",
"computed": false,
"object": */{
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "$superClass"
}
}/*,
"property": {
"type": "Identifier",
"name": "constructor"
}
}*/,
"property": {
"type": "Identifier",
"name": "apply"
}
},
"arguments": [
{
"type": "ThisExpression"
},
{
"type": "Identifier",
"name": "arguments"
}
]
}
}
}
}
]
}
}
}
],
"generator": false,
"expression": false
}
]
}
if(ev.ast.superClass){
var inh={
"type": "ExpressionStatement",
"expression": {
"type": "AssignmentExpression",
"operator": "=",
"left": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "prototype"
}
},
"right": {
"type": "CallExpression",
"callee": {
"type": "MemberExpression",
"computed": false,
"object": {
"type": "Identifier",
"name": "Object"
},
"property": {
"type": "Identifier",
"name": "create"
}
},
"arguments": [
{
"type": "MemberExpression",
"computed": false,
"object": ev.ast.superClass,
"property": {
"type": "Identifier",
"name": "prototype"
}
}
]
}
}
};
exp.body.push(inh);
inh={
"type": "ExpressionStatement",
"expression": {
"type": "ConditionalExpression",
"test": {
"type": "MemberExpression",
"computed": false,
"object": {
"type": "Identifier",
"name": "Object"
},
"property": {
"type": "Identifier",
"name": "setPrototypeOf"
}
},
"consequent": {
"type": "CallExpression",
"callee": {
"type": "MemberExpression",
"computed": false,
"object": {
"type": "Identifier",
"name": "Object"
},
"property": {
"type": "Identifier",
"name": "setPrototypeOf"
}
},
"arguments": [
ev.ast.id,
ev.ast.superClass
]
},
"alternate": {
"type": "AssignmentExpression",
"operator": "=",
"left": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "__proto__"
}
},
"right": ev.ast.superClass
}
}
}
exp.body.push(inh)
inh= {
"type": "ExpressionStatement",
"expression": {
"type": "AssignmentExpression",
"operator": "=",
"left": {
"type": "MemberExpression",
"computed": false,
"object": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "prototype"
}
},
"property": {
"type": "Identifier",
"name": "constructor"
}
},
"right": ev.ast.id
}
}
exp.body.push(inh);
inh= {
"type": "ExpressionStatement",
"expression": {
"type": "AssignmentExpression",
"operator": "=",
"left": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "$super"
}
},
"right": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.superClass,
"property": {
"type": "Identifier",
"name": "prototype"
}
}
}
}
exp.body.push(inh);
inh= {
"type": "ExpressionStatement",
"expression": {
"type": "AssignmentExpression",
"operator": "=",
"left": {
"type": "MemberExpression",
"computed": false,
"object": ev.ast.id,
"property": {
"type": "Identifier",
"name": "$superClass"
}
},
"right": ev.ast.superClass
}
}
exp.body.push(inh);
}
var body= exp.body;
//ev.iteratorObject= body;
//ev.iteratorIndex= body.length;
ev.replacement= exp;
// Colocar lo del body de ClassDeclaration dentro del nuevo body ...
ev.ast.body.body.forEach(function(exp){
body.push(exp);
});
}