12345 |
- /*
- All material copyright ESRI, All Rights Reserved, unless otherwise specified.
- See https://js.arcgis.com/4.24/esri/copyright.txt for details.
- */
- import{assert as e}from"./assert.js";import{Character as t}from"./character.js";import{Messages as i}from"./messages.js";import{TokenType as s}from"./token.js";function n(e){return"0123456789abcdef".indexOf(e.toLowerCase())}function r(e){return"01234567".indexOf(e)}class h{constructor(e,t){this.source=e,this.errorHandler=t,this.trackComment=!1,this.isModule=!1,this.length=e.length,this.index=0,this.lineNumber=e.length>0?1:0,this.lineStart=0,this.curlyStack=[]}saveState(){return{index:this.index,lineNumber:this.lineNumber,lineStart:this.lineStart,curlyStack:this.curlyStack.slice()}}restoreState(e){this.index=e.index,this.lineNumber=e.lineNumber,this.lineStart=e.lineStart,this.curlyStack=e.curlyStack}eof(){return this.index>=this.length}throwUnexpectedToken(e=i.UnexpectedTokenIllegal){return this.errorHandler.throwError(this.index,this.lineNumber,this.index-this.lineStart+1,e)}_tolerateUnexpectedToken(e=i.UnexpectedTokenIllegal){this.errorHandler.tolerateError(this.index,this.lineNumber,this.index-this.lineStart+1,e)}_skipSingleLineComment(e){let i=[],s=0,n=null;for(this.trackComment&&(i=[],s=this.index-e,n={start:{line:this.lineNumber,column:this.index-this.lineStart-e},end:{line:0,column:0}});!this.eof();){const r=this.source.charCodeAt(this.index);if(++this.index,t.isLineTerminator(r)){if(n){n.end={line:this.lineNumber,column:this.index-this.lineStart-1};const t={multiLine:!1,slice:[s+e,this.index-1],range:[s,this.index-1],loc:n};i.push(t)}return 13===r&&10===this.source.charCodeAt(this.index)&&++this.index,++this.lineNumber,this.lineStart=this.index,i}}if(n){n.end={line:this.lineNumber,column:this.index-this.lineStart};const t={multiLine:!1,slice:[s+e,this.index],range:[s,this.index],loc:n};i.push(t)}return i}_skipMultiLineComment(){const e=[];let i=0,s=null;for(this.trackComment&&(i=this.index-2,s={start:{line:this.lineNumber,column:this.index-this.lineStart-2},end:{line:0,column:0}});!this.eof();){const n=this.source.charCodeAt(this.index);if(t.isLineTerminator(n))13===n&&10===this.source.charCodeAt(this.index+1)&&++this.index,++this.lineNumber,++this.index,this.lineStart=this.index;else if(42===n){if(47===this.source.charCodeAt(this.index+1)){if(this.index+=2,s){s.end={line:this.lineNumber,column:this.index-this.lineStart};const t={multiLine:!0,slice:[i+2,this.index-2],range:[i,this.index],loc:s};e.push(t)}return e}++this.index}else++this.index}if(s){s.end={line:this.lineNumber,column:this.index-this.lineStart};const t={multiLine:!0,slice:[i+2,this.index],range:[i,this.index],loc:s};e.push(t)}return this._tolerateUnexpectedToken(),e}scanComments(){let e=null;this.trackComment&&(e=[]);let i=0===this.index;for(;!this.eof();){let s=this.source.charCodeAt(this.index);if(t.isWhiteSpace(s))++this.index;else if(t.isLineTerminator(s))++this.index,13===s&&10===this.source.charCodeAt(this.index)&&++this.index,++this.lineNumber,this.lineStart=this.index,i=!0;else if(47===s)if(s=this.source.charCodeAt(this.index+1),47===s){this.index+=2;const t=this._skipSingleLineComment(2);e&&(e=e.concat(t)),i=!0}else{if(42!==s)break;{this.index+=2;const t=this._skipMultiLineComment();e&&(e=e.concat(t))}}else if(i&&45===s){if(45!==this.source.charCodeAt(this.index+1)||62!==this.source.charCodeAt(this.index+2))break;{this.index+=3;const t=this._skipSingleLineComment(3);e&&(e=e.concat(t))}}else{if(60!==s||this.isModule)break;if("!--"!==this.source.slice(this.index+1,this.index+4))break;{this.index+=4;const t=this._skipSingleLineComment(4);e&&(e=e.concat(t))}}}return e}_isKeyword(e){switch((e=e.toLowerCase()).length){case 2:return"if"===e||"in"===e;case 3:return"var"===e||"for"===e;case 4:return"else"===e;case 5:return"break"===e;case 6:return"return"===e;case 8:return"function"===e||"continue"===e;default:return!1}}_codePointAt(e){let t=this.source.charCodeAt(e);if(t>=55296&&t<=56319){const i=this.source.charCodeAt(e+1);if(i>=56320&&i<=57343){t=1024*(t-55296)+i-56320+65536}}return t}_scanHexEscape(e){const i="u"===e?4:2;let s=0;for(let r=0;r<i;++r){if(this.eof()||!t.isHexDigit(this.source.charCodeAt(this.index)))return null;s=16*s+n(this.source[this.index++])}return String.fromCharCode(s)}_scanUnicodeCodePointEscape(){let e=this.source[this.index],i=0;for("}"===e&&this.throwUnexpectedToken();!this.eof()&&(e=this.source[this.index++],t.isHexDigit(e.charCodeAt(0)));)i=16*i+n(e);return(i>1114111||"}"!==e)&&this.throwUnexpectedToken(),t.fromCodePoint(i)}_getIdentifier(){const e=this.index++;for(;!this.eof();){const i=this.source.charCodeAt(this.index);if(92===i)return this.index=e,this._getComplexIdentifier();if(i>=55296&&i<57343)return this.index=e,this._getComplexIdentifier();if(!t.isIdentifierPart(i))break;++this.index}return this.source.slice(e,this.index)}_getComplexIdentifier(){let e,i=this._codePointAt(this.index),s=t.fromCodePoint(i);for(this.index+=s.length,92===i&&(117!==this.source.charCodeAt(this.index)&&this.throwUnexpectedToken(),++this.index,"{"===this.source[this.index]?(++this.index,e=this._scanUnicodeCodePointEscape()):(e=this._scanHexEscape("u"),null!==e&&"\\"!==e&&t.isIdentifierStart(e.charCodeAt(0))||this.throwUnexpectedToken()),s=e);!this.eof()&&(i=this._codePointAt(this.index),t.isIdentifierPart(i));)e=t.fromCodePoint(i),s+=e,this.index+=e.length,92===i&&(s=s.substr(0,s.length-1),117!==this.source.charCodeAt(this.index)&&this.throwUnexpectedToken(),++this.index,"{"===this.source[this.index]?(++this.index,e=this._scanUnicodeCodePointEscape()):(e=this._scanHexEscape("u"),null!==e&&"\\"!==e&&t.isIdentifierPart(e.charCodeAt(0))||this.throwUnexpectedToken()),s+=e);return s}_octalToDecimal(e){let i="0"!==e,s=r(e);return!this.eof()&&t.isOctalDigit(this.source.charCodeAt(this.index))&&(i=!0,s=8*s+r(this.source[this.index++]),"0123".includes(e)&&!this.eof()&&t.isOctalDigit(this.source.charCodeAt(this.index))&&(s=8*s+r(this.source[this.index++]))),{code:s,octal:i}}_scanIdentifier(){let e;const t=this.index,n=92===this.source.charCodeAt(t)?this._getComplexIdentifier():this._getIdentifier();if(e=1===n.length?s.Identifier:this._isKeyword(n)?s.Keyword:"null"===n.toLowerCase()?s.NullLiteral:"true"===n.toLowerCase()||"false"===n.toLowerCase()?s.BooleanLiteral:s.Identifier,e!==s.Identifier&&t+n.length!==this.index){const e=this.index;this.index=t,this._tolerateUnexpectedToken(i.InvalidEscapedReservedWord),this.index=e}return{type:e,value:n,lineNumber:this.lineNumber,lineStart:this.lineStart,start:t,end:this.index}}_scanPunctuator(){const e=this.index;let t=this.source[this.index];switch(t){case"(":case"{":"{"===t&&this.curlyStack.push("{"),++this.index;break;case".":case")":case";":case",":case"[":case"]":case":":case"?":case"~":++this.index;break;case"}":++this.index,this.curlyStack.pop();break;default:t=this.source.substr(this.index,4),">>>="===t?this.index+=4:(t=t.substr(0,3),"==="===t||"!=="===t||">>>"===t||"<<="===t||">>="===t||"**="===t?this.index+=3:(t=t.substr(0,2),"&&"===t||"||"===t||"=="===t||"!="===t||"+="===t||"-="===t||"*="===t||"/="===t||"++"===t||"--"===t||"<<"===t||">>"===t||"&="===t||"|="===t||"^="===t||"%="===t||"<="===t||">="===t||"=>"===t||"**"===t?this.index+=2:(t=this.source[this.index],"<>=!+-*%&|^/".includes(t)&&++this.index)))}return this.index===e&&this.throwUnexpectedToken(),{type:s.Punctuator,value:t,lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}}_scanHexLiteral(e){let i="";for(;!this.eof()&&t.isHexDigit(this.source.charCodeAt(this.index));)i+=this.source[this.index++];return 0===i.length&&this.throwUnexpectedToken(),t.isIdentifierStart(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(),{type:s.NumericLiteral,value:parseInt("0x"+i,16),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}}_scanBinaryLiteral(e){let i="";for(;!this.eof();){const e=this.source[this.index];if("0"!==e&&"1"!==e)break;i+=this.source[this.index++]}if(0===i.length&&this.throwUnexpectedToken(),!this.eof()){const e=this.source.charCodeAt(this.index);(t.isIdentifierStart(e)||t.isDecimalDigit(e))&&this.throwUnexpectedToken()}return{type:s.NumericLiteral,value:parseInt(i,2),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}}_scanOctalLiteral(e,i){let n="",r=!1;for(t.isOctalDigit(e.charCodeAt(0))?(r=!0,n="0"+this.source[this.index++]):++this.index;!this.eof()&&t.isOctalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];return r||0!==n.length||this.throwUnexpectedToken(),(t.isIdentifierStart(this.source.charCodeAt(this.index))||t.isDecimalDigit(this.source.charCodeAt(this.index)))&&this.throwUnexpectedToken(),{type:s.NumericLiteral,value:parseInt(n,8),octal:r,lineNumber:this.lineNumber,lineStart:this.lineStart,start:i,end:this.index}}_scanNumericLiteral(){const i=this.index;let n=this.source[i];e(t.isDecimalDigit(n.charCodeAt(0))||"."===n,"Numeric literal must start with a decimal digit or a decimal point");let r="";if("."!==n){if(r=this.source[this.index++],n=this.source[this.index],"0"===r){if("x"===n||"X"===n)return++this.index,this._scanHexLiteral(i);if("b"===n||"B"===n)return++this.index,this._scanBinaryLiteral(i);if("o"===n||"O"===n)return this._scanOctalLiteral(n,i)}for(;t.isDecimalDigit(this.source.charCodeAt(this.index));)r+=this.source[this.index++];n=this.source[this.index]}if("."===n){for(r+=this.source[this.index++];t.isDecimalDigit(this.source.charCodeAt(this.index));)r+=this.source[this.index++];n=this.source[this.index]}if("e"===n||"E"===n)if(r+=this.source[this.index++],n=this.source[this.index],"+"!==n&&"-"!==n||(r+=this.source[this.index++]),t.isDecimalDigit(this.source.charCodeAt(this.index)))for(;t.isDecimalDigit(this.source.charCodeAt(this.index));)r+=this.source[this.index++];else this.throwUnexpectedToken();return t.isIdentifierStart(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(),{type:s.NumericLiteral,value:parseFloat(r),lineNumber:this.lineNumber,lineStart:this.lineStart,start:i,end:this.index}}_scanStringLiteral(){const n=this.index;let r=this.source[n];e("'"===r||'"'===r,"String literal must starts with a quote"),++this.index;let h=!1,c="";for(;!this.eof();){let e=this.source[this.index++];if(e===r){r="";break}if("\\"===e)if(e=this.source[this.index++],e&&t.isLineTerminator(e.charCodeAt(0)))++this.lineNumber,"\r"===e&&"\n"===this.source[this.index]&&++this.index,this.lineStart=this.index;else switch(e){case"u":if("{"===this.source[this.index])++this.index,c+=this._scanUnicodeCodePointEscape();else{const t=this._scanHexEscape(e);null===t&&this.throwUnexpectedToken(),c+=t}break;case"x":{const t=this._scanHexEscape(e);null===t&&this.throwUnexpectedToken(i.InvalidHexEscapeSequence),c+=t;break}case"n":c+="\n";break;case"r":c+="\r";break;case"t":c+="\t";break;case"b":c+="\b";break;case"f":c+="\f";break;case"v":c+="\v";break;case"8":case"9":c+=e,this._tolerateUnexpectedToken();break;default:if(e&&t.isOctalDigit(e.charCodeAt(0))){const t=this._octalToDecimal(e);h=t.octal||h,c+=String.fromCharCode(t.code)}else c+=e}else{if(t.isLineTerminator(e.charCodeAt(0)))break;c+=e}}return""!==r&&(this.index=n,this.throwUnexpectedToken()),{type:s.StringLiteral,value:c,octal:h,lineNumber:this.lineNumber,lineStart:this.lineStart,start:n,end:this.index}}_scanTemplate(){let e="",n=!1;const r=this.index,h="`"===this.source[r];let c=!1,o=2;for(++this.index;!this.eof();){let s=this.source[this.index++];if("`"===s){o=1,c=!0,n=!0;break}if("$"===s){if("{"===this.source[this.index]){this.curlyStack.push("${"),++this.index,n=!0;break}e+=s}else if("\\"===s)if(s=this.source[this.index++],t.isLineTerminator(s.charCodeAt(0)))++this.lineNumber,"\r"===s&&"\n"===this.source[this.index]&&++this.index,this.lineStart=this.index;else switch(s){case"n":e+="\n";break;case"r":e+="\r";break;case"t":e+="\t";break;case"u":if("{"===this.source[this.index])++this.index,e+=this._scanUnicodeCodePointEscape();else{const t=this.index,i=this._scanHexEscape(s);null!==i?e+=i:(this.index=t,e+=s)}break;case"x":{const t=this._scanHexEscape(s);null===t&&this.throwUnexpectedToken(i.InvalidHexEscapeSequence),e+=t;break}case"b":e+="\b";break;case"f":e+="\f";break;case"v":e+="\v";break;default:"0"===s?(t.isDecimalDigit(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(i.TemplateOctalLiteral),e+="\0"):t.isOctalDigit(s.charCodeAt(0))?this.throwUnexpectedToken(i.TemplateOctalLiteral):e+=s}else t.isLineTerminator(s.charCodeAt(0))?(++this.lineNumber,"\r"===s&&"\n"===this.source[this.index]&&++this.index,this.lineStart=this.index,e+="\n"):e+=s}return n||this.throwUnexpectedToken(),h||this.curlyStack.pop(),{type:s.Template,value:this.source.slice(r+1,this.index-o),cooked:e,head:h,tail:c,lineNumber:this.lineNumber,lineStart:this.lineStart,start:r,end:this.index}}_testRegExp(e,t){const s="";let n=e;t.includes("u")&&(n=n.replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g,((e,t,n)=>{const r=parseInt(t||n,16);return r>1114111&&this.throwUnexpectedToken(i.InvalidRegExp),r<=65535?String.fromCharCode(r):s})).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,s));try{RegExp(n)}catch(r){this.throwUnexpectedToken(i.InvalidRegExp)}try{return new RegExp(e,t)}catch(h){return null}}_scanRegExpBody(){let s=this.source[this.index];e("/"===s,"Regular expression literal must start with a slash");let n=this.source[this.index++],r=!1,h=!1;for(;!this.eof();)if(s=this.source[this.index++],n+=s,"\\"===s)s=this.source[this.index++],t.isLineTerminator(s.charCodeAt(0))&&this.throwUnexpectedToken(i.UnterminatedRegExp),n+=s;else if(t.isLineTerminator(s.charCodeAt(0)))this.throwUnexpectedToken(i.UnterminatedRegExp);else if(r)"]"===s&&(r=!1);else{if("/"===s){h=!0;break}"["===s&&(r=!0)}return h||this.throwUnexpectedToken(i.UnterminatedRegExp),n.substr(1,n.length-2)}_scanRegExpFlags(){let e="",i="";for(;!this.eof();){let s=this.source[this.index];if(!t.isIdentifierPart(s.charCodeAt(0)))break;if(++this.index,"\\"!==s||this.eof())i+=s,e+=s;else if(s=this.source[this.index],"u"===s){++this.index;let t=this.index;const s=this._scanHexEscape("u");if(null!==s)for(i+=s,e+="\\u";t<this.index;++t)e+=this.source[t];else this.index=t,i+="u",e+="\\u";this._tolerateUnexpectedToken()}else e+="\\",this._tolerateUnexpectedToken()}return i}scanRegExp(){const e=this.index,t=this._scanRegExpBody(),i=this._scanRegExpFlags(),n=this._testRegExp(t,i);return{type:s.RegularExpression,value:"",pattern:t,flags:i,regex:n,lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}}lex(){if(this.eof())return{type:s.EOF,value:"",lineNumber:this.lineNumber,lineStart:this.lineStart,start:this.index,end:this.index};const e=this.source.charCodeAt(this.index);return t.isIdentifierStart(e)?this._scanIdentifier():40===e||41===e||59===e?this._scanPunctuator():39===e||34===e?this._scanStringLiteral():46===e?t.isDecimalDigit(this.source.charCodeAt(this.index+1))?this._scanNumericLiteral():this._scanPunctuator():t.isDecimalDigit(e)?this._scanNumericLiteral():96===e||125===e&&"${"===this.curlyStack[this.curlyStack.length-1]?this._scanTemplate():e>=55296&&e<57343&&t.isIdentifierStart(this._codePointAt(this.index))?this._scanIdentifier():this._scanPunctuator()}}export{h as Scanner};
|