mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 05:42:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			34 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include "Compiler/Passes/FunctionCallCanonicalizationPass.h"
 | |
| #include "AST/AST.h"
 | |
| 
 | |
| namespace JSSpecCompiler {
 | |
| 
 | |
| RecursionDecision FunctionCallCanonicalizationPass::on_entry(Tree tree)
 | |
| {
 | |
|     if (auto binary_operation = as<BinaryOperation>(tree); binary_operation) {
 | |
|         if (binary_operation->m_operation == BinaryOperator::FunctionCall) {
 | |
|             Vector<Tree> arguments;
 | |
| 
 | |
|             auto current_tree = binary_operation->m_right;
 | |
|             while (true) {
 | |
|                 auto argument_tree = as<BinaryOperation>(current_tree);
 | |
|                 if (!argument_tree || argument_tree->m_operation != BinaryOperator::Comma)
 | |
|                     break;
 | |
|                 arguments.append(argument_tree->m_left);
 | |
|                 current_tree = argument_tree->m_right;
 | |
|             }
 | |
|             arguments.append(current_tree);
 | |
| 
 | |
|             replace_current_node_with(make_ref_counted<FunctionCall>(binary_operation->m_left, move(arguments)));
 | |
|         }
 | |
|     }
 | |
|     return RecursionDecision::Recurse;
 | |
| }
 | |
| 
 | |
| }
 | 
