1
1
<?php namespace xp \compiler ;
2
2
3
- use lang \ast \Language ;
3
+ use lang \ast \{Language , Emitter };
4
+ use lang \reflect \Package ;
4
5
use util \cmd \Console ;
5
6
6
7
class Usage {
@@ -9,24 +10,31 @@ class Usage {
9
10
public static function main (array $ args ) {
10
11
Console::$ err ->writeLine ('Usage: xp compile <in> [<out>] ' );
11
12
12
- // Show syntax implementations sorted by class loader
13
- $ loaders = $ sorted = [];
14
- foreach (Language::named ('PHP ' )->extensions () as $ extension ) {
15
- $ t = typeof ($ extension );
16
- $ l = $ t ->getClassLoader ();
17
- $ hash = $ l ->hashCode ();
18
- if (isset ($ sorted [$ hash ])) {
19
- $ sorted [$ hash ][]= $ t ;
20
- } else {
21
- $ loaders [$ hash ]= $ l ;
22
- $ sorted [$ hash ]= [$ t ];
13
+ $ impl = new class () {
14
+ public $ byLoader = [];
15
+
16
+ public function add ($ t , $ active = false ) {
17
+ $ this ->byLoader [$ t ->getClassLoader ()->toString ()][$ t ->getName ()]= $ active ;
18
+ }
19
+ };
20
+
21
+ $ default = Emitter::forRuntime ('PHP. ' .PHP_VERSION );
22
+ foreach (Package::forName ('lang.ast.emit ' )->getClasses () as $ class ) {
23
+ if ($ class ->isSubclassOf (Emitter::class) && !(MODIFIER_ABSTRACT & $ class ->getModifiers ())) {
24
+ $ impl ->add ($ class , $ class ->equals ($ default ));
23
25
}
24
26
}
25
- foreach ($ sorted as $ hash => $ list ) {
27
+
28
+ foreach (Language::named ('PHP ' )->extensions () as $ extension ) {
29
+ $ impl ->add (typeof ($ extension ), true );
30
+ }
31
+
32
+ // Show implementations sorted by class loader
33
+ foreach ($ impl ->byLoader as $ loader => $ list ) {
26
34
Console::$ err ->writeLine ();
27
- Console::$ err ->writeLine ("\033[33m@ " , $ loaders [ $ hash ] , "\033[0m " );
28
- foreach ($ list as $ syntax ) {
29
- Console::$ err ->writeLine ($ syntax -> getName () );
35
+ Console::$ err ->writeLine ("\033[33m@ " , $ loader , "\033[0m " );
36
+ foreach ($ list as $ impl => $ active ) {
37
+ Console::$ err ->writeLine ($ impl , $ active ? " [ \033 [36m* \033 [0m] " : '' );
30
38
}
31
39
}
32
40
return 2 ;
0 commit comments