All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.prezi.spaghetti.haxe.HaxeEnumGeneratorVisitor.groovy Maven / Gradle / Ivy

package com.prezi.spaghetti.haxe

import com.prezi.spaghetti.ast.EnumNode
import com.prezi.spaghetti.ast.EnumValueNode
import com.prezi.spaghetti.ast.StringModuleVisitorBase

class HaxeEnumGeneratorVisitor extends StringModuleVisitorBase {
	@Override
	String visitEnumNode(EnumNode node) {
		def enumName = node.name

		def values = []
		node.values.eachWithIndex { value, index ->
			values.add value.accept(new EnumValueVisitor(enumName, index))
		}

		return \
"""abstract ${enumName}(Int) {
${values.join("\n")}

	static var _values:Array<${enumName}> = [ ${node.values.join(", ")} ];
	static var _names:Array =  [ ${node.values.collect { "\"${it}\"" }.join(", ")} ];

	inline function new(value:Int) {
		this = value;
	}

	@:to public function value():Int {
		return this;
	}

	@:from public static function fromValue(value:Int) {
		if (value < 0 || value >= _values.length) {
			throw "Invalid value for ${enumName}: " + value;
		}
		var result = _values[value];
		return result;
	}

	@:to public inline function name():String {
		return _names[this];
	}

	@:from public static inline function valueOf(name:String) {
		return switch(name)
		{
${node.values.collect {"			case \"${it}\": ${it};"}.join("\n")}
			default: throw "Invalid name for ${enumName}: " + name;
		};
	}

	public static function values():Array<${enumName}> {
		return _values.copy();
	}
}
"""
	}

	private static class EnumValueVisitor extends AbstractHaxeGeneratorVisitor {
		private final String enumName
		private final int index

		EnumValueVisitor(String enumName, int index) {
			this.enumName = enumName
			this.index = index
		}

		@Override
		String visitEnumValueNode(EnumValueNode node) {
			return "\tpublic static var ${node.name} = new ${enumName}(${index});"
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy