haxeui/haxeui-core

View on GitHub
haxe/ui/macros/NativeMacros.hx

Summary

Maintainability
Test Coverage
package haxe.ui.macros;

#if macro
import haxe.macro.Context;
import haxe.macro.Expr;
import haxe.ui.macros.helpers.CodeBuilder;
import haxe.ui.parsers.config.ConfigParser;
import haxe.ui.util.GenericConfig;
import sys.io.File;
#end

class NativeMacros {
    private static var _nativeProcessed:Bool;

    macro public static function processNative():Expr {
        if (_nativeProcessed == true) {
            return macro null;
        }

        _nativeProcessed = true;

        var nativeConfigs:Array<GenericConfig> = loadNativeConfig();
        var builder = new CodeBuilder();
        for (config in nativeConfigs) {
            MacroHelpers.buildGenericConfigCode(builder, config, "nativeConfig");
        }

        return builder.expr;
    }

    #if macro
    private static var _nativeConfigLoaded:Bool = false;
    private static var _nativeConfigs:Array<GenericConfig> = new Array<GenericConfig>();
    public static function loadNativeConfig():Array<GenericConfig> {
        if (_nativeConfigLoaded == true) {
            return _nativeConfigs;
        }

        #if haxeui_macro_times
        var stopTimer = Context.timer("NativeMacros.loadNativeConfig");
        #end
        MacroHelpers.scanClassPath(function(filePath:String, base:String) {
            var parser:ConfigParser = ConfigParser.get(MacroHelpers.extension(filePath));
            if (parser != null) {
                try {
                    var config:GenericConfig = parser.parse(File.getContent(filePath), Context.getDefines());
                    _nativeConfigs.push(config);
                    return true;
                } catch (e:Dynamic) {
                    trace('WARNING: Problem parsing native ${MacroHelpers.extension(filePath)} (${filePath}) - ${e} (skipping file)');
                    return false;
                }
            }

            return false;
        }, ["native."]);
        #if haxeui_macro_times
        stopTimer();
        #end

        _nativeConfigLoaded = true;
        return _nativeConfigs;
    }
    #end
}