
import { languages } from 'prismjs';

const extra_keywords = [
	{
		pattern: /\b(?:memory\.(?:init|copy|fill)|data\.(?:drop)|table\.(?:init|copy|grow|size|fill|get|set)|elem\.(?:drop)|ref\.(?:null|is_null|func))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	/\b(?:funcref|externref)\b/,

	// ===== SIMD / Vectors =====
	{
		pattern: /\b(?:v128\.(?:const|store(?:(?:8|16|32|64)_lane)?|load(?:(?:8x8|16x4|32x2)_[su]|(?:8|16|32|64)_splat|(?:8|16|32|64)_lane|(?:32|64)_zero)?|not|and|andnot|or|xor|bitselect|any_true))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:i(?:8x16|16x8|32x4|64x2)\.(?:splat|replace_lane|abs|neg|all_true|bitmask|shl|eq|ne|(?:shr)_[su]))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:i(?:8x16|16x8|32x4)\.(?:(?:[gl][te]|min|max)_[su]))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:i8x16\.(?:shuffle|swizzle|popcnt|avgr_u|(?:add|sub)(?:_sat_[su])?|(?:extract_lane|narrow_i16x8|extadd_pairwise_(?:i8x16|i16x8))_[su]))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:i16x8\.(?:mul|avgr_u|q15mulr_sat_s|(?:add|sub)(?:_sat_[su])?|(?:extract_lane|narrow_i32x4|(?:extend|extmul)_(?:low|high)_i8x16)_[su]))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:i32x4\.(?:extract_lane|add|sub|mul|dot_i16x8_s|(?:(?:extend|extmul)_(?:low|high)_i16x8|trunc_sat_f32x4)_[su]|trunc_sat_f64x2_[su]_zero))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:i64x2\.(?:extract_lane|add|sub|mul|[gl][te]_s|(?:extend|extmul)_(?:low|high)_i32x4_[su]))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:f(?:32x4|64x2)\.(?:splat|extract_lane|replace_lane|eq|ne|[gl][te]|ceil|floor|trunc|nearest|abs|neg|sqrt|add|sub|mul|div|p?(?:min|max)))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:f32x4\.(?:demote_f64x2_zero|convert_i32x4_[su]))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	{
		pattern: /\b(?:f64x2\.(?:promote_low_f32x4|convert_low_i32x4_[su]))\b/,
		inside: {
			'punctuation': /\./
		}
	},
	/\b(?:i8x16|i16x8|i32x4|i64x2|f32x4|f64x2)\b/,
];

if (Array.isArray(languages.wasm.keyword)) {
	languages.wasm.keyword.unshift(...extra_keywords);
}
