Compare commits

..

13 Commits

Author SHA1 Message Date
Juraj Kirchheim
45d5f3e0ea Release 0.15.3 2017-12-01 16:32:19 +01:00
Juraj Kirchheim
800891bee2 Fixes #21. 2017-12-01 16:31:22 +01:00
Juraj Kirchheim
0802bf7f79 Minor tweak. 2017-12-01 16:30:42 +01:00
Juraj Kirchheim
42897c7cd5 Merge branch 'master' of https://github.com/haxetink/tink_macro 2017-11-30 13:05:06 +01:00
Juraj Kirchheim
0e902745b1 Release 0.15.2 2017-11-30 13:04:39 +01:00
Juraj Kirchheim
3dec4fa404 Improve position reporting. 2017-11-30 13:04:07 +01:00
Juraj Kirchheim
c0ec918f52 Merge pull request #20 from markknol/patch-1
Update README.md
2017-11-30 11:52:41 +01:00
Mark Knol
4eb9729f0e Update README.md
Fix links in index
2017-11-30 10:56:14 +01:00
Juraj Kirchheim
7586b54ece Release 0.15.1 2017-11-30 10:40:31 +01:00
Juraj Kirchheim
21c7d12be7 Don't drop positions when typing. 2017-11-30 10:39:57 +01:00
Juraj Kirchheim
f27d2796b1 Release 0.15.0 2017-09-25 10:52:48 +02:00
Juraj Kirchheim
417a92cabc Make it compile for Haxe 4. 2017-09-25 10:50:36 +02:00
Kevin Leung
4457ea7dee readme tweaks 2017-09-21 15:02:16 +08:00
5 changed files with 30 additions and 14 deletions

View File

@@ -303,7 +303,7 @@ abstract Member from Field to Field {
Most of the API should be self-explaining. The `isBound` property is a bad name to convey the concept that a field can be either `inline` (`true`) or `dynamic` (`false`) or neither (`null`). Equally, `isPublic` is nullable which means that normally defaults to `private`.
The `publish` method will make a field `public` if it is not `private`. This can also be done with `if (m.isPublic == null) m.isPublic = true;` but the implementation is far more efficient - for what its worth.
The `publish` method will make a field `public` if it is not explicitly marked as `private`. This can also be done with `if (m.isPublic == null) m.isPublic = true;` but the implementation is far more efficient - for what its worth.
The `extractMeta` method will "peel of" the first tag with a given `name` - if available. Note that the tag will be removed from the member.
@@ -391,7 +391,7 @@ The `init` method is the swiss army knife of initializing fields. The `options.p
#### Setter Bypass
It is important to know that when you initialize a field with `options.bypass` set to true, existing setters will by bypassed. That's particularly helpful if your setter triggers a side effect that you don't want triggered. This is achieved by generating the assignment as `(untyped this).$name = $value`. To make the code typesafe again, this is prefixed with `if (false) { var __tmp = this.$name; __tmp = $value; }`. This code is later thrown out by the compiler. Its role is to ensure type safety without interfering with the normal typing order.
It is important to know that when you initialize a field with `options.bypass` set to true, existing setters will be bypassed. That's particularly helpful if your setter triggers a side effect that you don't want triggered. This is achieved by generating the assignment as `(untyped this).$name = $value`. To make the code typesafe again, this is prefixed with `if (false) { var __tmp = this.$name; __tmp = $value; }`. This code is later thrown out by the compiler. Its role is to ensure type safety without interfering with the normal typing order.
Setter bypass also causes the field to gain an `@:isVar`. And currently, with `-dce full`, additional code will be generated to avoid the field to be eliminated.

View File

@@ -11,8 +11,8 @@
"contributors": [
"back2dos"
],
"releasenote": "Add way to get constructor args.",
"version": "0.14.2",
"releasenote": "Fixes issues caused by private types.",
"version": "0.15.3",
"url": "http://haxetink.org/tink_macro",
"dependencies": {
"tink_core": ""

View File

@@ -319,9 +319,8 @@ class Exprs {
expr = [EVars(locals).at(expr.pos), expr].toMBlock(expr.pos);
Success(Context.typeof(expr));
}
catch (e:Error) {
var m:Dynamic = e.message;
e.pos.makeFailure(m);
catch (e:haxe.macro.Error) {
e.pos.makeFailure(e.message);
}
catch (e:Dynamic) {
expr.pos.makeFailure(e);

View File

@@ -12,7 +12,7 @@ class Positions {
return
switch outcome {
case Success(d): d;
case Failure(f): sanitize(pos).error(f);
case Failure(f): pos.error(f);
}
static public function makeBlankType(pos:Position):ComplexType
@@ -32,7 +32,17 @@ class Positions {
static public function error(pos:Position, error:Dynamic):Dynamic
return errorFunc(sanitize(pos), Std.string(error));
return
switch Std.instance(error, tink.core.Error) {
case null: errorFunc(sanitize(pos), Std.string(error));
case error:
errorFunc(
error.pos,
error.message +
if (pos == null) ''
else ' (referenced from ' + Std.string(pos).substr(5)
);
}
static function contextError(pos:Position, error:String):Dynamic
return Context.fatalError(error, pos);

View File

@@ -17,6 +17,7 @@ class Sisyphus {
case AccCall: getOrSet;
case AccInline: "default";
case AccRequire(_, _): "default";
default: throw "not implemented";
}
}
if (cf.params.length == 0) {
@@ -52,12 +53,18 @@ class Sisyphus {
}
}
public static function toComplexType(type : Null<Type>) : Null<ComplexType> return
public static function toComplexType(type : Null<Type>) : Null<ComplexType> return {
inline function direct()
return Types.toComplex(type, { direct: true });
switch (type) {
case null:
null;
case TMono(_.get() => t):
t == null ? Types.toComplex(type, { direct: true }) : toComplexType(t);
case TEnum(_.get().isPrivate => true, _): direct();
case TInst(_.get().isPrivate => true, _): direct();
case TType(_.get().isPrivate => true, _): direct();
case TAbstract(_.get().isPrivate => true, _): direct();
case TMono(_): direct();
case TEnum(_.get() => baseType, params):
TPath(toTypePath(baseType, params));
case TInst(_.get() => classType, params):
@@ -92,7 +99,7 @@ class Sisyphus {
default:
throw "Invalid type";
}
}
static function toTypePath(baseType : BaseType, params : Array<Type>) : TypePath return {
var module = baseType.module;
{
@@ -102,4 +109,4 @@ class Sisyphus {
params: [ for (t in params) TPType(toComplexType(t)) ],
}
}
}
}