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

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

void addSolidity() {

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

		{ "Solidity",
		  { "%.sol$" },
		  {
			  { { "//.-\n" }, "comment" },
			  { { "/%*", "%*/" }, "comment" },
			  { { "\"\"\"", "\"\"\"" }, "string" },
			  { { "\"", "\"", "\\" }, "string" },
			  { { "-?0x%x+" }, "number" },
			  { { "-?%d+[%d%.eE]*f?" }, "number" },
			  { { "-?%.?%d+f?" }, "number" },
			  { { "[%+%-=/%*%^%%<>!~|&]" }, "operator" },
			  { { "[%a_][%w_]*%f[(]" }, "function" },
			  { { "[%a_][%w_]*" }, "symbol" },

		  },
		  {
			  { "interface", "keyword" },
			  { "bytes3", "keyword2" },
			  { "blockhash", "keyword2" },
			  { "uint64", "keyword2" },
			  { "ecrecover", "keyword2" },
			  { "new", "keyword" },
			  { "ripemd160", "keyword2" },
			  { "sha3", "keyword2" },
			  { "byte", "keyword2" },
			  { "bytes32", "keyword2" },
			  { "suicide", "keyword2" },
			  { "virtual", "keyword2" },
			  { "revert", "keyword2" },
			  { "bytes30", "keyword2" },
			  { "msg", "keyword2" },
			  { "bytes15", "keyword2" },
			  { "enum", "keyword" },
			  { "payable", "keyword2" },
			  { "assembly", "keyword" },
			  { "super", "keyword2" },
			  { "library", "keyword" },
			  { "private", "keyword2" },
			  { "is", "keyword" },
			  { "now", "keyword2" },
			  { "throw", "keyword" },
			  { "bytes18", "keyword2" },
			  { "contract", "keyword" },
			  { "view", "keyword2" },
			  { "bytes14", "keyword2" },
			  { "let", "keyword" },
			  { "external", "keyword2" },
			  { "return", "keyword" },
			  { "mulmod", "keyword2" },
			  { "modifier", "keyword" },
			  { "bytes12", "keyword2" },
			  { "uint256", "keyword2" },
			  { "assert", "keyword2" },
			  { "tx", "keyword2" },
			  { "require", "keyword" },
			  { "bytes8", "keyword2" },
			  { "uint32", "keyword2" },
			  { "returns", "keyword" },
			  { "do", "keyword" },
			  { "sha256", "keyword2" },
			  { "while", "keyword" },
			  { "bytes23", "keyword2" },
			  { "function", "keyword" },
			  { "memory", "keyword2" },
			  { "event", "keyword" },
			  { "else", "keyword" },
			  { "break", "keyword" },
			  { "for", "keyword" },
			  { "address", "keyword2" },
			  { "bytes4", "keyword2" },
			  { "abstract", "keyword" },
			  { "gasleft", "keyword2" },
			  { "keccak256", "keyword2" },
			  { "bytes25", "keyword2" },
			  { "bytes28", "keyword2" },
			  { "this", "keyword2" },
			  { "bytes10", "keyword2" },
			  { "protected", "keyword" },
			  { "uint8", "keyword2" },
			  { "delete", "keyword" },
			  { "indexed", "keyword2" },
			  { "bytes11", "keyword2" },
			  { "bytes17", "keyword2" },
			  { "bytes21", "keyword2" },
			  { "bytes5", "keyword2" },
			  { "bytes26", "keyword2" },
			  { "bytes16", "keyword2" },
			  { "string", "keyword2" },
			  { "bytes31", "keyword2" },
			  { "emit", "keyword" },
			  { "int32", "keyword2" },
			  { "bytes19", "keyword2" },
			  { "bytes27", "keyword2" },
			  { "int16", "keyword2" },
			  { "int8", "keyword2" },
			  { "bytes13", "keyword2" },
			  { "bytes22", "keyword2" },
			  { "hash", "keyword2" },
			  { "bytes7", "keyword2" },
			  { "pragma", "keyword2" },
			  { "int128", "keyword2" },
			  { "bytes29", "keyword2" },
			  { "int256", "keyword2" },
			  { "bytes", "keyword2" },
			  { "int64", "keyword2" },
			  { "uint16", "keyword2" },
			  { "int", "keyword2" },
			  { "uint", "keyword2" },
			  { "bytes24", "keyword2" },
			  { "struct", "keyword" },
			  { "uint128", "keyword2" },
			  { "bytes2", "keyword2" },
			  { "bytes6", "keyword2" },
			  { "bytes1", "keyword2" },
			  { "override", "keyword2" },
			  { "constructor", "keyword" },
			  { "using", "keyword" },
			  { "nonpayable", "keyword2" },
			  { "mapping", "keyword2" },
			  { "inherited", "keyword2" },
			  { "bytes9", "keyword2" },
			  { "pure", "keyword2" },
			  { "selfdestruct", "keyword2" },
			  { "immutable", "keyword2" },
			  { "constant", "keyword2" },
			  { "bytes20", "keyword2" },
			  { "addmod", "keyword2" },
			  { "internal", "keyword2" },
			  { "bool", "keyword2" },
			  { "public", "keyword2" },
			  { "block", "keyword2" },
			  { "storage", "keyword2" },
			  { "calldata", "keyword2" },
			  { "if", "keyword" },
			  { "continue", "keyword" },

		  },
		  "",
		  {}

		} );

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

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