Skip to content

Commit 7628c08

Browse files
committed
Use parseExpression in AssignExpression Node for standardizing logics
1 parent 9f6f990 commit 7628c08

File tree

8 files changed

+142
-81
lines changed

8 files changed

+142
-81
lines changed

src/Compiler/Lang/Assembler/Bundler/Packages/Constants.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
use PHPJava\Compiler\Lang\Assembler\Bundler\PackageBundlerInterface;
66
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\ConstantPoolEnhanceable;
77
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\MethodConstantValueReturnable;
8-
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\NumberStorable;
8+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\NumberLoadable;
99

1010
class Constants extends AbstractPackageBundler implements PackageBundlerInterface
1111
{
1212
use ConstantPoolEnhanceable;
1313
use MethodConstantValueReturnable;
14-
use NumberStorable;
14+
use NumberLoadable;
1515

1616
public function getPHPVersion(): array
1717
{

src/Compiler/Lang/Assembler/Statements/Expressions/AssignExpressionAssembler.php

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@
66
use PHPJava\Compiler\Lang\Assembler\MethodAssembler;
77
use PHPJava\Compiler\Lang\Assembler\Statements\StatementCoordinatorInterface;
88
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\ConstantPoolEnhanceable;
9+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\Castable;
10+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\ClassConstractable;
911
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\LocalVariableAssignable;
10-
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\NumberStorable;
12+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\MethodCallable;
13+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\NumberLoadable;
14+
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\StringConcatable;
15+
use PHPJava\Compiler\Lang\Assembler\Traits\ExpressionParseable;
1116
use PHPJava\Compiler\Lang\Assembler\Traits\OperationManageable;
12-
use PHPJava\Exceptions\CoordinateStructureException;
17+
use PHPJava\Packages\java\lang\_String;
18+
use PhpParser\Node;
1319

1420
/**
1521
* @method MethodAssembler getParentCoordinator()
@@ -20,37 +26,48 @@ class AssignExpressionAssembler extends AbstractAssembler implements StatementCo
2026
use OperationManageable;
2127
use ConstantPoolEnhanceable;
2228
use LocalVariableAssignable;
23-
use NumberStorable;
29+
use NumberLoadable;
30+
use ExpressionParseable;
31+
use StringConcatable;
32+
use ClassConstractable;
33+
use MethodCallable;
34+
use Castable;
2435

2536
public function assemble(): void
2637
{
2738
$name = $this->node->var->name;
2839
$value = $this->node->expr;
2940

30-
switch (get_class($value)) {
31-
case \PhpParser\Node\Scalar\String_::class:
32-
/**
33-
* @var \PhpParser\Node\Scalar\String_ $value
34-
*/
35-
$value = (string) $value->value;
36-
break;
37-
case \PhpParser\Node\Scalar\LNumber::class:
38-
/**
39-
* @var \PhpParser\Node\Scalar\LNumber $value
40-
*/
41-
$value = (int) $value->value;
42-
break;
43-
default:
44-
throw new CoordinateStructureException(
45-
'Unsupported the assign expression: ' . get_class($value)
46-
);
47-
}
41+
$expressionTypes = [];
42+
$expressions = $this->parseExpression(
43+
[$value],
44+
function (string $classType, $operations) use (&$expressionTypes) {
45+
$expressionTypes[] = $classType;
46+
}
47+
);
4848

4949
$localVariableAssignOperation = $this->assembleAssignVariable(
5050
$name,
51-
$value
51+
count($expressionTypes) > 1
52+
? _String::class
53+
: current($expressionTypes)
5254
);
5355

56+
$operations = count($expressionTypes) > 1
57+
? $this->assembleConcatStringOperation(...$expressions)
58+
: $expressions;
59+
60+
foreach ($operations as $operation) {
61+
/**
62+
* @var \PHPJava\Compiler\Builder\Generator\Operation\Operation $operation
63+
*/
64+
$this->getOperation()
65+
->add(
66+
$operation->getOpCode(),
67+
$operation->getOperands()
68+
);
69+
}
70+
5471
foreach ($localVariableAssignOperation as $operation) {
5572
/**
5673
* @var \PHPJava\Compiler\Builder\Generator\Operation\Operation $operation

src/Compiler/Lang/Assembler/Traits/Enhancer/Operation/LocalVariableAssignable.php

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,9 @@
44
use PHPJava\Compiler\Builder\Attributes\Architects\Operation;
55
use PHPJava\Compiler\Builder\Finder\ConstantPoolFinder;
66
use PHPJava\Compiler\Builder\Generator\Operation\Operand;
7-
use PHPJava\Compiler\Builder\Structures\Info\StringInfo;
87
use PHPJava\Compiler\Builder\Types\Uint16;
9-
use PHPJava\Compiler\Builder\Types\Uint8;
10-
use PHPJava\Compiler\Lang\Assembler\Bundler\Packages\_String;
118
use PHPJava\Compiler\Lang\Assembler\Enhancer\ConstantPoolEnhancer;
129
use PHPJava\Compiler\Lang\Assembler\Store\Store;
13-
use PHPJava\Kernel\Maps\OpCode;
1410
use PHPJava\Kernel\Resolvers\MnemonicResolver;
1511

1612
/**
@@ -21,45 +17,18 @@
2117
*/
2218
trait LocalVariableAssignable
2319
{
24-
public function assembleAssignVariable(string $variableName, $value): array
20+
public function assembleAssignVariable(string $variableName, string $classType): array
2521
{
2622
$operations = [];
27-
$type = null;
28-
if (is_int($value)) {
29-
$storeNumberOperation = $this->assembleStoreNumber(
30-
$value,
31-
$type
32-
)[0];
33-
34-
$operations[] = $storeNumberOperation;
35-
} else {
36-
$this->getEnhancedConstantPool()
37-
->addString($value);
38-
$type = _String::class;
39-
40-
// Add to operation
41-
$operations[] = \PHPJava\Compiler\Builder\Generator\Operation\Operation::create(
42-
OpCode::_ldc,
43-
Operand::factory(
44-
Uint8::class,
45-
$this->getConstantPoolFinder()
46-
->find(
47-
StringInfo::class,
48-
$value
49-
)
50-
)
51-
);
52-
}
53-
5423
$localStorageNumber = $this->getStore()->store(
5524
$variableName,
56-
[$type, $value]
25+
$classType
5726
);
5827

5928
// Add to operation code
6029
$storeOperation = MnemonicResolver::resolveStoreByNumberAndType(
6130
$localStorageNumber,
62-
$type
31+
$classType
6332
);
6433

6534
$operands = [];

src/Compiler/Lang/Assembler/Traits/Enhancer/Operation/MethodConstantValueReturnable.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function assembleSimpleMethodConstantValueReturn($value)
4343
$returnOperation = OpCode::_ireturn;
4444
array_push(
4545
$operations,
46-
...$this->assembleStoreNumber(
46+
...$this->assembleLoadNumber(
4747
$value
4848
)
4949
);

src/Compiler/Lang/Assembler/Traits/Enhancer/Operation/NumberStorable.php renamed to src/Compiler/Lang/Assembler/Traits/Enhancer/Operation/NumberLoadable.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
use PHPJava\Compiler\Builder\Finder\ConstantPoolFinder;
66
use PHPJava\Compiler\Builder\Generator\Operation\Operand;
77
use PHPJava\Compiler\Builder\Structures\Info\IntegerInfo;
8+
use PHPJava\Compiler\Builder\Types\Uint16;
89
use PHPJava\Compiler\Builder\Types\Uint8;
910
use PHPJava\Compiler\Lang\Assembler\Enhancer\ConstantPoolEnhancer;
1011
use PHPJava\Compiler\Lang\Assembler\Store\Store;
1112
use PHPJava\Exceptions\CoordinateStructureException;
1213
use PHPJava\Kernel\Maps\OpCode;
1314
use PHPJava\Kernel\Types\_Byte;
1415
use PHPJava\Kernel\Types\_Int;
15-
use PHPJava\Kernel\Types\_Long;
1616
use PHPJava\Kernel\Types\_Short;
1717

1818
/**
@@ -21,9 +21,9 @@
2121
* @method ConstantPoolFinder getConstantPoolFinder()
2222
* @method ConstantPoolEnhancer getEnhancedConstantPool()
2323
*/
24-
trait NumberStorable
24+
trait NumberLoadable
2525
{
26-
public function assembleStoreNumber(int $value, string &$type = null)
26+
public function assembleLoadNumber(int $value, string &$type = null)
2727
{
2828
$loadOperation = null;
2929
$loadOperand = null;
@@ -64,11 +64,6 @@ public function assembleStoreNumber(int $value, string &$type = null)
6464
IntegerInfo::class,
6565
$value
6666
);
67-
} elseif ($value >= _Long::MIN && $value <= _Long::MAX) {
68-
// $this->getEnhancedConstantPool()
69-
// ->addLong($value);
70-
// $type = _Long::class;
71-
// $loadOperation = OpCode::_ldc_w;
7267
} else {
7368
throw new CoordinateStructureException(
7469
sprintf(
@@ -87,7 +82,7 @@ public function assembleStoreNumber(int $value, string &$type = null)
8782
$size = Uint8::class;
8883
break;
8984
case OpCode::_sipush:
90-
$size = Uint8::class;
85+
$size = Uint16::class;
9186
break;
9287
default:
9388
throw new CoordinateStructureException(

src/Compiler/Lang/Assembler/Traits/Enhancer/Operation/StringConcatable.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,21 @@ public function assembleConcatStringOperation(...$arguments): array
5454
);
5555

5656
foreach ($arguments as $operation) {
57+
try {
58+
$convertedOperations = $this->assembleCastToString(
59+
MnemonicResolver::isLDCOperation($operation->getOpCode())
60+
? $operation->getOperand(0)->getValue()->getType()
61+
: MnemonicResolver::resolveTypeByOpCode($operation->getOpCode()),
62+
$operation
63+
);
64+
} catch (ResolverException $e) {
65+
$convertedOperations = [$operation];
66+
}
67+
5768
array_push(
5869
$operations,
5970
// Load value.
60-
$operation,
71+
...$convertedOperations,
6172
// Call the append method.
6273
...$this->assembleCallMethodOperations(
6374
\PHPJava\Packages\java\lang\StringBuilder::class,

0 commit comments

Comments
 (0)