(function (mod){ if (typeof exports == "object" && typeof module == "object") return mod(exports); if (typeof define == "function" && define.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 ; } 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 < _AN_Read_length("length", text)){ var next = text.charCodeAt(pos); if (next == 47) { var after = text.charCodeAt(pos + 1), end; if (after == 47) end = text.indexOf("\n", pos + 2); else if (after == 42) end = text.indexOf("*/", pos + 2); else return ; return text.slice(pos + 2, end < 0? _AN_Read_length("length", text): 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); } ; } );