mca-compiler
Version:
Compiles MCA code to MCIL
47 lines (42 loc) • 1.78 kB
JavaScript
var errors = require('./errors');
var execute = require('./execute');
module.exports = function getAssignable(expression, ctx) {
var currentNode = expression;
var isMap = false;
var variableName, variableIndexExpression, variableIndex;
var variable;
while (!variableName) {
if (currentNode.type === "Expression") currentNode = currentNode.expression;
else if (currentNode.type === "Identifier") variableName = currentNode.name;
else if (currentNode.type === "MemberExpression") {
isMap = true;
variableIndexExpression = currentNode.property;
currentNode = currentNode.map;
} else if (currentNode.type === "MapExpression" && isMap) variable = execute(currentNode.map, ctx);
else errors.referenceError("Invalid assignable expression");
}
var variableScopeName, scope;
if (isMap) {
variableIndex = execute(variableIndexExpression, ctx);
if (variableName) variable = ctx.getVariable(variableName);
if (!variable || !variable.isMap) errors.typeError("Cannot use index of a non-map");
} else {
variableScopeName = ctx.findVariableScope(variableName);
if (variableScopeName === false) {
variableScopeName = 0;
ctx.setVariable(variableName, null, 0);
}
scope = ctx.scopes[variableScopeName];
}
return {
isAssignable: true,
getValue: function() {
if (isMap) return variable.getIndex(variableIndex);
return ctx.getVariableIn(variableName, scope);
},
setValue: function(newValue) {
if (isMap) variable.setIndex(variableIndex, newValue);
else ctx.setVariableIn(variableName, newValue, scope);
}
};
};