proc_macro
Version:
A JavaScript implementation of proc_macros.
125 lines • 4.48 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var token_1 = __importDefault(require("./token"));
var __1 = require("..");
/**
* A collection of tokens delimited by `{}`, `[]`, or `()`.
*/
var Group = /** @class */ (function (_super) {
__extends(Group, _super);
function Group(delimiters, tokenStream) {
var _this = _super.call(this) || this;
_this.delimiters = delimiters;
_this.tokenStream = tokenStream;
return _this;
}
Group.prototype.eq = function (other) {
if (other instanceof Group) {
return this.delimiters === other.delimiters && this.tokenStream.eq(other.tokenStream);
}
return false;
};
Group.tokenize = function (tokenString) {
// Assumes that current token is a delimiter.
var openDelimiter = tokenString[0];
var closeDelimiter;
// If this assert fails, our initial assumption that the delimiter was open is false.
try {
closeDelimiter = this.getClosingDelimiter(openDelimiter);
}
catch (e) {
throw e;
}
var delimiterCounter = 1;
var pointer = 0;
loop: while (pointer < tokenString.length) {
if (delimiterCounter === 0)
break loop;
switch (tokenString[++pointer]) {
case openDelimiter:
delimiterCounter++;
continue loop;
case closeDelimiter:
delimiterCounter--;
}
}
if (delimiterCounter !== 0)
throw Error("FATAL ERROR: Group is never closed.");
var innerTokenStream = __1.TokenStream.tokenize(tokenString.substring(1, pointer));
return [new Group(this.getDelimiterType(openDelimiter), innerTokenStream), tokenString.substring(pointer + 1)];
};
/**
* Converts the char representation of delimiter into string type.
* @param char Delimiter to conver to string.
*/
Group.getDelimiterType = function (char) {
switch (char) {
case '{':
case '}':
return 'brace';
case '(':
case ')':
return 'parenthesis';
case '[':
case ']':
return 'bracket';
default:
throw Error("FATAL ERROR: Char is not a group delimiter.");
}
};
Group.getDelimiters = function (delimiter) {
switch (delimiter) {
case 'brace':
return ['{', '}'];
case 'bracket':
return ['[', ']'];
case 'parenthesis':
return ['(', ')'];
case 'none':
default:
return [' ', ' '];
}
};
/**
* Gets the closing delimiter from the open delimiter.
* @param char The open delimiter.
*/
Group.getClosingDelimiter = function (char) {
switch (char) {
case '{':
return '}';
case '(':
return ')';
case '[':
return ']';
default:
throw Error("FATAL ERROR: Char is not a group delimiter.");
}
};
Group.prototype.toParenthesisString = function () {
return "(Group " + this.delimiters + " " + this.tokenStream.toParenthesisString() + ")";
};
Group.prototype.toJavaScript = function () {
var _a = Group.getDelimiters(this.delimiters), open = _a[0], close = _a[1];
return open + " " + this.tokenStream.toJavaScript() + close + " ";
};
return Group;
}(token_1.default));
exports.default = Group;
//# sourceMappingURL=group.js.map