2024-01-29 09:26:07 +08:00

167 lines
4.3 KiB
JavaScript

/*
Language: Haxe
Description: Haxe is an open source toolkit based on a modern, high level, strictly typed programming language.
Author: Christopher Kaster <ikasoki@gmail.com> (Based on the actionscript.js language file by Alexander Myadzel)
Contributors: Kenton Hamaluik <kentonh@gmail.com>
Website: https://haxe.org
*/
function haxe(hljs) {
const IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';
// C_NUMBER_RE with underscores and literal suffixes
const HAXE_NUMBER_RE = /(-?)(\b0[xX][a-fA-F0-9_]+|(\b\d+(\.[\d_]*)?|\.[\d_]+)(([eE][-+]?\d+)|i32|u32|i64|f64)?)/;
const HAXE_BASIC_TYPES = 'Int Float String Bool Dynamic Void Array ';
return {
name: 'Haxe',
aliases: [ 'hx' ],
keywords: {
keyword: 'abstract break case cast catch continue default do dynamic else enum extern '
+ 'final for function here if import in inline is macro never new override package private get set '
+ 'public return static super switch this throw trace try typedef untyped using var while '
+ HAXE_BASIC_TYPES,
built_in:
'trace this',
literal:
'true false null _'
},
contains: [
{
className: 'string', // interpolate-able strings
begin: '\'',
end: '\'',
contains: [
hljs.BACKSLASH_ESCAPE,
{
className: 'subst', // interpolation
begin: /\$\{/,
end: /\}/
},
{
className: 'subst', // interpolation
begin: /\$/,
end: /\W\}/
}
]
},
hljs.QUOTE_STRING_MODE,
hljs.C_LINE_COMMENT_MODE,
hljs.C_BLOCK_COMMENT_MODE,
{
className: 'number',
begin: HAXE_NUMBER_RE,
relevance: 0
},
{
className: 'variable',
begin: "\\$" + IDENT_RE,
},
{
className: 'meta', // compiler meta
begin: /@:?/,
end: /\(|$/,
excludeEnd: true,
},
{
className: 'meta', // compiler conditionals
begin: '#',
end: '$',
keywords: { keyword: 'if else elseif end error' }
},
{
className: 'type', // function types
begin: /:[ \t]*/,
end: /[^A-Za-z0-9_ \t\->]/,
excludeBegin: true,
excludeEnd: true,
relevance: 0
},
{
className: 'type', // types
begin: /:[ \t]*/,
end: /\W/,
excludeBegin: true,
excludeEnd: true
},
{
className: 'type', // instantiation
begin: /new */,
end: /\W/,
excludeBegin: true,
excludeEnd: true
},
{
className: 'title.class', // enums
beginKeywords: 'enum',
end: /\{/,
contains: [ hljs.TITLE_MODE ]
},
{
className: 'title.class', // abstracts
begin: '\\babstract\\b(?=\\s*' + hljs.IDENT_RE + '\\s*\\()',
end: /[\{$]/,
contains: [
{
className: 'type',
begin: /\(/,
end: /\)/,
excludeBegin: true,
excludeEnd: true
},
{
className: 'type',
begin: /from +/,
end: /\W/,
excludeBegin: true,
excludeEnd: true
},
{
className: 'type',
begin: /to +/,
end: /\W/,
excludeBegin: true,
excludeEnd: true
},
hljs.TITLE_MODE
],
keywords: { keyword: 'abstract from to' }
},
{
className: 'title.class', // classes
begin: /\b(class|interface) +/,
end: /[\{$]/,
excludeEnd: true,
keywords: 'class interface',
contains: [
{
className: 'keyword',
begin: /\b(extends|implements) +/,
keywords: 'extends implements',
contains: [
{
className: 'type',
begin: hljs.IDENT_RE,
relevance: 0
}
]
},
hljs.TITLE_MODE
]
},
{
className: 'title.function',
beginKeywords: 'function',
end: /\(/,
excludeEnd: true,
illegal: /\S/,
contains: [ hljs.TITLE_MODE ]
}
],
illegal: /<\//
};
}
export { haxe as default };