#include <eepp/ui/doc/languages/odin.hpp>
#include <eepp/ui/doc/syntaxdefinitionmanager.hpp>

namespace EE { namespace UI { namespace Doc { namespace Language {

void addOdin() {

	auto& sd = SyntaxDefinitionManager::instance()->add(

		{ "Odin",
		  { "%.odin$" },
		  {
			  { { "//.-\n" }, "comment" },
			  { { "/%*", "%*/" }, "comment" },
			  { { "\"", "\"", "\\" }, "string" },
			  { { "'", "'", "\\" }, "string" },
			  { { "`", "`" }, "string" },
			  { { "0b[01_]+" }, "number" },
			  { { "0o[0-7_]+" }, "number" },
			  { { "0[dz][%d_]+" }, "number" },
			  { { "0x[%da-fA-F_]+" }, "number" },
			  { { "-?%d+[%d%._e]*i?" }, "number" },
			  { { "([%a_][%w_]+)(%s+::%s+)(proc%s*)%f[(]" },
				{ "normal", "function", "operator", "keyword" } },
			  { { "([%a_][%w_]+)(%s+::%s+)%f[(]" }, { "normal", "function", "operator" } },
			  { { "([%a_][%w_]+)(%s+::%s+)(struct%s*)%f[{]" },
				{ "normal", "keyword2", "operator", "keyword" } },
			  { { "([%a_][%w_]+)(%s+::%s+)(enum%s*)(%w+%s*)%f[{]" },
				{ "normal", "keyword2", "operator", "keyword", "keyword2" } },
			  { { "[<>~=+-*/]=" }, "operator" },
			  { { "[%+%-=/%*%^%%<>!~|&:]" }, "operator" },
			  { { "%$[%a_][%w_]*" }, "operator" },
			  { { "[%a_][%w_]*%f[(]" }, "function" },
			  { { "[#@][%a_][%w_]*" }, "keyword2" },
			  { { "[#@]%b()" }, "keyword2" },
			  { { "[%a_][%w_]*" }, "symbol" },

		  },
		  {
			  { "typeid", "keyword2" },
			  { "i64be", "keyword2" },
			  { "conj", "keyword2" },
			  { "i32le", "keyword2" },
			  { "rawptr", "keyword2" },
			  { "real", "keyword2" },
			  { "typeid_of", "keyword2" },
			  { "type_info_of", "keyword2" },
			  { "offset_of", "keyword2" },
			  { "i64le", "keyword2" },
			  { "align_of", "keyword2" },
			  { "f32", "keyword2" },
			  { "min", "keyword2" },
			  { "u64", "keyword2" },
			  { "cap", "keyword2" },
			  { "cstring", "keyword2" },
			  { "len", "keyword2" },
			  { "byte", "keyword2" },
			  { "transmute", "keyword2" },
			  { "proc", "keyword" },
			  { "any", "keyword2" },
			  { "clamp", "keyword2" },
			  { "auto_cast", "keyword2" },
			  { "uintptr", "keyword2" },
			  { "u16le", "keyword2" },
			  { "complex", "keyword2" },
			  { "const", "keyword" },
			  { "union", "keyword" },
			  { "u32", "keyword2" },
			  { "opaque", "keyword" },
			  { "type_info_base", "keyword2" },
			  { "defer", "keyword" },
			  { "max", "keyword2" },
			  { "do", "keyword" },
			  { "for", "keyword" },
			  { "macro", "keyword" },
			  { "package", "keyword" },
			  { "bit_set", "keyword" },
			  { "switch", "keyword" },
			  { "no_inline", "keyword" },
			  { "quaternion256", "keyword2" },
			  { "if", "keyword" },
			  { "case", "keyword" },
			  { "foreign", "keyword" },
			  { "not_in", "keyword" },
			  { "inline", "keyword" },
			  { "import", "keyword" },
			  { "u8", "keyword2" },
			  { "nil", "literal" },
			  { "i16", "keyword2" },
			  { "swizzle", "keyword2" },
			  { "u16", "keyword2" },
			  { "false", "literal" },
			  { "f16", "keyword2" },
			  { "distinct", "keyword" },
			  { "rune", "keyword2" },
			  { "i16le", "keyword2" },
			  { "b64", "keyword2" },
			  { "i128le", "keyword2" },
			  { "quaternion128", "keyword2" },
			  { "u16be", "keyword2" },
			  { "i32be", "keyword2" },
			  { "u128be", "keyword2" },
			  { "i16be", "keyword2" },
			  { "u32be", "keyword2" },
			  { "complex64", "keyword2" },
			  { "b8", "keyword2" },
			  { "b32", "keyword2" },
			  { "i32", "keyword2" },
			  { "assert", "keyword2" },
			  { "complex128", "keyword2" },
			  { "complex32", "keyword2" },
			  { "return", "keyword" },
			  { "u128", "keyword2" },
			  { "b128", "keyword2" },
			  { "i128be", "keyword2" },
			  { "i8", "keyword2" },
			  { "int", "keyword2" },
			  { "i64", "keyword2" },
			  { "bool", "keyword2" },
			  { "imag", "keyword2" },
			  { "u64be", "keyword2" },
			  { "true", "literal" },
			  { "context", "keyword" },
			  { "dynamic", "keyword" },
			  { "string", "keyword2" },
			  { "i128", "keyword2" },
			  { "when", "keyword" },
			  { "u32le", "keyword2" },
			  { "size_of", "keyword2" },
			  { "u64le", "keyword2" },
			  { "type_of", "keyword2" },
			  { "using", "keyword" },
			  { "map", "keyword" },
			  { "uint", "keyword2" },
			  { "struct", "keyword" },
			  { "cast", "keyword2" },
			  { "enum", "keyword" },
			  { "abs", "keyword2" },
			  { "f64", "keyword2" },
			  { "u128le", "keyword2" },
			  { "continue", "keyword" },
			  { "fallthrough", "keyword" },
			  { "in", "keyword" },
			  { "break", "keyword" },
			  { "else", "keyword" },
			  { "or_break", "keyword" },
			  { "or_continue", "keyword" },
		  },
		  "//",
		  {}

		} );

	sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } );
}

}}}} // namespace EE::UI::Doc::Language
