You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					166 lines
				
				5.5 KiB
			
		
		
			
		
	
	
					166 lines
				
				5.5 KiB
			| 
											3 years ago
										 | /* | ||
|  |   Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> | ||
|  | 
 | ||
|  |   Redistribution and use in source and binary forms, with or without | ||
|  |   modification, are permitted provided that the following conditions are met: | ||
|  | 
 | ||
|  |     * Redistributions of source code must retain the above copyright | ||
|  |       notice, this list of conditions and the following disclaimer. | ||
|  |     * Redistributions in binary form must reproduce the above copyright | ||
|  |       notice, this list of conditions and the following disclaimer in the | ||
|  |       documentation and/or other materials provided with the distribution. | ||
|  | 
 | ||
|  |   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
|  |   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
|  |   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
|  |   ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY | ||
|  |   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
|  |   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
|  |   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
|  |   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
|  |   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
|  |   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
|  | */ | ||
|  | 
 | ||
|  | (function () { | ||
|  |     'use strict'; | ||
|  | 
 | ||
|  |     var code = require('./code'); | ||
|  | 
 | ||
|  |     function isStrictModeReservedWordES6(id) { | ||
|  |         switch (id) { | ||
|  |         case 'implements': | ||
|  |         case 'interface': | ||
|  |         case 'package': | ||
|  |         case 'private': | ||
|  |         case 'protected': | ||
|  |         case 'public': | ||
|  |         case 'static': | ||
|  |         case 'let': | ||
|  |             return true; | ||
|  |         default: | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function isKeywordES5(id, strict) { | ||
|  |         // yield should not be treated as keyword under non-strict mode.
 | ||
|  |         if (!strict && id === 'yield') { | ||
|  |             return false; | ||
|  |         } | ||
|  |         return isKeywordES6(id, strict); | ||
|  |     } | ||
|  | 
 | ||
|  |     function isKeywordES6(id, strict) { | ||
|  |         if (strict && isStrictModeReservedWordES6(id)) { | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         switch (id.length) { | ||
|  |         case 2: | ||
|  |             return (id === 'if') || (id === 'in') || (id === 'do'); | ||
|  |         case 3: | ||
|  |             return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try'); | ||
|  |         case 4: | ||
|  |             return (id === 'this') || (id === 'else') || (id === 'case') || | ||
|  |                 (id === 'void') || (id === 'with') || (id === 'enum'); | ||
|  |         case 5: | ||
|  |             return (id === 'while') || (id === 'break') || (id === 'catch') || | ||
|  |                 (id === 'throw') || (id === 'const') || (id === 'yield') || | ||
|  |                 (id === 'class') || (id === 'super'); | ||
|  |         case 6: | ||
|  |             return (id === 'return') || (id === 'typeof') || (id === 'delete') || | ||
|  |                 (id === 'switch') || (id === 'export') || (id === 'import'); | ||
|  |         case 7: | ||
|  |             return (id === 'default') || (id === 'finally') || (id === 'extends'); | ||
|  |         case 8: | ||
|  |             return (id === 'function') || (id === 'continue') || (id === 'debugger'); | ||
|  |         case 10: | ||
|  |             return (id === 'instanceof'); | ||
|  |         default: | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function isReservedWordES5(id, strict) { | ||
|  |         return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); | ||
|  |     } | ||
|  | 
 | ||
|  |     function isReservedWordES6(id, strict) { | ||
|  |         return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); | ||
|  |     } | ||
|  | 
 | ||
|  |     function isRestrictedWord(id) { | ||
|  |         return id === 'eval' || id === 'arguments'; | ||
|  |     } | ||
|  | 
 | ||
|  |     function isIdentifierNameES5(id) { | ||
|  |         var i, iz, ch; | ||
|  | 
 | ||
|  |         if (id.length === 0) { return false; } | ||
|  | 
 | ||
|  |         ch = id.charCodeAt(0); | ||
|  |         if (!code.isIdentifierStartES5(ch)) { | ||
|  |             return false; | ||
|  |         } | ||
|  | 
 | ||
|  |         for (i = 1, iz = id.length; i < iz; ++i) { | ||
|  |             ch = id.charCodeAt(i); | ||
|  |             if (!code.isIdentifierPartES5(ch)) { | ||
|  |                 return false; | ||
|  |             } | ||
|  |         } | ||
|  |         return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     function decodeUtf16(lead, trail) { | ||
|  |         return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; | ||
|  |     } | ||
|  | 
 | ||
|  |     function isIdentifierNameES6(id) { | ||
|  |         var i, iz, ch, lowCh, check; | ||
|  | 
 | ||
|  |         if (id.length === 0) { return false; } | ||
|  | 
 | ||
|  |         check = code.isIdentifierStartES6; | ||
|  |         for (i = 0, iz = id.length; i < iz; ++i) { | ||
|  |             ch = id.charCodeAt(i); | ||
|  |             if (0xD800 <= ch && ch <= 0xDBFF) { | ||
|  |                 ++i; | ||
|  |                 if (i >= iz) { return false; } | ||
|  |                 lowCh = id.charCodeAt(i); | ||
|  |                 if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) { | ||
|  |                     return false; | ||
|  |                 } | ||
|  |                 ch = decodeUtf16(ch, lowCh); | ||
|  |             } | ||
|  |             if (!check(ch)) { | ||
|  |                 return false; | ||
|  |             } | ||
|  |             check = code.isIdentifierPartES6; | ||
|  |         } | ||
|  |         return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     function isIdentifierES5(id, strict) { | ||
|  |         return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); | ||
|  |     } | ||
|  | 
 | ||
|  |     function isIdentifierES6(id, strict) { | ||
|  |         return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); | ||
|  |     } | ||
|  | 
 | ||
|  |     module.exports = { | ||
|  |         isKeywordES5: isKeywordES5, | ||
|  |         isKeywordES6: isKeywordES6, | ||
|  |         isReservedWordES5: isReservedWordES5, | ||
|  |         isReservedWordES6: isReservedWordES6, | ||
|  |         isRestrictedWord: isRestrictedWord, | ||
|  |         isIdentifierNameES5: isIdentifierNameES5, | ||
|  |         isIdentifierNameES6: isIdentifierNameES6, | ||
|  |         isIdentifierES5: isIdentifierES5, | ||
|  |         isIdentifierES6: isIdentifierES6 | ||
|  |     }; | ||
|  | }()); | ||
|  | /* vim: set sw=4 ts=4 et tw=80 : */ |