123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- (function(mod) {
- if (typeof exports == "object" && typeof module == "object") // CommonJS
- return mod(exports);
- if (typeof define == "function" && define.amd) // AMD
- return define(["exports"], mod);
- mod(tern.comment || (tern.comment = {}));
- })(function(exports) {
- function isSpace(ch) {
- return (ch < 14 && ch > 8) || ch === 32 || ch === 160;
- }
- function onOwnLine(text, pos) {
- for (; pos > 0; --pos) {
- var ch = text.charCodeAt(pos - 1);
- if (ch == 10) break;
- if (!isSpace(ch)) return false;
- }
- return true;
- }
- // Gather comments directly before a function
- exports.commentsBefore = function(text, pos) {
- var found = null, emptyLines = 0, topIsLineComment;
- out: while (pos > 0) {
- var prev = text.charCodeAt(pos - 1);
- if (prev == 10) {
- for (var scan = --pos, sawNonWS = false; scan > 0; --scan) {
- prev = text.charCodeAt(scan - 1);
- if (prev == 47 && text.charCodeAt(scan - 2) == 47) {
- if (!onOwnLine(text, scan - 2)) break out;
- var content = text.slice(scan, pos);
- if (!emptyLines && topIsLineComment) found[0] = content + "\n" + found[0];
- else (found || (found = [])).unshift(content);
- topIsLineComment = true;
- emptyLines = 0;
- pos = scan - 2;
- break;
- } else if (prev == 10) {
- if (!sawNonWS && ++emptyLines > 1) break out;
- break;
- } else if (!sawNonWS && !isSpace(prev)) {
- sawNonWS = true;
- }
- }
- } else if (prev == 47 && text.charCodeAt(pos - 2) == 42) {
- for (var scan = pos - 2; scan > 1; --scan) {
- if (text.charCodeAt(scan - 1) == 42 && text.charCodeAt(scan - 2) == 47) {
- if (!onOwnLine(text, scan - 2)) break out;
- (found || (found = [])).unshift(text.slice(scan, pos - 2));
- topIsLineComment = false;
- emptyLines = 0;
- break;
- }
- }
- pos = scan - 2;
- } else if (isSpace(prev)) {
- --pos;
- } else {
- break;
- }
- }
- return found;
- };
- exports.commentAfter = function(text, pos) {
- while (pos < text.length) {
- var next = text.charCodeAt(pos);
- if (next == 47) {
- var after = text.charCodeAt(pos + 1), end;
- if (after == 47) // line comment
- end = text.indexOf("\n", pos + 2);
- else if (after == 42) // block comment
- end = text.indexOf("*/", pos + 2);
- else
- return;
- return text.slice(pos + 2, end < 0 ? text.length : end);
- } else if (isSpace(next)) {
- ++pos;
- }
- }
- };
- exports.ensureCommentsBefore = function(text, node) {
- if (node.hasOwnProperty("commentsBefore")) return node.commentsBefore;
- return node.commentsBefore = exports.commentsBefore(text, node.start);
- };
- });
|