haxe property support. close #87
This commit is contained in:
@@ -3,6 +3,7 @@ package kiss;
|
|||||||
import haxe.macro.Expr;
|
import haxe.macro.Expr;
|
||||||
import haxe.macro.Context;
|
import haxe.macro.Context;
|
||||||
import kiss.Reader;
|
import kiss.Reader;
|
||||||
|
import kiss.ReaderExp;
|
||||||
import kiss.Helpers;
|
import kiss.Helpers;
|
||||||
import kiss.Stream;
|
import kiss.Stream;
|
||||||
import kiss.KissError;
|
import kiss.KissError;
|
||||||
@@ -105,10 +106,36 @@ class FieldForms {
|
|||||||
if (type != null)
|
if (type != null)
|
||||||
k.addVarInScope({name: name, type: type}, false);
|
k.addVarInScope({name: name, type: type}, false);
|
||||||
|
|
||||||
|
|
||||||
|
function varOrPropKind(args:Array<ReaderExp>) {
|
||||||
|
return if (args.length > 1) {
|
||||||
|
switch (args[1].def) {
|
||||||
|
case CallExp({pos:_, def:Symbol("property")}, innerArgs):
|
||||||
|
args[1].checkNumArgs(2, 3, "(property <read access> <write access> <?value>)");
|
||||||
|
function accessType(read, arg) {
|
||||||
|
var acceptable = ["default", "null", if (read) "get" else "set", "dynamic", "never"];
|
||||||
|
return switch (arg.def) {
|
||||||
|
case Symbol(access) if (acceptable.contains(access)):
|
||||||
|
access;
|
||||||
|
default: throw KissError.fromExp(arg, 'Expected a haxe property access keyword: one of [${acceptable.join(", ")}]');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var readAccess = accessType(true, innerArgs[0]);
|
||||||
|
var writeAccess = accessType(false, innerArgs[1]);
|
||||||
|
var value = if (innerArgs.length > 2) k.convert(innerArgs[2]) else null;
|
||||||
|
FProp(readAccess, writeAccess, type, value);
|
||||||
|
default:
|
||||||
|
FVar(type, k.convert(args[1]));
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
FVar(type, null);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
({
|
({
|
||||||
name: name,
|
name: name,
|
||||||
access: access,
|
access: access,
|
||||||
kind: FVar(type, if (args.length > 1) k.convert(args[1]) else null),
|
kind: varOrPropKind(args),
|
||||||
pos: wholeExp.macroPos()
|
pos: wholeExp.macroPos()
|
||||||
} : Field);
|
} : Field);
|
||||||
}
|
}
|
||||||
|
@@ -387,6 +387,10 @@ class BasicTestCase extends Test {
|
|||||||
Assert.isFalse(_hasThreadSupport());
|
Assert.isFalse(_hasThreadSupport());
|
||||||
#end
|
#end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testHaxeProperties() {
|
||||||
|
_testHaxeProperties();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BasicObject {
|
class BasicObject {
|
||||||
|
@@ -727,3 +727,14 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m
|
|||||||
(#if target.threaded
|
(#if target.threaded
|
||||||
true
|
true
|
||||||
false))
|
false))
|
||||||
|
|
||||||
|
(var &mut _staticProp 5)
|
||||||
|
(var :Int staticProp (property get set))
|
||||||
|
(function set_staticProp [v] (set _staticProp v))
|
||||||
|
(function get_staticProp [] _staticProp)
|
||||||
|
|
||||||
|
(function _testHaxeProperties []
|
||||||
|
(Assert.equals 5 staticProp)
|
||||||
|
(Assert.equals 9 (set staticProp 9))
|
||||||
|
(Assert.equals 9 staticProp)
|
||||||
|
(Assert.equals 9 _staticProp))
|
Reference in New Issue
Block a user