All Downloads are FREE. Search and download functionalities are using the official Maven repository.

js.prompto.javascript.JavaScriptMethodExpression.js Maven / Gradle / Ivy

var isNodeJs = typeof window === 'undefined' && typeof importScripts === 'undefined';
var JavaScriptSelectorExpression = require("./JavaScriptSelectorExpression").JavaScriptSelectorExpression;
var JavaScriptExpressionList = require("./JavaScriptExpressionList").JavaScriptExpressionList;
var SyntaxError = require("../error/SyntaxError").SyntaxError;
var NativeInstance = require("../value/NativeInstance").NativeInstance;

function JavaScriptMethodExpression(id, args) {
	JavaScriptSelectorExpression.call(this);
	this.id = id;
	this.args = args || new JavaScriptExpressionList();
	return this;
}

JavaScriptMethodExpression.prototype = Object.create(JavaScriptSelectorExpression.prototype);
JavaScriptMethodExpression.prototype.constructor = JavaScriptMethodExpression;


JavaScriptMethodExpression.prototype.toString = function() {
	return this.parent.toString() + "." + this.id.name + "(" + this.args.toString() + ")";
};


JavaScriptMethodExpression.prototype.interpret = function(context, module) {
    var m = this.findInstanceAndMethod(context, module);
    if(!m)
        throw new SyntaxError("Could not find function: "+ this.id.name + (module ? " in module: " + module.toString() : ""));
	var args = this.args.computeArguments(context);
    return m.method.apply(m.instance, args);
};

JavaScriptMethodExpression.prototype.findInstanceAndMethod = function(context, module) {
    if (this.parent === null) {
        return this.findGlobal(context, module);
    } else {
        return this.findMember(context, module);
    }
};

var stringToFunction = function(str) {
    var arr = str.split(".");
    var fn = isNodeJs ? this : window;
    for (var i = 0, len = arr.length; i < len; i++) {
        fn = fn[arr[i]];
    }
    return fn;
};

JavaScriptMethodExpression.prototype.interpretNew = function(context, module) {
    var m = this.findInstanceAndMethod(context, module);
    if(!m)
        throw new SyntaxError("Could not find function: "+ this.id.name);
    var args = this.args.computeArguments(context);
    return args.length ? new m.method(args) : new m.method();
};

JavaScriptMethodExpression.prototype.findGlobal = function(context, module) {
    if(module!=null)
        return this.findInModule(context, module);
    else
        return { instance: null, method: stringToFunction(this.id.name) };
};

JavaScriptMethodExpression.prototype.findInModule = function(context, module) {
    try {
        m = module.resolve();
        if(m[this.id.name])
            return { instance: null, method: m[this.id.name] };
        else
            throw true;
    } catch (e) {
        throw new SyntaxError("Could not resolve module method: " + module.toString() + " " + this.id.name);
    }
};

JavaScriptMethodExpression.prototype.findMember = function(context, module) {
	var i = this.parent.interpret(context, module)
	if(i===null) {
		throw "Null reference";
	}
	if(i instanceof NativeInstance) {
		i = i.instance;
	}
    if(i[this.id.name])
        return { instance:i, method: i[this.id.name] };
    else
        throw new SyntaxError("Could not resolve member method: " + this.toString());
};

JavaScriptMethodExpression.prototype.toDialect = function(writer) {
    if(this.parent!=null) {
        this.parent.toDialect(writer);
        writer.append('.');
    }
    writer.append(this.id.name);
    writer.append('(');
    if(this.args!=null)
        this.args.toDialect(writer);
    writer.append(')');
};

exports.JavaScriptMethodExpression = JavaScriptMethodExpression;




© 2015 - 2025 Weber Informatics LLC | Privacy Policy