Skip to content
This repository was archived by the owner on Sep 9, 2019. It is now read-only.

Commit c94ee4b

Browse files
committed
Merge pull request #43 from xp-lang/feature/class-name-scalars
Add support for class Name Resolution As Scalar Via "class" Keyword
2 parents a0b793c + ef03139 commit c94ee4b

File tree

6 files changed

+1299
-1229
lines changed

6 files changed

+1299
-1229
lines changed

src/main/jay/grammars/php.jay

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ use xp\compiler\ast\MemberAccessNode;
4040
use xp\compiler\ast\StaticMemberAccessNode;
4141
use xp\compiler\ast\ConstantNode;
4242
use xp\compiler\ast\ConstantAccessNode;
43-
use xp\compiler\ast\ClassAccessNode;
43+
use xp\compiler\ast\ClassNameAccessNode;
4444
use xp\compiler\ast\IntegerNode;
4545
use xp\compiler\ast\HexNode;
4646
use xp\compiler\ast\OctalNode;
@@ -379,6 +379,9 @@ annotationvalue:
379379
| qualifiedname T_DOUBLE_COLON T_VARIABLE {
380380
$$= $yyLex->create(new StaticMemberAccessNode(new TypeName($1), $3));
381381
}
382+
| qualifiedname T_DOUBLE_COLON T_CLASS {
383+
$$= $yyLex->create(new ClassNameAccessNode(new TypeName($1)));
384+
}
382385
;
383386

384387

@@ -559,6 +562,9 @@ staticmember:
559562
| T_WORD {
560563
$$= new ConstantAccessNode(NULL, $1);
561564
}
565+
| T_CLASS {
566+
$$= new ClassNameAccessNode(NULL);
567+
}
562568
;
563569

564570
expression:
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php namespace xp\compiler\ast;
2+
3+
/**
4+
* Represents class name access
5+
*
6+
* ```php
7+
* self::class;
8+
* ```
9+
*/
10+
class ClassNameAccessNode extends Node {
11+
public $type= null;
12+
13+
/**
14+
* Constructor
15+
*
16+
* @param xp.compiler.types.TypeName type
17+
*/
18+
public function __construct($type= null) {
19+
$this->type= $type;
20+
}
21+
}

src/main/php/xp/compiler/emit/Emitter.class.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,14 @@ protected abstract function emitConstantAccess($b, $access);
314314
*/
315315
protected abstract function emitClassAccess($b, $access);
316316

317+
/**
318+
* Emit class name access
319+
*
320+
* @param xp.compiler.emit.Buffer b
321+
* @param xp.compiler.ast.ClassNameAccessNode access
322+
*/
323+
protected abstract function emitClassNameAccess($b, $access);
324+
317325
/**
318326
* Emit a braced expression
319327
*

src/main/php/xp/compiler/emit/php/Emitter.class.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,17 @@ public function emitClassAccess($b, $access) {
685685
$this->scope[0]->setType($access, $classType);
686686
}
687687

688+
/**
689+
* Emit class name access
690+
*
691+
* @param xp.compiler.emit.Buffer b
692+
* @param xp.compiler.ast.ClassNameAccessNode access
693+
*/
694+
public function emitClassNameAccess($b, $access) {
695+
$b->append("'")->append(substr($this->literal($this->resolveType($access->type)), 1))->append("'");
696+
$this->scope[0]->setType($access, new TypeName('string'));
697+
}
698+
688699
/**
689700
* Emit a braced expression
690701
*

0 commit comments

Comments
 (0)