Best JavaScript code snippet using playwright-internal
function-node.js
Source:function-node.js
...204 // throw new Error(`Declaration of ${name} not found`);205 }206 return type;207 }208 getConstantType(constantName) {209 if (this.constantTypes[constantName]) {210 const type = this.constantTypes[constantName];211 if (type === 'Float') {212 return 'Number';213 } else {214 return type;215 }216 }217 throw new Error(`Type for constant "${ constantName }" not declared`);218 }219 /**220 * @desc Return the name of the *user argument*(subKernel argument) corresponding221 * to the argument supplied to the kernel222 *223 * @param {String} name - Name of the argument224 * @returns {String} Name of the parameter225 */226 getKernelArgumentName(name) {227 if (!this.lookupArgumentSynonym) return null;228 const argumentIndex = this.argumentNames.indexOf(name);229 if (argumentIndex === -1) return null;230 return this.lookupArgumentSynonym('kernel', this.name, name);231 }232 toString() {233 if (this._string) return this._string;234 return this._string = this.astGeneric(this.getJsAST(), []).join('').trim();235 }236 toJSON() {237 const settings = {238 source: this.source,239 name: this.name,240 constants: this.constants,241 constantTypes: this.constantTypes,242 isRootKernel: this.isRootKernel,243 isSubKernel: this.isSubKernel,244 debug: this.debug,245 output: this.output,246 loopMaxIterations: this.loopMaxIterations,247 argumentNames: this.argumentNames,248 argumentTypes: this.argumentTypes,249 argumentSizes: this.argumentSizes,250 returnType: this.returnType,251 leadingReturnStatement: this.leadingReturnStatement,252 followingReturnStatement: this.followingReturnStatement,253 };254 return {255 ast: this.ast,256 settings257 };258 }259 /**260 * Recursively looks up type for ast expression until it's found261 * @param ast262 * @returns {String|null}263 */264 getType(ast) {265 if (Array.isArray(ast)) {266 return this.getType(ast[ast.length - 1]);267 }268 switch (ast.type) {269 case 'BlockStatement':270 return this.getType(ast.body);271 case 'ArrayExpression':272 return `Array(${ ast.elements.length })`;273 case 'Literal':274 const literalKey = `${ast.start},${ast.end}`;275 if (this.literalTypes[literalKey]) {276 return this.literalTypes[literalKey];277 }278 if (Number.isInteger(ast.value)) {279 return 'LiteralInteger';280 } else if (ast.value === true || ast.value === false) {281 return 'Boolean';282 } else {283 return 'Number';284 }285 case 'AssignmentExpression':286 return this.getType(ast.left);287 case 'CallExpression':288 if (this.isAstMathFunction(ast)) {289 return 'Number';290 }291 if (!ast.callee || !ast.callee.name) {292 if (ast.callee.type === 'SequenceExpression' && ast.callee.expressions[ast.callee.expressions.length - 1].property.name) {293 return this.lookupReturnType(ast.callee.expressions[ast.callee.expressions.length - 1].property.name, ast, this);294 }295 throw this.astErrorOutput('Unknown call expression', ast);296 }297 if (ast.callee && ast.callee.name) {298 return this.lookupReturnType(ast.callee.name, ast, this);299 }300 throw this.astErrorOutput(`Unhandled getType Type "${ ast.type }"`, ast);301 case 'BinaryExpression':302 // modulos is Number303 switch (ast.operator) {304 case '%':305 return 'Number';306 case '>':307 case '<':308 return 'Boolean';309 case '&':310 case '|':311 case '^':312 case '<<':313 case '>>':314 case '>>>':315 return 'Integer';316 }317 const type = this.getType(ast.left);318 return typeLookupMap[type] || type;319 case 'UpdateExpression':320 return this.getType(ast.argument);321 case 'UnaryExpression':322 if (ast.operator === '~') {323 return 'Integer';324 }325 return this.getType(ast.argument);326 case 'VariableDeclaration':327 return this.getType(ast.declarations[0]);328 case 'VariableDeclarator':329 return this.getType(ast.id);330 case 'Identifier':331 if (this.isAstVariable(ast)) {332 const signature = this.getVariableSignature(ast);333 if (signature === 'value') {334 if (this.argumentNames.indexOf(ast.name) > -1) {335 return this.getVariableType(ast.name);336 } else if (this.declarations[ast.name]) {337 return this.declarations[ast.name].type;338 }339 }340 }341 if (ast.name === 'Infinity') {342 return 'Number';343 }344 const origin = this.findIdentifierOrigin(ast);345 if (origin && origin.init) {346 return this.getType(origin.init);347 }348 return null;349 case 'ReturnStatement':350 return this.getType(ast.argument);351 case 'MemberExpression':352 if (this.isAstMathFunction(ast)) {353 switch (ast.property.name) {354 case 'ceil':355 return 'Integer';356 case 'floor':357 return 'Integer';358 case 'round':359 return 'Integer';360 }361 return 'Number';362 }363 if (this.isAstVariable(ast)) {364 const variableSignature = this.getVariableSignature(ast);365 switch (variableSignature) {366 case 'value[]':367 return typeLookupMap[this.getVariableType(ast.object.name)];368 case 'value[][]':369 return typeLookupMap[this.getVariableType(ast.object.object.name)];370 case 'value[][][]':371 return typeLookupMap[this.getVariableType(ast.object.object.object.name)];372 case 'value[][][][]':373 return typeLookupMap[this.getVariableType(ast.object.object.object.object.name)];374 case 'this.thread.value':375 return 'Integer';376 case 'this.output.value':377 return this.dynamicOutput ? 'Integer' : 'LiteralInteger';378 case 'this.constants.value':379 return this.getConstantType(ast.property.name);380 case 'this.constants.value[]':381 return typeLookupMap[this.getConstantType(ast.object.property.name)];382 case 'this.constants.value[][]':383 return typeLookupMap[this.getConstantType(ast.object.object.property.name)];384 case 'this.constants.value[][][]':385 return typeLookupMap[this.getConstantType(ast.object.object.object.property.name)];386 case 'this.constants.value[][][][]':387 return typeLookupMap[this.getConstantType(ast.object.object.object.object.property.name)];388 case 'fn()[]':389 return typeLookupMap[this.getType(ast.object)];390 case 'fn()[][]':391 return typeLookupMap[this.getType(ast.object)];392 case 'fn()[][][]':393 return typeLookupMap[this.getType(ast.object)];394 case 'value.value':395 if (this.isAstMathVariable(ast)) {396 return 'Number';397 }398 switch (ast.property.name) {399 case 'r':400 return typeLookupMap[this.getVariableType(ast.object.name)];401 case 'g':402 return typeLookupMap[this.getVariableType(ast.object.name)];403 case 'b':404 return typeLookupMap[this.getVariableType(ast.object.name)];405 case 'a':406 return typeLookupMap[this.getVariableType(ast.object.name)];407 }408 case '[][]':409 return 'Number';410 }411 throw this.astErrorOutput('Unhandled getType MemberExpression', ast);412 }413 throw this.astErrorOutput('Unhandled getType MemberExpression', ast);414 case 'ConditionalExpression':415 return this.getType(ast.consequent);416 case 'FunctionDeclaration':417 case 'FunctionExpression':418 const lastReturn = this.findLastReturn(ast.body);419 if (lastReturn) {420 return this.getType(lastReturn);421 }422 return null;423 case 'IfStatement':424 return this.getType(ast.consequent);425 default:426 throw this.astErrorOutput(`Unhandled getType Type "${ ast.type }"`, ast);427 }428 }429 isAstMathVariable(ast) {430 const mathProperties = [431 'E',432 'PI',433 'SQRT2',434 'SQRT1_2',435 'LN2',436 'LN10',437 'LOG2E',438 'LOG10E',439 ];440 return ast.type === 'MemberExpression' &&441 ast.object && ast.object.type === 'Identifier' &&442 ast.object.name === 'Math' &&443 ast.property &&444 ast.property.type === 'Identifier' &&445 mathProperties.indexOf(ast.property.name) > -1;446 }447 isAstMathFunction(ast) {448 const mathFunctions = [449 'abs',450 'acos',451 'asin',452 'atan',453 'atan2',454 'ceil',455 'cos',456 'exp',457 'floor',458 'log',459 'log2',460 'max',461 'min',462 'pow',463 'random',464 'round',465 'sign',466 'sin',467 'sqrt',468 'tan',469 ];470 return ast.type === 'CallExpression' &&471 ast.callee &&472 ast.callee.type === 'MemberExpression' &&473 ast.callee.object &&474 ast.callee.object.type === 'Identifier' &&475 ast.callee.object.name === 'Math' &&476 ast.callee.property &&477 ast.callee.property.type === 'Identifier' &&478 mathFunctions.indexOf(ast.callee.property.name) > -1;479 }480 isAstVariable(ast) {481 return ast.type === 'Identifier' || ast.type === 'MemberExpression';482 }483 isSafe(ast) {484 return this.isSafeDependencies(this.getDependencies(ast));485 }486 isSafeDependencies(dependencies) {487 return dependencies && dependencies.every ? dependencies.every(dependency => dependency.isSafe) : true;488 }489 getDependencies(ast, dependencies, isNotSafe) {490 if (!dependencies) {491 dependencies = [];492 }493 if (!ast) return null;494 if (Array.isArray(ast)) {495 for (let i = 0; i < ast.length; i++) {496 this.getDependencies(ast[i], dependencies, isNotSafe);497 }498 return dependencies;499 }500 switch (ast.type) {501 case 'Literal':502 dependencies.push({503 origin: 'literal',504 value: ast.value,505 isSafe: isNotSafe === true ? false : ast.value > -Infinity && ast.value < Infinity && !isNaN(ast.value)506 });507 break;508 case 'VariableDeclarator':509 return this.getDependencies(ast.init, dependencies, isNotSafe);510 case 'Identifier':511 if (this.declarations[ast.name]) {512 dependencies.push({513 name: ast.name,514 origin: 'declaration',515 isSafe: isNotSafe ? false : this.isSafeDependencies(this.declarations[ast.name].dependencies),516 });517 } else if (this.argumentNames.indexOf(ast.name) > -1) {518 dependencies.push({519 name: ast.name,520 origin: 'argument',521 isSafe: false,522 });523 }524 break;525 case 'FunctionDeclaration':526 return this.getDependencies(ast.body.body[ast.body.body.length - 1], dependencies, isNotSafe);527 case 'ReturnStatement':528 return this.getDependencies(ast.argument, dependencies);529 case 'BinaryExpression':530 isNotSafe = (ast.operator === '/' || ast.operator === '*');531 this.getDependencies(ast.left, dependencies, isNotSafe);532 this.getDependencies(ast.right, dependencies, isNotSafe);533 return dependencies;534 case 'UnaryExpression':535 case 'UpdateExpression':536 return this.getDependencies(ast.argument, dependencies, isNotSafe);537 case 'VariableDeclaration':538 return this.getDependencies(ast.declarations, dependencies, isNotSafe);539 case 'ArrayExpression':540 dependencies.push({541 origin: 'declaration',542 isSafe: true,543 });544 return dependencies;545 case 'CallExpression':546 dependencies.push({547 origin: 'function',548 isSafe: true,549 });550 return dependencies;551 case 'MemberExpression':552 const details = this.getMemberExpressionDetails(ast);553 if (this.dynamicOutput && details.signature === 'this.output.value') {554 dependencies.push({555 name: details.name,556 origin: 'output',557 isSafe: false,558 });559 return dependencies;560 }561 if (details) {562 return details.type;563 }564 default:565 throw this.astErrorOutput(`Unhandled type ${ ast.type } in getAllVariables`, ast);566 }567 return dependencies;568 }569 getVariableSignature(ast) {570 if (!this.isAstVariable(ast)) {571 throw new Error(`ast of type "${ ast.type }" is not a variable signature`);572 }573 if (ast.type === 'Identifier') {574 return 'value';575 }576 const signature = [];577 while (true) {578 if (!ast) break;579 if (ast.computed) {580 signature.push('[]');581 } else if (ast.type === 'ThisExpression') {582 signature.unshift('this');583 } else if (ast.property && ast.property.name) {584 if (585 ast.property.name === 'x' ||586 ast.property.name === 'y' ||587 ast.property.name === 'z'588 ) {589 signature.unshift('.value');590 } else if (591 ast.property.name === 'constants' ||592 ast.property.name === 'thread' ||593 ast.property.name === 'output'594 ) {595 signature.unshift('.' + ast.property.name);596 } else {597 signature.unshift('.value');598 }599 } else if (ast.name) {600 signature.unshift('value');601 } else if (ast.callee && ast.callee.name) {602 signature.unshift('fn()');603 } else if (ast.elements) {604 signature.unshift('[]');605 } else {606 signature.unshift('unknown');607 }608 ast = ast.object;609 }610 const signatureString = signature.join('');611 const allowedExpressions = [612 'value',613 'value[]',614 'value[][]',615 'value[][][]',616 'value[][][][]',617 'value.value',618 'this.thread.value',619 'this.output.value',620 'this.constants.value',621 'this.constants.value[]',622 'this.constants.value[][]',623 'this.constants.value[][][]',624 'this.constants.value[][][][]',625 'fn()[]',626 'fn()[][]',627 'fn()[][][]',628 '[][]',629 ];630 if (allowedExpressions.indexOf(signatureString) > -1) {631 return signatureString;632 }633 return null;634 }635 build() {636 return this.toString().length > 0;637 }638 /**639 * @desc Parses the abstract syntax tree for generically to its respective function640 * @param {Object} ast - the AST object to parse641 * @param {Array} retArr - return array string642 * @returns {Array} the parsed string array643 */644 astGeneric(ast, retArr) {645 if (ast === null) {646 throw this.astErrorOutput('NULL ast', ast);647 } else {648 if (Array.isArray(ast)) {649 for (let i = 0; i < ast.length; i++) {650 this.astGeneric(ast[i], retArr);651 }652 return retArr;653 }654 switch (ast.type) {655 case 'FunctionDeclaration':656 return this.astFunctionDeclaration(ast, retArr);657 case 'FunctionExpression':658 return this.astFunctionExpression(ast, retArr);659 case 'ReturnStatement':660 return this.astReturnStatement(ast, retArr);661 case 'Literal':662 return this.astLiteral(ast, retArr);663 case 'BinaryExpression':664 return this.astBinaryExpression(ast, retArr);665 case 'Identifier':666 return this.astIdentifierExpression(ast, retArr);667 case 'AssignmentExpression':668 return this.astAssignmentExpression(ast, retArr);669 case 'ExpressionStatement':670 return this.astExpressionStatement(ast, retArr);671 case 'EmptyStatement':672 return this.astEmptyStatement(ast, retArr);673 case 'BlockStatement':674 return this.astBlockStatement(ast, retArr);675 case 'IfStatement':676 return this.astIfStatement(ast, retArr);677 case 'SwitchStatement':678 return this.astSwitchStatement(ast, retArr);679 case 'BreakStatement':680 return this.astBreakStatement(ast, retArr);681 case 'ContinueStatement':682 return this.astContinueStatement(ast, retArr);683 case 'ForStatement':684 return this.astForStatement(ast, retArr);685 case 'WhileStatement':686 return this.astWhileStatement(ast, retArr);687 case 'DoWhileStatement':688 return this.astDoWhileStatement(ast, retArr);689 case 'VariableDeclaration':690 return this.astVariableDeclaration(ast, retArr);691 case 'VariableDeclarator':692 return this.astVariableDeclarator(ast, retArr);693 case 'ThisExpression':694 return this.astThisExpression(ast, retArr);695 case 'SequenceExpression':696 return this.astSequenceExpression(ast, retArr);697 case 'UnaryExpression':698 return this.astUnaryExpression(ast, retArr);699 case 'UpdateExpression':700 return this.astUpdateExpression(ast, retArr);701 case 'LogicalExpression':702 return this.astLogicalExpression(ast, retArr);703 case 'MemberExpression':704 return this.astMemberExpression(ast, retArr);705 case 'CallExpression':706 return this.astCallExpression(ast, retArr);707 case 'ArrayExpression':708 return this.astArrayExpression(ast, retArr);709 case 'DebuggerStatement':710 return this.astDebuggerStatement(ast, retArr);711 case 'ConditionalExpression':712 return this.astConditionalExpression(ast, retArr);713 }714 throw this.astErrorOutput('Unknown ast type : ' + ast.type, ast);715 }716 }717 /**718 * @desc To throw the AST error, with its location.719 * @param {string} error - the error message output720 * @param {Object} ast - the AST object where the error is721 */722 astErrorOutput(error, ast) {723 if (typeof this.source !== 'string') {724 return new Error(error);725 }726 const debugString = utils.getAstString(this.source, ast);727 const leadingSource = this.source.substr(ast.start);728 const splitLines = leadingSource.split(/\n/);729 const lineBefore = splitLines.length > 0 ? splitLines[splitLines.length - 1] : 0;730 return new Error(`${error} on line ${ splitLines.length }, position ${ lineBefore.length }:\n ${ debugString }`);731 }732 astDebuggerStatement(arrNode, retArr) {733 return retArr;734 }735 astConditionalExpression(ast, retArr) {736 if (ast.type !== 'ConditionalExpression') {737 throw this.astErrorOutput('Not a conditional expression', ast);738 }739 retArr.push('(');740 this.astGeneric(ast.test, retArr);741 retArr.push('?');742 this.astGeneric(ast.consequent, retArr);743 retArr.push(':');744 this.astGeneric(ast.alternate, retArr);745 retArr.push(')');746 return retArr;747 }748 /**749 * @desc Parses the abstract syntax tree for to its *named function declaration*750 * @param {Object} ast - the AST object to parse751 * @param {Array} retArr - return array string752 * @returns {Array} the append retArr753 */754 astFunctionDeclaration(ast, retArr) {755 if (this.onNestedFunction) {756 let returnType = this.getType(ast);757 if (returnType === 'LiteralInteger') {758 returnType = 'Number';759 }760 this.onNestedFunction(utils.getAstString(this.source, ast), returnType);761 }762 return retArr;763 }764 astFunctionExpression(ast, retArr) {765 return retArr;766 }767 astReturnStatement(ast, retArr) {768 return retArr;769 }770 astLiteral(ast, retArr) {771 this.literalTypes[`${ast.start},${ast.end}`] = 'Number';772 return retArr;773 }774 astBinaryExpression(ast, retArr) {775 return retArr;776 }777 astIdentifierExpression(ast, retArr) {778 return retArr;779 }780 astAssignmentExpression(ast, retArr) {781 return retArr;782 }783 /**784 * @desc Parses the abstract syntax tree for *generic expression* statement785 * @param {Object} esNode - An ast Node786 * @param {Array} retArr - return array string787 * @returns {Array} the append retArr788 */789 astExpressionStatement(esNode, retArr) {790 this.astGeneric(esNode.expression, retArr);791 retArr.push(';');792 return retArr;793 }794 /**795 * @desc Parses the abstract syntax tree for an *Empty* Statement796 * @param {Object} eNode - An ast Node797 * @param {Array} retArr - return array string798 * @returns {Array} the append retArr799 */800 astEmptyStatement(eNode, retArr) {801 return retArr;802 }803 astBlockStatement(ast, retArr) {804 return retArr;805 }806 astIfStatement(ast, retArr) {807 return retArr;808 }809 astSwitchStatement(ast, retArr) {810 return retArr;811 }812 /**813 * @desc Parses the abstract syntax tree for *Break* Statement814 * @param {Object} brNode - An ast Node815 * @param {Array} retArr - return array string816 * @returns {Array} the append retArr817 */818 astBreakStatement(brNode, retArr) {819 retArr.push('break;');820 return retArr;821 }822 /**823 * @desc Parses the abstract syntax tree for *Continue* Statement824 * @param {Object} crNode - An ast Node825 * @param {Array} retArr - return array string826 * @returns {Array} the append retArr827 */828 astContinueStatement(crNode, retArr) {829 retArr.push('continue;\n');830 return retArr;831 }832 astForStatement(ast, retArr) {833 return retArr;834 }835 astWhileStatement(ast, retArr) {836 return retArr;837 }838 astDoWhileStatement(ast, retArr) {839 return retArr;840 }841 /**842 * @desc Parses the abstract syntax tree for *Variable Declaration*843 * @param {Object} varDecNode - An ast Node844 * @param {Array} retArr - return array string845 * @returns {Array} the append retArr846 */847 astVariableDeclaration(varDecNode, retArr) {848 const declarations = varDecNode.declarations;849 if (!declarations || !declarations[0] || !declarations[0].init) {850 throw this.astErrorOutput('Unexpected expression', varDecNode);851 }852 const result = [];853 const firstDeclaration = declarations[0];854 const init = firstDeclaration.init;855 let type = this.isState('in-for-loop-init') ? 'Integer' : this.getType(init);856 if (type === 'LiteralInteger') {857 // We had the choice to go either float or int, choosing float858 type = 'Number';859 }860 const markupType = typeMap[type];861 if (!markupType) {862 throw this.astErrorOutput(`Markup type ${ markupType } not handled`, varDecNode);863 }864 let dependencies = this.getDependencies(firstDeclaration.init);865 this.declarations[firstDeclaration.id.name] = Object.freeze({866 type,867 dependencies,868 isSafe: dependencies.every(dependency => dependency.isSafe)869 });870 const initResult = [`${type} user_${firstDeclaration.id.name}=`];871 this.astGeneric(init, initResult);872 result.push(initResult.join(''));873 // first declaration is done, now any added ones setup874 for (let i = 1; i < declarations.length; i++) {875 const declaration = declarations[i];876 dependencies = this.getDependencies(declaration);877 this.declarations[declaration.id.name] = Object.freeze({878 type,879 dependencies,880 isSafe: false881 });882 this.astGeneric(declaration, result);883 }884 retArr.push(retArr, result.join(','));885 retArr.push(';');886 return retArr;887 }888 /**889 * @desc Parses the abstract syntax tree for *Variable Declarator*890 * @param {Object} iVarDecNode - An ast Node891 * @param {Array} retArr - return array string892 * @returns {Array} the append retArr893 */894 astVariableDeclarator(iVarDecNode, retArr) {895 this.astGeneric(iVarDecNode.id, retArr);896 if (iVarDecNode.init !== null) {897 retArr.push('=');898 this.astGeneric(iVarDecNode.init, retArr);899 }900 return retArr;901 }902 astThisExpression(ast, retArr) {903 return retArr;904 }905 astSequenceExpression(sNode, retArr) {906 for (let i = 0; i < sNode.expressions.length; i++) {907 if (i > 0) {908 retArr.push(',');909 }910 this.astGeneric(sNode.expressions, retArr);911 }912 return retArr;913 }914 /**915 * @desc Parses the abstract syntax tree for *Unary* Expression916 * @param {Object} uNode - An ast Node917 * @param {Array} retArr - return array string918 * @returns {Array} the append retArr919 */920 astUnaryExpression(uNode, retArr) {921 const unaryResult = this.checkAndUpconvertBitwiseUnary(uNode, retArr);922 if (unaryResult) {923 return retArr;924 }925 if (uNode.prefix) {926 retArr.push(uNode.operator);927 this.astGeneric(uNode.argument, retArr);928 } else {929 this.astGeneric(uNode.argument, retArr);930 retArr.push(uNode.operator);931 }932 return retArr;933 }934 checkAndUpconvertBitwiseUnary(uNode, retArr) {}935 /**936 * @desc Parses the abstract syntax tree for *Update* Expression937 * @param {Object} uNode - An ast Node938 * @param {Array} retArr - return array string939 * @returns {Array} the append retArr940 */941 astUpdateExpression(uNode, retArr) {942 if (uNode.prefix) {943 retArr.push(uNode.operator);944 this.astGeneric(uNode.argument, retArr);945 } else {946 this.astGeneric(uNode.argument, retArr);947 retArr.push(uNode.operator);948 }949 return retArr;950 }951 /**952 * @desc Parses the abstract syntax tree for *Logical* Expression953 * @param {Object} logNode - An ast Node954 * @param {Array} retArr - return array string955 * @returns {Array} the append retArr956 */957 astLogicalExpression(logNode, retArr) {958 retArr.push('(');959 this.astGeneric(logNode.left, retArr);960 retArr.push(logNode.operator);961 this.astGeneric(logNode.right, retArr);962 retArr.push(')');963 return retArr;964 }965 astMemberExpression(ast, retArr) {966 return retArr;967 }968 astCallExpression(ast, retArr) {969 return retArr;970 }971 astArrayExpression(ast, retArr) {972 return retArr;973 }974 getMemberExpressionDetails(ast) {975 if (ast.type !== 'MemberExpression') {976 throw this.astErrorOutput(`Expression ${ ast.type } not a MemberExpression`, ast);977 }978 let name = null;979 let type = null;980 const variableSignature = this.getVariableSignature(ast);981 switch (variableSignature) {982 case 'value':983 return null;984 case 'this.thread.value':985 case 'this.output.value':986 return {987 signature: variableSignature,988 type: 'Integer',989 name: ast.property.name990 };991 case 'value[]':992 if (typeof ast.object.name !== 'string') {993 throw this.astErrorOutput('Unexpected expression', ast);994 }995 name = ast.object.name;996 return {997 name,998 origin: 'user',999 signature: variableSignature,1000 type: this.getVariableType(name),1001 xProperty: ast.property1002 };1003 case 'value[][]':1004 if (typeof ast.object.object.name !== 'string') {1005 throw this.astErrorOutput('Unexpected expression', ast);1006 }1007 name = ast.object.object.name;1008 return {1009 name,1010 origin: 'user',1011 signature: variableSignature,1012 type: this.getVariableType(name),1013 yProperty: ast.object.property,1014 xProperty: ast.property,1015 };1016 case 'value[][][]':1017 if (typeof ast.object.object.object.name !== 'string') {1018 throw this.astErrorOutput('Unexpected expression', ast);1019 }1020 name = ast.object.object.object.name;1021 return {1022 name,1023 origin: 'user',1024 signature: variableSignature,1025 type: this.getVariableType(name),1026 zProperty: ast.object.object.property,1027 yProperty: ast.object.property,1028 xProperty: ast.property,1029 };1030 case 'value[][][][]':1031 if (typeof ast.object.object.object.object.name !== 'string') {1032 throw this.astErrorOutput('Unexpected expression', ast);1033 }1034 name = ast.object.object.object.object.name;1035 return {1036 name,1037 origin: 'user',1038 signature: variableSignature,1039 type: this.getVariableType(name),1040 zProperty: ast.object.object.property,1041 yProperty: ast.object.property,1042 xProperty: ast.property,1043 };1044 case 'value.value':1045 if (typeof ast.property.name !== 'string') {1046 throw this.astErrorOutput('Unexpected expression', ast);1047 }1048 if (this.isAstMathVariable(ast)) {1049 name = ast.property.name;1050 return {1051 name,1052 origin: 'Math',1053 type: 'Number',1054 signature: variableSignature,1055 };1056 }1057 switch (ast.property.name) {1058 case 'r':1059 case 'g':1060 case 'b':1061 case 'a':1062 name = ast.object.name;1063 return {1064 name,1065 property: ast.property.name,1066 origin: 'user',1067 signature: variableSignature,1068 type: 'Number'1069 };1070 default:1071 throw this.astErrorOutput('Unexpected expression', ast);1072 }1073 case 'this.constants.value':1074 if (typeof ast.property.name !== 'string') {1075 throw this.astErrorOutput('Unexpected expression', ast);1076 }1077 name = ast.property.name;1078 type = this.getConstantType(name);1079 if (!type) {1080 throw this.astErrorOutput('Constant has no type', ast);1081 }1082 return {1083 name,1084 type,1085 origin: 'constants',1086 signature: variableSignature,1087 };1088 case 'this.constants.value[]':1089 if (typeof ast.object.property.name !== 'string') {1090 throw this.astErrorOutput('Unexpected expression', ast);1091 }1092 name = ast.object.property.name;1093 type = this.getConstantType(name);1094 if (!type) {1095 throw this.astErrorOutput('Constant has no type', ast);1096 }1097 return {1098 name,1099 type,1100 origin: 'constants',1101 signature: variableSignature,1102 xProperty: ast.property,1103 };1104 case 'this.constants.value[][]': {1105 if (typeof ast.object.object.property.name !== 'string') {1106 throw this.astErrorOutput('Unexpected expression', ast);1107 }1108 name = ast.object.object.property.name;1109 type = this.getConstantType(name);1110 if (!type) {1111 throw this.astErrorOutput('Constant has no type', ast);1112 }1113 return {1114 name,1115 type,1116 origin: 'constants',1117 signature: variableSignature,1118 yProperty: ast.object.property,1119 xProperty: ast.property,1120 };1121 }1122 case 'this.constants.value[][][]': {1123 if (typeof ast.object.object.object.property.name !== 'string') {1124 throw this.astErrorOutput('Unexpected expression', ast);1125 }1126 name = ast.object.object.object.property.name;1127 type = this.getConstantType(name);1128 if (!type) {1129 throw this.astErrorOutput('Constant has no type', ast);1130 }1131 return {1132 name,1133 type,1134 origin: 'constants',1135 signature: variableSignature,1136 zProperty: ast.object.object.property,1137 yProperty: ast.object.property,1138 xProperty: ast.property,1139 };1140 }1141 case 'fn()[]':...
index.js
Source:index.js
...322 return constantPool()[index].bytes;323 }324 return '';325 }326 function getConstantType(tag) {327 switch (tag) {328 case 1:329 return 'CONSTANT_Utf8'330 case 3:331 return 'CONSTANT_Integer';332 case 4:333 return 'CONSTANT_Float';334 case 5:335 return 'CONSTANT_Long';336 case 6:337 return 'CONSTANT_Double';338 case 7:339 return 'CONSTANT_Class';340 case 8:...
utils.js
Source:utils.js
...587 * å¤ææ¯å¦ä¸ºä¸ä¸ªæå®çå¼588 * @param val589 * @returns {boolean}590 */591function getConstantType(val)592{593 switch ( val )594 {595 case 'null' :596 case 'undefined' :597 return 'Object';598 case 'true' :599 case 'false' :600 return 'Boolean';601 case 'NaN' :602 case 'Infinity' :603 return 'Number';604 }605 return null;...
transformElement.js
Source:transformElement.js
...99 } else if (node.children.length === 1 && vnodeTag !== TELEPORT) {100 const child = node.children[0]101 const type = child.type102 const hasDynamicTextChild = type === 5 || type === 8103 if (hasDynamicTextChild && getConstantType(child, context) === 0) {104 patchFlag |= 1105 }106 if (hasDynamicTextChild || type === 2) {107 vnodeChildren = child108 } else {109 vnodeChildren = node.children110 }111 } else {112 vnodeChildren = node.children113 }114 }115 if (patchFlag !== 0) {116 {117 if (patchFlag < 0) {118 vnodePatchFlag = patchFlag + ` /* ${PatchFlagNames[patchFlag]} */`119 } else {120 const flagNames = Object.keys(PatchFlagNames)121 .map(Number)122 .filter(n => n > 0 && patchFlag & n)123 .map(n => PatchFlagNames[n])124 .join(`, `)125 vnodePatchFlag = patchFlag + ` /* ${flagNames} */`126 }127 }128 if (dynamicPropNames && dynamicPropNames.length) {129 vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames)130 }131 }132 node.codegenNode = createVNodeCall(133 context,134 vnodeTag,135 vnodeProps,136 vnodeChildren,137 vnodePatchFlag,138 vnodeDynamicProps,139 vnodeDirectives,140 !!shouldUseBlock,141 false,142 isComponent,143 node.loc144 )145 }146}147function resolveComponentType (node, context, ssr = false) {148 let { tag } = node149 const isExplicitDynamic = isComponentTag(tag)150 const isProp = findProp(node, 'is')151 if (isProp) {152 if (isExplicitDynamic || false) {153 const exp =154 isProp.type === 6155 ? isProp.value && createSimpleExpression(isProp.value.content, true)156 : isProp.exp157 if (exp) {158 return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [159 exp160 ])161 }162 } else if (isProp.type === 6 && isProp.value.content.startsWith('vue:')) {163 tag = isProp.value.content.slice(4)164 }165 }166 const isDir = !isExplicitDynamic && findDir(node, 'is')167 if (isDir && isDir.exp) {168 return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [169 isDir.exp170 ])171 }172 const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag)173 if (builtIn) {174 if (!ssr) context.helper(builtIn)175 return builtIn176 }177 context.helper(RESOLVE_COMPONENT)178 context.components.add(tag)179 return toValidAssetId(tag, `component`)180}181export function buildProps (node, context, props = node.props, ssr = false) {182 const { tag, loc: elementLoc, children } = node183 const isComponent = node.tagType === 1184 let properties = []185 const mergeArgs = []186 const runtimeDirectives = []187 const hasChildren = children.length > 0188 let shouldUseBlock = false189 let patchFlag = 0190 let hasRef = false191 let hasClassBinding = false192 let hasStyleBinding = false193 let hasHydrationEventBinding = false194 let hasDynamicKeys = false195 let hasVnodeHook = false196 const dynamicPropNames = []197 const analyzePatchFlag = ({ key, value }) => {198 if (isStaticExp(key)) {199 const name = key.content200 const isEventHandler = isOn(name)201 if (202 !isComponent &&203 isEventHandler &&204 name.toLowerCase() !== 'onclick' &&205 name !== 'onUpdate:modelValue' &&206 !isReservedProp(name)207 ) {208 hasHydrationEventBinding = true209 }210 if (isEventHandler && isReservedProp(name)) {211 hasVnodeHook = true212 }213 if (214 value.type === 20 ||215 ((value.type === 4 || value.type === 8) &&216 getConstantType(value, context) > 0)217 ) {218 return219 }220 if (name === 'ref') {221 hasRef = true222 } else if (name === 'class') {223 hasClassBinding = true224 } else if (name === 'style') {225 hasStyleBinding = true226 } else if (name !== 'key' && !dynamicPropNames.includes(name)) {227 dynamicPropNames.push(name)228 }229 if (230 isComponent &&...
helperFunctions.js
Source:helperFunctions.js
...147function renderConstantDocumentation (constantValue, developerName) {148 let applicationName = getApplicationName();149 let jiraTicket = getTicketFromApplicationName(applicationName)150 let descriptionIndex = isNewConstant() ? 2 : 1151 if ( getConstantType() === "Text" ) {152 // Wrap the constant value in quotes if it is a text value153 constantValue = "\"" + constantValue + "\""154 }155 let existingDescription = getElementOfConstantForm(descriptionIndex).value156 // Set the value of the description equal to any existing description and157 // the value plus a changelog158 getElementOfConstantForm(descriptionIndex).value = `${existingDescription}159Value: ${constantValue}160/*161////////////////////////////// CHANGE LOG \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\162<${formatDate()}><${jiraTicket}><${developerName}>163 -- Created164*/`165}...
hoistStatic.js
Source:hoistStatic.js
...21 let hoistedCount = 022 for (let i = 0; i < children.length; i++) {23 const child = children[i]24 if (child.type === 1 && child.tagType === 0) {25 const constantType = doNotHoistNode ? 0 : getConstantType(child, context)26 if (constantType > 0) {27 if (constantType >= 2) {28 child.codegenNode.patchFlag = -1 + ` /* HOISTED */`29 child.codegenNode = context.hoist(child.codegenNode)30 hoistedCount++31 continue32 }33 } else {34 const codegenNode = child.codegenNode35 if (codegenNode.type === 13) {36 const flag = getPatchFlag(codegenNode)37 if (38 (!flag || flag === 512 || flag === 1) &&39 getGeneratedPropsConstantType(child, context) >= 240 ) {41 const props = getNodeProps(child)42 if (props) {43 codegenNode.props = context.hoist(props)44 }45 }46 if (codegenNode.dynamicProps) {47 codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps)48 }49 }50 }51 } else if (52 child.type === 12 &&53 getConstantType(child.content, context) >= 254 ) {55 child.codegenNode = context.hoist(child.codegenNode)56 hoistedCount++57 }58 if (child.type === 1) {59 const isComponent = child.tagType === 160 if (isComponent) {61 context.scopes.vSlot++62 }63 walk(child, context)64 if (isComponent) {65 context.scopes.vSlot--66 }67 } else if (child.type === 11) {68 walk(child, context, child.children.length === 1)69 } else if (child.type === 9) {70 for (let i = 0; i < child.branches.length; i++) {71 walk(72 child.branches[i],73 context,74 child.branches[i].children.length === 175 )76 }77 }78 }79 if (hoistedCount && context.transformHoist) {80 context.transformHoist(children, context, node)81 }82 if (83 hoistedCount &&84 hoistedCount === originalCount &&85 node.type === 1 &&86 node.tagType === 0 &&87 node.codegenNode &&88 node.codegenNode.type === 13 &&89 isArray(node.codegenNode.children)90 ) {91 node.codegenNode.children = context.hoist(92 createArrayExpression(node.codegenNode.children)93 )94 }95}96export function getConstantType (node, context) {97 const { constantCache } = context98 switch (node.type) {99 case 1:100 if (node.tagType !== 0) {101 return 0102 }103 const cached = constantCache.get(node)104 if (cached !== undefined) {105 return cached106 }107 const codegenNode = node.codegenNode108 if (codegenNode.type !== 13) {109 return 0110 }111 if (112 codegenNode.isBlock &&113 node.tag !== 'svg' &&114 node.tag !== 'foreignObject'115 ) {116 return 0117 }118 const flag = getPatchFlag(codegenNode)119 if (!flag) {120 let returnType = 3121 const generatedPropsType = getGeneratedPropsConstantType(node, context)122 if (generatedPropsType === 0) {123 constantCache.set(node, 0)124 return 0125 }126 if (generatedPropsType < returnType) {127 returnType = generatedPropsType128 }129 for (let i = 0; i < node.children.length; i++) {130 const childType = getConstantType(node.children[i], context)131 if (childType === 0) {132 constantCache.set(node, 0)133 return 0134 }135 if (childType < returnType) {136 returnType = childType137 }138 }139 if (returnType > 1) {140 for (let i = 0; i < node.props.length; i++) {141 const p = node.props[i]142 if (p.type === 7 && p.name === 'bind' && p.exp) {143 const expType = getConstantType(p.exp, context)144 if (expType === 0) {145 constantCache.set(node, 0)146 return 0147 }148 if (expType < returnType) {149 returnType = expType150 }151 }152 }153 }154 if (codegenNode.isBlock) {155 context.removeHelper(OPEN_BLOCK)156 context.removeHelper(157 getVNodeBlockHelper(context.inSSR, codegenNode.isComponent)158 )159 codegenNode.isBlock = false160 context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent))161 }162 constantCache.set(node, returnType)163 return returnType164 } else {165 constantCache.set(node, 0)166 return 0167 }168 case 2:169 case 3:170 return 3171 case 9:172 case 11:173 case 10:174 return 0175 case 5:176 case 12:177 return getConstantType(node.content, context)178 case 4:179 return node.constType180 case 8:181 let returnType = 3182 for (let i = 0; i < node.children.length; i++) {183 const child = node.children[i]184 if (isString(child) || isSymbol(child)) {185 continue186 }187 const childType = getConstantType(child, context)188 if (childType === 0) {189 return 0190 } else if (childType < returnType) {191 returnType = childType192 }193 }194 return returnType195 default:196 return 0197 }198}199const allowHoistedHelperSet = new Set([200 NORMALIZE_CLASS,201 NORMALIZE_STYLE,202 NORMALIZE_PROPS,203 GUARD_REACTIVE_PROPS204])205function getConstantTypeOfHelperCall (value, context) {206 if (207 value.type === 14 &&208 !isString(value.callee) &&209 allowHoistedHelperSet.has(value.callee)210 ) {211 const arg = value.arguments[0]212 if (arg.type === 4) {213 return getConstantType(arg, context)214 } else if (arg.type === 14) {215 return getConstantTypeOfHelperCall(arg, context)216 }217 }218 return 0219}220function getGeneratedPropsConstantType (node, context) {221 let returnType = 3222 const props = getNodeProps(node)223 if (props && props.type === 15) {224 const { properties } = props225 for (let i = 0; i < properties.length; i++) {226 const { key, value } = properties[i]227 const keyType = getConstantType(key, context)228 if (keyType === 0) {229 return keyType230 }231 if (keyType < returnType) {232 returnType = keyType233 }234 let valueType235 if (value.type === 4) {236 valueType = getConstantType(value, context)237 } else if (value.type === 14) {238 valueType = getConstantTypeOfHelperCall(value, context)239 } else {240 valueType = 0241 }242 if (valueType === 0) {243 return valueType244 }245 if (valueType < returnType) {246 returnType = valueType247 }248 }249 }250 return returnType...
transformText.js
Source:transformText.js
...57 const callArgs = []58 if (child.type !== 2 || child.content !== ' ') {59 callArgs.push(child)60 }61 if (!context.ssr && getConstantType(child, context) === 0) {62 callArgs.push(1 + ` /* ${PatchFlagNames[1]} */`)63 }64 children[i] = {65 type: 12,66 content: child,67 loc: child.loc,68 codegenNode: createCallExpression(69 context.helper(CREATE_TEXT),70 callArgs71 )72 }73 }74 }75 }...
classv8_1_1internal_1_1_property_cell.js
Source:classv8_1_1internal_1_1_property_cell.js
1var classv8_1_1internal_1_1_property_cell =2[3 [ "BodyDescriptor", "classv8_1_1internal_1_1_property_cell.html#aa261f74f109f9706cc80a50fcf3fea83", null ],4 [ "DISALLOW_IMPLICIT_CONSTRUCTORS", "classv8_1_1internal_1_1_property_cell.html#ac27122586065fd59a484ba646b3dc771", null ],5 [ "GetConstantType", "classv8_1_1internal_1_1_property_cell.html#ad575b8b56625ef4ce299f936c1396734", null ],6 [ "InvalidateEntry", "classv8_1_1internal_1_1_property_cell.html#a098f41046501aa1a188687167aee016a", null ],7 [ "PrepareForValue", "classv8_1_1internal_1_1_property_cell.html#a4cfd41e664a5125994a795050c42cc75", null ],8 [ "property_details", "classv8_1_1internal_1_1_property_cell.html#a708c41145948cd884d0a138f259ff13a", null ],9 [ "set_property_details", "classv8_1_1internal_1_1_property_cell.html#a937742725ab442a47662f39d0acccb05", null ],10 [ "SetValueWithInvalidation", "classv8_1_1internal_1_1_property_cell.html#aed19982e8377efa4079d4fc96b2ee854", null ],11 [ "UpdatedType", "classv8_1_1internal_1_1_property_cell.html#a6b684b0de3bb24602cd52211fdf1bd09", null ],12 [ "kDependentCodeOffset", "classv8_1_1internal_1_1_property_cell.html#a4170212f9537f0386e47d0cb3992862d", null ],13 [ "kDetailsOffset", "classv8_1_1internal_1_1_property_cell.html#a9eca2ab1acc9e7d269c42234bd6f0ae9", null ],14 [ "kSize", "classv8_1_1internal_1_1_property_cell.html#aebba1cc2196a61c1f8e639175a9a83d5", null ],15 [ "kValueOffset", "classv8_1_1internal_1_1_property_cell.html#a35f0fea4789352fe9b971e8486d6034d", null ]...
Using AI Code Generation
1const { getConstantType } = require('@playwright/test/lib/utils/utils');2const { test, expect } = require('@playwright/test');3test('getConstantType', async ({ page }) => {4 const type = getConstantType('click');5 expect(type).toBe('action');6});7- [Playwright Test](
Using AI Code Generation
1const { getConstantType } = require('playwright/lib/server/frames');2const { Page } = require('playwright/lib/server/page');3const { assert } = require('console');4const { test } = require('playwright');5const type = getConstantType(Page.Events.FrameAttached);6assert.strictEqual(type, 'string');7const { getConstantType } = require('playwright/lib/server/frames');8const { Page } = require('playwright/lib/server/page');9const { assert } = require('console');10const { test } = require('playwright');11const type = getConstantType(Page.Events.FrameAttached);12assert.strictEqual(type, 'string');13const { getConstantType } = require('playwright/lib/server/frames');14const { Page } = require('playwright/lib/server/page');15const { assert } = require('console');16const { test } = require('playwright');17const type = getConstantType(Page.Events.FrameAttached);18assert.strictEqual(type, 'string');19const { getConstantType } = require('playwright/lib/server/frames');20const { Page } = require('playwright/lib/server/page');21const { assert } = require('console');22const { test } = require('playwright');23const type = getConstantType(Page.Events.FrameAttached);24assert.strictEqual(type, 'string');25const { getConstantType } = require('playwright/lib/server/frames');26const { Page } = require('playwright/lib/server/page');27const { assert } = require('console');28const { test } = require('playwright');29const type = getConstantType(Page.Events.FrameAttached);30assert.strictEqual(type, 'string');31const { getConstantType } = require('playwright/lib/server/frames');32const { Page } = require('playwright/lib/server/page');33const { assert } = require('console');34const { test } = require('playwright');35const type = getConstantType(Page.Events.FrameAttached);36assert.strictEqual(type, 'string');
Using AI Code Generation
1const { getConstantType } = require('playwright/lib/internal/utils');2const { test } = require('@playwright/test');3const { expect } = require('chai');4test('should return the type of the constant', async ({ page }) => {5 expect(getConstantType('name')).to.equal('string');6 expect(getConstantType(123)).to.equal('number');7 expect(getConstantType(true)).to.equal('boolean');8 expect(getConstantType(null)).to.equal('object');9 expect(getConstantType(undefined)).to.equal('undefined');10 expect(getConstantType({})).to.equal('object');11 expect(getConstantType([])).to.equal('object');12 expect(getConstantType(() => {})).to.equal('function');13 expect(getConstantType(Symbol())).to.equal('symbol');14 expect(getConstantType(new Error())).to.equal('object');15 expect(getConstantType(new Date())).to.equal('object');16 expect(getConstantType(new RegExp())).to.equal('object');17 expect(getConstantType(new Map())).to.equal('object');18 expect(getConstantType(new Set())).to.equal('object');19 expect(getConstantType(new WeakMap())).to.equal('object');20 expect(getConstantType(new WeakSet())).to.equal('object');21});22 expect(getConstantType('name')).to.equal('string')23 at Context.<anonymous> (test.js:8:30)
Using AI Code Generation
1const { getConstantType } = require('@playwright/test/lib/utils/stackTrace');2const constantType = getConstantType('body');3const { getConstantType } = require('@playwright/test/lib/utils/stackTrace');4const constantType = getConstantType('body');5const { getConstantType } = require('@playwright/test/lib/utils/stackTrace');6const constantType = getConstantType('body');7const { getConstantType } = require('@playwright/test/lib/utils/stackTrace');8const constantType = getConstantType('body');9const { getConstantType } = require('@playwright/test/lib/utils/stackTrace');10const constantType = getConstantType('body');11const { getConstantType } = require('@playwright/test/lib/utils/stackTrace');12const constantType = getConstantType('body');13const { getConstantType } = require('@playwright/test/lib/utils/stackTrace');14const constantType = getConstantType('body');15const { getConstantType } = require('@playwright/test/lib/utils/stackTrace');16const constantType = getConstantType('body');
Using AI Code Generation
1const { getConstantType } = require('playwright-core/lib/server/supplements/utils/utils');2console.log(getConstantType({ a: 1 }));3const { chromium } = require('playwright');4(async () => {5 const browser = await chromium.launch();6 const context = await browser.newContext();7 const page = await context.newPage();8 console.log(page.evaluate(() => window));9 await browser.close();10})();11const { chromium } = require('playwright');12(async () => {13 const browser = await chromium.launch();14 const context = await browser.newContext();15 const page = await context.newPage();16 await page.evaluate(() => console.log(window));17 await browser.close();18})();
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!