haxe icon indicating copy to clipboard operation
haxe copied to clipboard

Abstract generate @:impliciteCast instead of cast in some situation, cause different behavior on HL

Open yuxiaomao opened this issue 1 year ago • 0 comments

When working with -D hl-check, I saw the following situation generate @:implicitCast ([Meta:String] :implicitCast in dump). @:implicitCast is not parsed by HL, which cause a type mismatch on call to .split (Dynamic instead of String). Simply separate the line in two will not remove such metadata, and the cast is done correctly.

I'm wondering if that's some abstract related issue? Because I didn't see other target parse @:implicitCast tag, and when checking with a larger codebase, @:implicitCast seems mostly generated with on a same type or with a Null<>. Or maybe I'm missing something and it's better to fix it in HL?

class Test {
	public static function parse (json:String) {
		var rawData: DataRaw = haxe.Json.parse(json);
		var encoded = rawData.mappings.split(';'); // generate @:implicitCast instead of Cast before split
		trace(encoded);
	}

	static function main() {
		parse("{ \"mappings\" : \"some;thing\"}");
	}
}

abstract DataRaw(haxe.DynamicAccess<Any>) to haxe.DynamicAccess<Any> {
	public var mappings(get,never) : String;
	inline function get_mappings() : String
		return this.get('mappings');
}

Dump:

[Var encoded<12356>(VUsedByTyper):Array<String>]
	[Call:Array<String>]
		[Field:(delimiter : String) -> Array<String>]
			[Meta:String]
				:implicitCast
				[Cast:Dynamic]
					[Cast:Null<Any>]
						[Call:Dynamic]
							[Field:(o : Dynamic, field : String) -> Dynamic]
								[TypeExpr Reflect:Class<Reflect>]
								[FStatic:(o : Dynamic, field : String) -> Dynamic]
									Reflect
									field:(o : Dynamic, field : String) -> Dynamic
							[Cast:Dynamic<Any>] [Cast:haxe.DynamicAccess<Any>] [Local rawData(12337):DataRaw:DataRaw]
							[Const:String] "mappings"
			[FInstance:(delimiter : String) -> Array<String>]
				String
				split:(delimiter : String) -> Array<String>
		[Const:String] ";"

yuxiaomao avatar Jul 19 '24 09:07 yuxiaomao