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

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

SyntaxDefinition& addeC() {

	return SyntaxDefinitionManager::instance()
		->add(

			{ "eC",
			  { "%.ec$", "%.eh$" },
			  {
				  { { "//.-\n" }, "comment" },
				  { { "/%*", "%*/" }, "comment" },
				  { { "(#%s*include)%s+([<%\"][%w%d%.%\\%/%_%-]+[>%\"])" },
					{ "keyword", "keyword", "literal" } },
				  { { "\"", "[\"\n]", "\\" }, "string" },
				  { { "'", "'", "\\" }, "string" },
				  { { "(class|struct)\\s+([A-Za-z]\\w*)\\s*:\\s*([A-Za-z]\\w*)" },
					{ "keyword", "keyword", "type", "type" },
					"",
					SyntaxPatternMatchType::RegEx },
				  { { "(class|struct)\\s+([A-Za-z]\\w*)" },
					{ "keyword", "keyword", "type" },
					"",
					SyntaxPatternMatchType::RegEx },
				  { { "c_number_parser" }, "number", "", SyntaxPatternMatchType::Parser },
				  { { "[%+%-=/%*%^%%<>!~|&]" }, "operator" },
				  { { "(if|for|while|switch)\\s*(?=\\()" },
					{ "normal", "keyword", "keyword" },
					"",
					SyntaxPatternMatchType::RegEx },
				  { { "[%a_][%w_]*%f[(]" }, "function" },
				  { { "#[%a_][%w_]*" }, "symbol" },
				  { { "[%a_][%w_]*" }, "symbol" },

			  },
			  {

				  { "elseif", "keyword" },
				  { "int", "type" },
				  { "then", "keyword" },
				  { "unsigned", "type" },
				  { "continue", "keyword" },
				  { "default", "keyword" },
				  { "volatile", "keyword" },
				  { "switch", "keyword" },
				  { "char", "type" },
				  { "double", "type" },
				  { "auto", "keyword" },
				  { "bool", "type" },
				  { "return", "keyword" },
				  { "extern", "keyword" },
				  { "NULL", "literal" },
				  { "long", "type" },
				  { "void", "keyword" },
				  { "union", "keyword" },
				  { "short", "type" },
				  { "static", "keyword" },
				  { "inline", "keyword" },
				  { "false", "literal" },
				  { "for", "keyword" },
				  { "goto", "keyword" },
				  { "while", "keyword" },
				  { "const", "keyword" },
				  { "int32_t", "type" },
				  { "int16_t", "type" },
				  { "uint16_t", "type" },
				  { "typedef", "keyword" },
				  { "true", "literal" },
				  { "else", "keyword" },
				  { "uint32_t", "type" },
				  { "enum", "keyword" },
				  { "int8_t", "type" },
				  { "int64_t", "type" },
				  { "float", "type" },
				  { "struct", "keyword" },
				  { "break", "keyword" },
				  { "uint8_t", "type" },
				  { "uint64_t", "type" },
				  { "case", "keyword" },
				  { "if", "keyword" },
				  { "do", "keyword" },

				  { "#if", "keyword" },
				  { "#ifdef", "keyword" },
				  { "#ifndef", "keyword" },
				  { "#elif", "keyword" },
				  { "#else", "keyword" },
				  { "#endif", "keyword" },
				  { "#define", "keyword" },
				  { "#undef", "keyword" },
				  { "#include", "keyword" },
				  { "#line", "keyword" },
				  { "#error", "keyword" },
				  { "#pragma", "keyword" },
				  { "#warning ", "keyword" },
				  { "#elifdef ", "keyword" },
				  { "#elifndef ", "keyword" },

				  { "class", "keyword" },
				  { "private", "keyword" },
				  { "public", "keyword" },
				  { "property", "keyword" },
				  { "import", "keyword" },
				  { "delete", "keyword" },
				  { "new", "keyword" },
				  { "new0", "keyword" },
				  { "renew", "keyword" },
				  { "renew0", "keyword" },
				  { "define", "keyword" },
				  { "get", "keyword" },
				  { "set", "keyword" },
				  { "remote", "keyword" },
				  { "dllexport", "keyword" },
				  { "dllimport", "keyword" },
				  { "stdcall", "keyword" },
				  { "subclass", "keyword" },
				  { "__on_register_module", "keyword" },
				  { "namespace", "keyword" },
				  { "using", "keyword" },
				  { "typed_object", "keyword" },
				  { "any_object", "keyword" },
				  { "incref", "keyword" },
				  { "register", "keyword" },
				  { "watch", "keyword" },
				  { "stopwatching", "keyword" },
				  { "firewatchers", "keyword" },
				  { "watchable", "keyword" },
				  { "class_designer", "keyword" },
				  { "class_fixed", "keyword" },
				  { "class_no_expansion", "keyword" },
				  { "isset", "keyword" },
				  { "class_default_property", "keyword" },
				  { "property_category", "keyword" },
				  { "class_data", "keyword" },
				  { "class_property", "keyword" },
				  { "virtual", "keyword" },
				  { "thisclass", "keyword" },
				  { "unichar", "keyword" },
				  { "dbtable", "keyword" },
				  { "dbindex", "keyword" },
				  { "database_open", "keyword" },
				  { "dbfield", "keyword" },

				  { "uint", "type" },
				  { "uint32", "type" },
				  { "uint16", "type" },
				  { "uint64", "type" },
				  { "bool", "type" },
				  { "byte", "type" },
				  { "int64", "type" },
				  { "uintptr", "type" },
				  { "intptr", "type" },
				  { "intsize", "type" },
				  { "uintsize", "type" },
				  { "string", "type" },
				  { "unichar", "type" },

				  { "this", "keyword" },
				  { "false", "keyword" },
				  { "null", "literal" },
				  { "value", "literal" },

			  },
			  "//",
			  {}

			} )
		.setFoldRangeType( FoldRangeType::Braces )
		.setFoldBraces( { { '{', '}' } } )
		.setBlockComment( { "/*", "*/" } );
}

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