Skip to content

Commit 3a012d3

Browse files
committed
Allows to call a static method with parameters
1 parent 44f9c45 commit 3a012d3

32 files changed

+541
-83
lines changed

src/Compiler/Builder/Signatures/Descriptor.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ public function make(): string
4242
static function (array $argument) {
4343
[$type, $deepArray] = $argument;
4444
$string = str_repeat('[', $deepArray);
45-
$type = ltrim($type, '\\');
45+
$type = Formatter::convertStringifiedPrimitiveTypeToKernelType(
46+
ltrim($type, '\\')
47+
);
4648
switch ($type) {
4749
case _Char::class:
4850
case _Byte::class:
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
<?php
22
namespace PHPJava\Compiler\Emulator\Mnemonics;
33

4-
use PHPJava\Exceptions\NotImplementedException;
4+
use PHPJava\Kernel\Maps\VerificationTypeTag;
55

66
class _aload_0 extends AbstractOperationCode implements OperationCodeInterface
77
{
88
use \PHPJava\Compiler\Emulator\Traits\GeneralProcessor;
99

1010
public function execute(): void
1111
{
12-
throw new NotImplementedException(__CLASS__);
12+
$this->accumulator->pushToOperandStack(
13+
[
14+
VerificationTypeTag::ITEM_Object,
15+
$this->getEnhancedConstantPool()
16+
->findClass(\PHPJava\Packages\java\lang\_String::class),
17+
]
18+
);
1319
}
1420
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
<?php
22
namespace PHPJava\Compiler\Emulator\Mnemonics;
33

4-
use PHPJava\Exceptions\NotImplementedException;
4+
use PHPJava\Kernel\Maps\VerificationTypeTag;
55

66
class _aload_1 extends AbstractOperationCode implements OperationCodeInterface
77
{
88
use \PHPJava\Compiler\Emulator\Traits\GeneralProcessor;
99

1010
public function execute(): void
1111
{
12-
throw new NotImplementedException(__CLASS__);
12+
$this->accumulator->pushToOperandStack(
13+
[
14+
VerificationTypeTag::ITEM_Object,
15+
$this->getEnhancedConstantPool()
16+
->findClass(\PHPJava\Packages\java\lang\_String::class),
17+
]
18+
);
1319
}
1420
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
<?php
22
namespace PHPJava\Compiler\Emulator\Mnemonics;
33

4-
use PHPJava\Exceptions\NotImplementedException;
4+
use PHPJava\Kernel\Maps\VerificationTypeTag;
55

66
class _aload_2 extends AbstractOperationCode implements OperationCodeInterface
77
{
88
use \PHPJava\Compiler\Emulator\Traits\GeneralProcessor;
99

1010
public function execute(): void
1111
{
12-
throw new NotImplementedException(__CLASS__);
12+
$this->accumulator->pushToOperandStack(
13+
[
14+
VerificationTypeTag::ITEM_Object,
15+
$this->getEnhancedConstantPool()
16+
->findClass(\PHPJava\Packages\java\lang\_String::class),
17+
]
18+
);
1319
}
1420
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
<?php
22
namespace PHPJava\Compiler\Emulator\Mnemonics;
33

4-
use PHPJava\Exceptions\NotImplementedException;
4+
use PHPJava\Kernel\Maps\VerificationTypeTag;
55

66
class _aload_3 extends AbstractOperationCode implements OperationCodeInterface
77
{
88
use \PHPJava\Compiler\Emulator\Traits\GeneralProcessor;
99

1010
public function execute(): void
1111
{
12-
throw new NotImplementedException(__CLASS__);
12+
$this->accumulator->pushToOperandStack(
13+
[
14+
VerificationTypeTag::ITEM_Object,
15+
$this->getEnhancedConstantPool()
16+
->findClass(\PHPJava\Packages\java\lang\_String::class),
17+
]
18+
);
1319
}
1420
}

src/Compiler/Lang/Assembler/AbstractAssembler.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPJava\Compiler\Lang\Assembler\Traits\MethodAssemblerManageable;
1111
use PHPJava\Compiler\Lang\Assembler\Traits\StoreManageable;
1212
use PHPJava\Compiler\Lang\Assembler\Traits\StreamManageable;
13+
use PHPJava\Compiler\Lang\Assembler\Traits\StructureAccessorsLocatorManageable;
1314
use PhpParser\Node;
1415

1516
abstract class AbstractAssembler implements AssemblerInterface, ParameterServiceInterface
@@ -22,6 +23,7 @@ abstract class AbstractAssembler implements AssemblerInterface, ParameterService
2223
use MethodAssemblerManageable;
2324
use ClassAssemblerManageable;
2425
use EntryPointClassAssemblerManageable;
26+
use StructureAccessorsLocatorManageable;
2527

2628
/**
2729
* @var Node

src/Compiler/Lang/Assembler/ClassAssembler.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use PHPJava\Compiler\Lang\Assembler\Traits\Bindable;
1717
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\ConstantPoolEnhanceable;
1818
use PHPJava\Compiler\Lang\Assembler\Traits\OperationManageable;
19+
use PHPJava\Compiler\Lang\Assembler\Traits\ParameterParseable;
1920
use PHPJava\Compiler\Lang\Assembler\Traits\StaticInitializerAssignable;
2021
use PHPJava\Core\JVM\Parameters\Runtime;
2122
use PHPJava\Kernel\Resolvers\SDKVersionResolver;
@@ -31,6 +32,7 @@ class ClassAssembler extends AbstractAssembler implements ClassAssemblerInterfac
3132
use ConstantPoolEnhanceable;
3233
use Bindable;
3334
use StaticInitializerAssignable;
35+
use ParameterParseable;
3436

3537
/**
3638
* @var Methods
@@ -71,7 +73,8 @@ public function assemble(): void
7173
$this->getClassName()
7274
);
7375
}
74-
$this->setOperation(new Operation())
76+
$this
77+
->setOperation(new Operation())
7578
->setStore($store)
7679
->bindParameters(MethodAssembler::factory($method))
7780
->setCollection($this->methods)

src/Compiler/Lang/Assembler/EntryPointClassAssembler.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use PHPJava\Compiler\Lang\Assembler\Traits\StaticInitializerAssignable;
2929
use PHPJava\Compiler\Lang\Assembler\Traits\StoreManageable;
3030
use PHPJava\Compiler\Lang\Assembler\Traits\StreamManageable;
31+
use PHPJava\Compiler\Lang\Assembler\Traits\StructureAccessorsLocatorManageable;
3132
use PHPJava\Core\JVM\Parameters\Runtime;
3233
use PHPJava\Kernel\Maps\OpCode;
3334
use PHPJava\Kernel\Resolvers\SDKVersionResolver;
@@ -48,6 +49,7 @@ class EntryPointClassAssembler implements AssemblerInterface, ParameterServiceIn
4849
use ConstantPoolEnhanceable;
4950
use Bindable;
5051
use StaticInitializerAssignable;
52+
use StructureAccessorsLocatorManageable;
5153

5254
/**
5355
* @var Methods
@@ -111,6 +113,7 @@ public function assemble(): void
111113
$operations = StatementProcessor::factory()
112114
->setStreamReader($this->getStreamReader())
113115
->setEntryPointClassAssembler($this)
116+
->setStructureAccessorsLocator($this->getStructureAccessorsLocator())
114117
->execute($this->nodes);
115118

116119
$operations[] = \PHPJava\Compiler\Builder\Generator\Operation\Operation::create(

src/Compiler/Lang/Assembler/MethodAssembler.php

Lines changed: 18 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@
1414
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\LocalVariableAssignable;
1515
use PHPJava\Compiler\Lang\Assembler\Traits\Enhancer\Operation\LocalVariableLoadable;
1616
use PHPJava\Compiler\Lang\Assembler\Traits\OperationManageable;
17-
use PHPJava\Exceptions\AssembleStructureException;
17+
use PHPJava\Compiler\Lang\Assembler\Traits\ParameterParseable;
1818
use PHPJava\Kernel\Maps\OpCode;
1919
use PHPJava\Kernel\Types\_Void;
2020
use PHPJava\Utilities\ArrayTool;
21-
use PHPJava\Utilities\Formatter;
2221

2322
/**
2423
* @method ClassAssembler getParentAssembler()
@@ -32,6 +31,7 @@ class MethodAssembler extends AbstractAssembler
3231
use LocalVariableAssignable;
3332
use LocalVariableLoadable;
3433
use Bindable;
34+
use ParameterParseable;
3535

3636
protected $attribute;
3737

@@ -54,64 +54,22 @@ public function assemble(): void
5454
$parameters[$parameter->var->name] = $parameter->type;
5555
}
5656

57-
foreach (($this->node->getAttribute('comments') ?? []) as $commentAttribute) {
58-
/**
59-
* @var \PhpParser\Comment\Doc $commentAttribute
60-
*/
61-
$documentBlock = \phpDocumentor\Reflection\DocBlockFactory::createInstance()
62-
->create($commentAttribute->getText());
63-
64-
foreach ($documentBlock->getTagsByName('param') as $documentParameter) {
65-
/**
66-
* @var \phpDocumentor\Reflection\DocBlock\Tags\Param $documentParameter
67-
*/
68-
if (!array_key_exists($documentParameter->getVariableName(), $parameters)) {
69-
// Does not add a variable detail and object ref if local variable parameter is not defined.
70-
continue;
71-
}
72-
73-
$type = (string) $documentParameter->getType();
74-
75-
// Update variable detail.
76-
$parameters[$documentParameter->getVariableName()] = [
77-
'type' => str_replace(
78-
'[]',
79-
'',
80-
ltrim(
81-
$type,
82-
'\\'
83-
)
84-
),
85-
'deep_array' => substr_count($type, '[]'),
86-
];
87-
88-
$className = Formatter::buildSignature(
89-
$parameters[$documentParameter->getVariableName()]['type'],
90-
$parameters[$documentParameter->getVariableName()]['deep_array']
91-
);
92-
93-
$this->getEnhancedConstantPool()
94-
->addClass($className);
95-
96-
// Fill local storage number.
97-
$this->assembleAssignVariable(
98-
$documentParameter->getVariableName(),
99-
$parameters[$documentParameter->getVariableName()]['type'],
100-
$parameters[$documentParameter->getVariableName()]['deep_array']
101-
);
102-
}
103-
}
57+
$parameters = $this->parseParameterFromNode(
58+
$this->node,
59+
$parameters
60+
);
10461

10562
$descriptorObject = Descriptor::factory()
10663
// TODO: All method returns void. Will implement return type.
10764
->setReturn(_Void::class);
10865

10966
foreach ($parameters as $keyName => $value) {
110-
if ($value === null) {
111-
throw new AssembleStructureException(
112-
'Parameter length are mismatch.'
113-
);
114-
}
67+
// Fill local storage number.
68+
$this->assembleAssignVariable(
69+
$keyName,
70+
$value['type'],
71+
$value['deep_array']
72+
);
11573

11674
$descriptorObject->addArgument(
11775
$value['type'],
@@ -148,12 +106,12 @@ public function assemble(): void
148106
}
149107

150108
$method = (
151-
new Method(
152-
$methodAccessFlag->make(),
153-
$this->getClassAssembler()->getClassName(),
154-
$this->methodName,
155-
$descriptor
156-
)
109+
new Method(
110+
$methodAccessFlag->make(),
111+
$this->getClassAssembler()->getClassName(),
112+
$this->methodName,
113+
$descriptor
114+
)
157115
)
158116
->setConstantPool($this->getConstantPool())
159117
->setConstantPoolFinder($this->getConstantPoolFinder())

src/Compiler/Lang/Assembler/ParameterServiceInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use PHPJava\Compiler\Builder\Finder\ConstantPoolFinder;
77
use PHPJava\Compiler\Lang\Assembler\Processors\AbstractProcessor;
88
use PHPJava\Compiler\Lang\Assembler\Store\Store;
9+
use PHPJava\Compiler\Lang\Assembler\Structure\Accessor\StructureAccessorsLocator;
910

1011
/**
1112
* @method AbstractAssembler|AbstractProcessor setConstantPool(ConstantPool $constantPool)
@@ -22,6 +23,7 @@
2223
* @method MethodAssembler getMethodAssembler()
2324
* @method AbstractAssembler|AbstractProcessor setClassAssembler(ClassAssembler $methodAssembler)
2425
* @method ClassAssembler getClassAssembler()
26+
* @method StructureAccessorsLocator getStructureAccessorsLocator()
2527
* @emthod EntryPointClassAssembler getEntryPointClassAssembler()
2628
* @emthod AbstractAssembler|AbstractProcessor setEntryPointClassAssembler(EntryPointClassAssembler $entryPointClassAssembler)
2729
*/

0 commit comments

Comments
 (0)