Skip to content

Commit c43c019

Browse files
committed
Update
1 parent d1d76e8 commit c43c019

17 files changed

+379
-304
lines changed

src/Compiler/Lang/Assembler/Processors/AbstractProcessor.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use PHPJava\Compiler\Lang\Assembler\Enhancer\ConstantPoolEnhancer;
77
use PHPJava\Compiler\Lang\Assembler\Traits\ConstantPoolManageable;
88
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\ConstantPoolEnhanceable;
9+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\Bindable;
10+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\NamespaceManageable;
911
use PHPJava\Compiler\Lang\Assembler\Traits\StoreManageable;
1012
use PHPJava\Compiler\Lang\Stream\StreamReaderInterface;
1113

@@ -20,6 +22,8 @@ abstract class AbstractProcessor implements ProcessorInterface
2022
use ConstantPoolManageable;
2123
use ConstantPoolEnhanceable;
2224
use StoreManageable;
25+
use NamespaceManageable;
26+
use Bindable;
2327

2428
public static function factory(): ProcessorInterface
2529
{

src/Compiler/Lang/Assembler/Processors/ExpressionProcessor.php

Lines changed: 69 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@
22
namespace PHPJava\Compiler\Lang\Assembler\Processors;
33

44
use PHPJava\Compiler\Builder\Signatures\Descriptor;
5+
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\AssignableFromNode;
56
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\ConstLoadableFromNode;
67
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\MagicConstLoadableFromNode;
78
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\OperationCalculatableFromNode;
9+
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\PostDecrementableFromNode;
10+
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\PostIncrementableFromNode;
11+
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\PrintableFromNode;
812
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\StringLoadableFromNode;
913
use PHPJava\Compiler\Lang\Assembler\Processors\Traits\VariableLoadableFromNode;
1014
use PHPJava\Compiler\Lang\Assembler\Traits\Calculatable;
1115
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\Conditionable;
16+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\LocalVariableAssignable;
17+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\LocalVariableLoadable;
1218
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\MethodCallable;
1319
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\NumberLoadable;
20+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\Outputable;
21+
use PHPJava\Compiler\Lang\Assembler\Traits\OperationManageable;
1422
use PHPJava\Compiler\Lang\Assembler\Traits\ParentRecurseable;
1523
use PHPJava\Exceptions\AssembleStructureException;
1624
use PHPJava\Kernel\Maps\OpCode;
@@ -20,16 +28,24 @@
2028

2129
class ExpressionProcessor extends AbstractProcessor implements ProcessorInterface
2230
{
31+
use OperationManageable;
2332
use OperationCalculatableFromNode;
2433
use ParentRecurseable;
2534
use ConstLoadableFromNode;
2635
use MagicConstLoadableFromNode;
2736
use StringLoadableFromNode;
2837
use VariableLoadableFromNode;
38+
use AssignableFromNode;
39+
use PostDecrementableFromNode;
40+
use PostIncrementableFromNode;
41+
use PrintableFromNode;
2942
use NumberLoadable;
3043
use MethodCallable;
3144
use Calculatable;
3245
use Conditionable;
46+
use Outputable;
47+
use LocalVariableAssignable;
48+
use LocalVariableLoadable;
3349

3450
public function execute(array $expressions, ?callable $callback = null): array
3551
{
@@ -38,32 +54,65 @@ public function execute(array $expressions, ?callable $callback = null): array
3854
foreach ($expressions as $expression) {
3955
$nodeType = get_class($expression);
4056
switch ($nodeType) {
57+
case \PhpParser\Node\Expr\Assign::class:
58+
array_push(
59+
$operations,
60+
...$this->assembleAssignFromNode($expression)
61+
);
62+
break;
63+
case \PhpParser\Node\Expr\PostInc::class:
64+
array_push(
65+
$operations,
66+
...$this->assemblePostIncFromNode($expression)
67+
);
68+
break;
69+
case \PhpParser\Node\Expr\PostDec::class:
70+
array_push(
71+
$operations,
72+
...$this->assemblePostDecFromNode($expression)
73+
);
74+
break;
75+
case \PhpParser\Node\Expr\Print_::class:
76+
array_push(
77+
$operations,
78+
...$this->assemblePrintFromNode($expression)
79+
);
80+
break;
4181
case \PhpParser\Node\Scalar\String_::class:
42-
$operations = $this
43-
->assembleLoadStringFromNode(
82+
array_push(
83+
$operations,
84+
...$this->assembleLoadStringFromNode(
4485
$expression,
4586
$classType
46-
);
87+
)
88+
);
4789
break;
4890
case \PhpParser\Node\Scalar\LNumber::class:
49-
$operations = $this->assembleLoadNumber(
50-
$expression->value,
51-
$classType
91+
array_push(
92+
$operations,
93+
...$this->assembleLoadNumber(
94+
$expression->value,
95+
$classType
96+
)
5297
);
5398
break;
5499
case \PhpParser\Node\Expr\Variable::class:
55-
$operations = $this
56-
->assembleLoadVariableFromNode(
100+
array_push(
101+
$operations,
102+
...$this->assembleLoadVariableFromNode(
57103
$expression,
58104
$classType
59-
);
105+
)
106+
);
60107
break;
61108
case \PhpParser\Node\Expr\ConstFetch::class:
62-
$operations = $this
63-
->assembleLoadConstFromNode(
109+
array_push(
110+
$operations,
111+
...$this->assembleLoadConstFromNode(
64112
$expression,
65113
$classType
66-
);
114+
)
115+
);
67116
break;
68117
case \PhpParser\Node\Scalar\MagicConst\Class_::class: // __CLASS__
69118
case \PhpParser\Node\Scalar\MagicConst\Method::class: // __METHOD__
@@ -73,11 +122,14 @@ public function execute(array $expressions, ?callable $callback = null): array
73122
case \PhpParser\Node\Scalar\MagicConst\Function_::class: // __FUNCTION__
74123
case \PhpParser\Node\Scalar\MagicConst\Trait_::class: // __TRAIT__
75124
case \PhpParser\Node\Scalar\MagicConst\Line::class: // __LINE__
76-
$operations = $this
77-
->assembleLoadMagicConstFromNode(
78-
$expression,
79-
$classType
80-
);
125+
array_push(
126+
$operations,
127+
...$this
128+
->assembleLoadMagicConstFromNode(
129+
$expression,
130+
$classType
131+
)
132+
);
81133
break;
82134
case \PhpParser\Node\Expr\BinaryOp\Concat::class:
83135
array_push(

src/Compiler/Lang/Assembler/Processors/ProcessorInterface.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
use PHPJava\Compiler\Builder\Attributes\Architects\Operation;
55
use PHPJava\Compiler\Builder\Collection\ConstantPool;
66
use PHPJava\Compiler\Builder\Finder\ConstantPoolFinder;
7+
use PHPJava\Compiler\Lang\Assembler\AssemblerInterface;
78
use PHPJava\Compiler\Lang\Assembler\Enhancer\ConstantPoolEnhancer;
89
use PHPJava\Compiler\Lang\Assembler\Store\Store;
910
use PHPJava\Compiler\Lang\Stream\StreamReaderInterface;
@@ -18,6 +19,9 @@
1819
* @method StreamReaderInterface getStreamReader()
1920
* @method ProcessorInterface setStore(Store $store)
2021
* @method Store getStore()
22+
* @method AssemblerInterface bindRequired(AssemblerInterface $assembler)
23+
* @method AbstractProcessor setNamespace(?array $namespace)
24+
* @method AbstractProcessor setOperation(Operation $operation)
2125
*/
2226
interface ProcessorInterface
2327
{
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
namespace PHPJava\Compiler\Lang\Assembler\Processors\Traits;
3+
4+
use PHPJava\Compiler\Builder\Finder\ConstantPoolFinder;
5+
use PHPJava\Compiler\Lang\Assembler\Enhancer\ConstantPoolEnhancer;
6+
use PHPJava\Compiler\Lang\Assembler\Processors\ExpressionProcessor;
7+
use PHPJava\Compiler\Lang\Assembler\Store\Store;
8+
use PhpParser\Node;
9+
10+
/**
11+
* @method Store getStore()
12+
* @method ConstantPoolEnhancer getEnhancedConstantPool()
13+
* @method ConstantPoolFinder getConstantPoolFinder()
14+
*/
15+
trait AssignableFromNode
16+
{
17+
private function assembleAssignFromNode(Node $expression): array
18+
{
19+
/**
20+
* @var \PhpParser\Node\Expr\Assign $expression
21+
*/
22+
$name = $expression->var->name;
23+
$value = $expression->expr;
24+
25+
$operations = [];
26+
$expressionTypes = [];
27+
28+
$expressions = ExpressionProcessor::factory()
29+
->setStore($this->getStore())
30+
->setConstantPool($this->getConstantPool())
31+
->setConstantPoolFinder($this->getConstantPoolFinder())
32+
->setNamespace($this->getNamespace())
33+
->setOperation($this->getOperation())
34+
->execute(
35+
[$value],
36+
function (array &$operations, string $nodeType, ?string $classType) use (&$expressionTypes) {
37+
if ($nodeType === \PhpParser\Node\Expr\BinaryOp\Concat::class || $classType === null) {
38+
return;
39+
}
40+
$expressionTypes[] = $classType;
41+
}
42+
);
43+
44+
$localVariableAssignOperation = $this->assembleAssignVariable(
45+
$name,
46+
current($expressionTypes)
47+
);
48+
49+
array_push(
50+
$operations,
51+
...$expressions,
52+
...$localVariableAssignOperation
53+
);
54+
55+
return $operations;
56+
}
57+
}

src/Compiler/Lang/Assembler/Statements/Expressions/PostDecrementExpressionAssembler.php renamed to src/Compiler/Lang/Assembler/Processors/Traits/PostDecrementableFromNode.php

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
11
<?php
2-
namespace PHPJava\Compiler\Lang\Assembler\Statements\Expressions;
2+
namespace PHPJava\Compiler\Lang\Assembler\Processors\Traits;
33

4+
use PHPJava\Compiler\Builder\Finder\ConstantPoolFinder;
45
use PHPJava\Compiler\Builder\Generator\Operation\Operand;
56
use PHPJava\Compiler\Builder\Generator\Operation\Operation;
67
use PHPJava\Compiler\Builder\Types\Uint8;
7-
use PHPJava\Compiler\Lang\Assembler\AbstractAssembler;
8-
use PHPJava\Compiler\Lang\Assembler\AssemblerInterface;
9-
use PHPJava\Compiler\Lang\Assembler\MethodAssembler;
10-
use PHPJava\Compiler\Lang\Assembler\Statements\StatementAssemblerInterface;
11-
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\ConstantPoolEnhanceable;
12-
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\LocalVariableAssignable;
13-
use PHPJava\Compiler\Lang\Assembler\Traits\OperationManageable;
8+
use PHPJava\Compiler\Lang\Assembler\Enhancer\ConstantPoolEnhancer;
9+
use PHPJava\Compiler\Lang\Assembler\Store\Store;
1410
use PHPJava\Exceptions\AssembleStructureException;
1511
use PHPJava\Kernel\Maps\OpCode;
1612
use PHPJava\Kernel\Types\_Byte;
1713
use PHPJava\Kernel\Types\_Int;
1814
use PHPJava\Kernel\Types\_Short;
15+
use PhpParser\Node;
1916

2017
/**
21-
* @method MethodAssembler getParentAssembler()
22-
* @property \PhpParser\Node\Expr\Assign $node
18+
* @method Store getStore()
19+
* @method ConstantPoolEnhancer getEnhancedConstantPool()
20+
* @method ConstantPoolFinder getConstantPoolFinder()
2321
*/
24-
class PostDecrementExpressionAssembler extends AbstractAssembler implements StatementAssemblerInterface, AssemblerInterface
22+
trait PostDecrementableFromNode
2523
{
26-
use OperationManageable;
27-
use ConstantPoolEnhanceable;
28-
use LocalVariableAssignable;
29-
30-
public function assemble(): array
24+
private function assemblePostDecFromNode(Node $expression): array
3125
{
26+
/**
27+
* @var \PhpParser\Node\Expr\PostDec $expression
28+
*/
3229
$operations = [];
33-
$name = $this->node->var->name;
30+
$name = $expression->var->name;
3431

3532
[$localStorageNumber, $classType] = $this->getStore()->get($name);
3633

@@ -55,7 +52,5 @@ public function assemble(): array
5552
'Unsupported decrease a value: ' . $classType
5653
);
5754
}
58-
59-
return $operations;
6055
}
6156
}

src/Compiler/Lang/Assembler/Statements/Expressions/PostIncrementExpressionAssembler.php renamed to src/Compiler/Lang/Assembler/Processors/Traits/PostIncrementableFromNode.php

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
11
<?php
2-
namespace PHPJava\Compiler\Lang\Assembler\Statements\Expressions;
2+
namespace PHPJava\Compiler\Lang\Assembler\Processors\Traits;
33

4+
use PHPJava\Compiler\Builder\Finder\ConstantPoolFinder;
45
use PHPJava\Compiler\Builder\Generator\Operation\Operand;
56
use PHPJava\Compiler\Builder\Generator\Operation\Operation;
67
use PHPJava\Compiler\Builder\Types\Uint8;
7-
use PHPJava\Compiler\Lang\Assembler\AbstractAssembler;
8-
use PHPJava\Compiler\Lang\Assembler\AssemblerInterface;
9-
use PHPJava\Compiler\Lang\Assembler\MethodAssembler;
10-
use PHPJava\Compiler\Lang\Assembler\Statements\StatementAssemblerInterface;
11-
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\ConstantPoolEnhanceable;
12-
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\LocalVariableAssignable;
13-
use PHPJava\Compiler\Lang\Assembler\Traits\OperationManageable;
8+
use PHPJava\Compiler\Lang\Assembler\Enhancer\ConstantPoolEnhancer;
9+
use PHPJava\Compiler\Lang\Assembler\Store\Store;
1410
use PHPJava\Exceptions\AssembleStructureException;
1511
use PHPJava\Kernel\Maps\OpCode;
1612
use PHPJava\Kernel\Types\_Byte;
1713
use PHPJava\Kernel\Types\_Int;
1814
use PHPJava\Kernel\Types\_Short;
15+
use PhpParser\Node;
1916

2017
/**
21-
* @method MethodAssembler getParentAssembler()
22-
* @property \PhpParser\Node\Expr\Assign $node
18+
* @method Store getStore()
19+
* @method ConstantPoolEnhancer getEnhancedConstantPool()
20+
* @method ConstantPoolFinder getConstantPoolFinder()
2321
*/
24-
class PostIncrementExpressionAssembler extends AbstractAssembler implements StatementAssemblerInterface, AssemblerInterface
22+
trait PostIncrementableFromNode
2523
{
26-
use OperationManageable;
27-
use ConstantPoolEnhanceable;
28-
use LocalVariableAssignable;
29-
30-
public function assemble(): array
24+
private function assemblePostIncFromNode(Node $expression): array
3125
{
26+
/**
27+
* @var \PhpParser\Node\Expr\PostInc $expression
28+
*/
3229
$operations = [];
33-
$name = $this->node->var->name;
30+
$name = $expression->var->name;
3431

3532
[$localStorageNumber, $classType] = $this->getStore()
3633
->get(
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
namespace PHPJava\Compiler\Lang\Assembler\Processors\Traits;
3+
4+
use PHPJava\Compiler\Builder\Finder\ConstantPoolFinder;
5+
use PHPJava\Compiler\Builder\Generator\Operation\Operation;
6+
use PHPJava\Compiler\Lang\Assembler\Enhancer\ConstantPoolEnhancer;
7+
use PHPJava\Compiler\Lang\Assembler\Store\Store;
8+
use PHPJava\Kernel\Maps\OpCode;
9+
use PhpParser\Node;
10+
11+
/**
12+
* @method Store getStore()
13+
* @method ConstantPoolEnhancer getEnhancedConstantPool()
14+
* @method ConstantPoolFinder getConstantPoolFinder()
15+
*/
16+
trait PrintableFromNode
17+
{
18+
private function assemblePrintFromNode(Node $expression): array
19+
{
20+
/**
21+
* @var \PhpParser\Node\Expr\Print_ $expression
22+
*/
23+
$operations = $this->assembleOutput([$expression->expr]);
24+
25+
// Returns 1 by the PHP feature.
26+
$operations[] = Operation::create(OpCode::_iconst_1);
27+
28+
return $operations;
29+
}
30+
}

0 commit comments

Comments
 (0)