UNPKG

vox-core

Version:

Runtime de aplicaciones multiplataforma

591 lines (528 loc) 20.8 kB
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); }); }