2
0

Syntax.macro.hx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (C)2005-2019 Haxe Foundation
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  20. * DEALINGS IN THE SOFTWARE.
  21. */
  22. package php;
  23. import haxe.macro.Expr;
  24. import haxe.macro.Context;
  25. /**
  26. Special extern class to support PHP language specifics.
  27. Don't use these functions unless you are really sure what you are doing.
  28. **/
  29. @:noClosure
  30. @:noPackageRestrict
  31. class Syntax {
  32. /**
  33. ```haxe
  34. Syntax.customArrayDecl([v1 => v2, v3 => v4]);
  35. ```
  36. Generates native array declaration:
  37. ```haxe
  38. [$v1 => $v2, $v3 => $v4]
  39. ```
  40. **/
  41. macro static function customArrayDecl<T>(decl:Expr):ExprOf<php.NativeArray> {
  42. function invalidExpr(pos:Position) {
  43. Context.error('Invalid expression passed to php.Syntax.customArrayDecl()', pos);
  44. return macro @:pos(decl.pos) new php.NativeArray();
  45. }
  46. switch decl.expr {
  47. case EArrayDecl(items):
  48. var placeholders = [];
  49. var args = [];
  50. for(i => e in items) {
  51. switch e {
  52. case macro $index => $value:
  53. placeholders.push('{${i * 2}} => {${i * 2 + 1}}');
  54. args.push(index);
  55. args.push(value);
  56. case _:
  57. return invalidExpr(e.pos);
  58. }
  59. }
  60. var code = '[${placeholders.join(', ')}]';
  61. args.unshift(macro @:pos(decl.pos) $v{code});
  62. return macro @:pos(decl.pos) (php.Syntax.code($a{args}):php.NativeArray);
  63. case _:
  64. return invalidExpr(decl.pos);
  65. }
  66. }
  67. }