@wooorm/starry-night
Version:
Syntax highlighting, like GitHub
836 lines (835 loc) • 135 kB
JavaScript
// This is a TextMate grammar distributed by `starry-night`.
// This grammar is licensed `mit`.
// See <https://github.com/wooorm/starry-night> for more info.
/**
* @import {Grammar} from '@wooorm/starry-night'
*/
/** @type {Grammar} */
const grammar = {
dependencies: ['text.html.basic'],
extensions: ['.blade', '.blade.php'],
injections: {
'text.html.php.blade - (meta.embedded | meta.tag | comment.block.blade), L:(text.html.php.blade meta.tag - (comment.block.blade | meta.embedded.block.blade)), L:(source.js.embedded.html - (comment.block.blade | meta.embedded.block.blade))':
{
patterns: [
{include: '#blade'},
{
begin: '(^\\s*)(?=<\\?(?![^?]*\\?>))',
beginCaptures: {
0: {name: 'punctuation.whitespace.embedded.leading.php'}
},
end: '(?!\\G)(\\s*$\\n)?',
endCaptures: {
0: {name: 'punctuation.whitespace.embedded.trailing.php'}
},
patterns: [
{
begin: '<\\?(?i:php|=)?',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'}
},
contentName: 'source.php',
end: '(\\?)>',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'source.php'}
},
name: 'meta.embedded.block.php',
patterns: [{include: '#language'}]
}
]
},
{
begin: '<\\?(?i:php|=)?(?![^?]*\\?>)',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'}
},
contentName: 'source.php',
end: '(\\?)>',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'source.php'}
},
name: 'meta.embedded.block.php',
patterns: [{include: '#language'}]
},
{
begin: '<\\?(?i:php|=)?',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'}
},
end: '>',
endCaptures: {0: {name: 'punctuation.section.embedded.end.php'}},
name: 'meta.embedded.line.php',
patterns: [
{
captures: {
1: {name: 'source.php'},
2: {name: 'punctuation.section.embedded.end.php'},
3: {name: 'source.php'}
},
match: '\\G(\\s*)((\\?))(?=>)',
name: 'meta.special.empty-tag.php'
},
{
begin: '\\G',
contentName: 'source.php',
end: '(\\?)(?=>)',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'source.php'}
},
patterns: [{include: '#language'}]
}
]
}
]
}
},
names: ['blade'],
patterns: [{include: 'text.html.basic'}],
repository: {
balance_brackets: {
patterns: [
{begin: '\\(', end: '\\)', patterns: [{include: '#balance_brackets'}]},
{match: '[^()]+'}
]
},
blade: {
patterns: [
{
begin: '{{--',
beginCaptures: {
0: {name: 'punctuation.definition.comment.begin.blade'}
},
end: '--}}',
endCaptures: {0: {name: 'punctuation.definition.comment.end.blade'}},
name: 'comment.block.blade',
patterns: [
{
begin: '(^\\s*)(?=<\\?(?![^?]*\\?>))',
beginCaptures: {
0: {name: 'punctuation.whitespace.embedded.leading.php'}
},
end: '(?!\\G)(\\s*$\\n)?',
endCaptures: {
0: {name: 'punctuation.whitespace.embedded.trailing.php'}
},
name: 'invalid.illegal.php-code-in-comment.blade',
patterns: [
{
begin: '<\\?(?i:php|=)?',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'}
},
contentName: 'source.php',
end: '(\\?)>',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'source.php'}
},
name: 'meta.embedded.block.php',
patterns: [{include: '#language'}]
}
]
},
{
begin: '<\\?(?i:php|=)?(?![^?]*\\?>)',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'}
},
contentName: 'source.php',
end: '(\\?)>',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'source.php'}
},
name: 'invalid.illegal.php-code-in-comment.blade.meta.embedded.block.php',
patterns: [{include: '#language'}]
},
{
begin: '<\\?(?i:php|=)?',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'}
},
end: '>',
endCaptures: {0: {name: 'punctuation.section.embedded.end.php'}},
name: 'invalid.illegal.php-code-in-comment.blade.meta.embedded.line.php',
patterns: [
{
captures: {
1: {name: 'source.php'},
2: {name: 'punctuation.section.embedded.end.php'},
3: {name: 'source.php'}
},
match: '\\G(\\s*)((\\?))(?=>)',
name: 'meta.special.empty-tag.php'
},
{
begin: '\\G',
contentName: 'source.php',
end: '(\\?)(?=>)',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'source.php'}
},
patterns: [{include: '#language'}]
}
]
}
]
},
{match: '@(?={{{|{{|{!!|@\\w+(?:::\\w+)?)', name: 'comment.blade'},
{
begin: '(?<!@){{{',
beginCaptures: {0: {name: 'support.function.construct.begin.blade'}},
contentName: 'source.php',
end: '(})}}',
endCaptures: {
0: {name: 'support.function.construct.end.blade'},
1: {name: 'source.php'}
},
name: 'meta.function.echo.blade',
patterns: [{include: '#language'}]
},
{
begin: '(?<![@{]){{',
beginCaptures: {0: {name: 'support.function.construct.begin.blade'}},
contentName: 'source.php',
end: '(})}',
endCaptures: {
0: {name: 'support.function.construct.end.blade'},
1: {name: 'source.php'}
},
name: 'meta.function.echo.blade',
patterns: [{include: '#language'}]
},
{
begin: '(?<!@){!!',
beginCaptures: {0: {name: 'support.function.construct.begin.blade'}},
contentName: 'source.php',
end: '(!)!}',
endCaptures: {
0: {name: 'support.function.construct.end.blade'},
1: {name: 'source.php'}
},
name: 'meta.function.echo.blade',
patterns: [{include: '#language'}]
},
{
begin:
'(?x)\n(?<![A-Za-z0-9_@]) # Prepended @ or literal character escapes the sequence\n(\n @\n (?i: # Ordering not important as we everything will be matched up to opening parentheses\n auth\n |break\n |can\n |canany\n |cannot\n |case\n |choice\n |component\n |componentfirst\n |continue\n |dd\n |dump\n |each\n |elseauth\n |elsecan\n |elsecanany\n |elsecannot\n |elseguest\n |elseif\n |empty\n |env\n |error\n |extends\n |for\n |foreach\n |forelse\n |guest\n |hassection\n |if\n |include\n |includefirst\n |includeif\n |includeunless\n |includewhen\n |inject\n |isset\n |json\n |lang\n |method\n |php\n |prepend\n |push\n |section\n |slot\n |stack\n |switch\n |unless\n |unset\n |while\n |yield\n )\n [\\t ]* # Whitespace between name and parentheses\n)\n(\\() # Followed by opening parentheses',
beginCaptures: {
1: {name: 'keyword.blade'},
2: {name: 'begin.bracket.round.blade.php'}
},
contentName: 'source.php',
end: '\\)',
endCaptures: {0: {name: 'end.bracket.round.blade.php'}},
name: 'meta.directive.blade',
patterns: [{include: '#language'}]
},
{
begin:
'(?x)\n(?<![A-Za-z0-9_@]) # Prepended @ or literal character escapes the sequence\n(\n @\n (?i: # Ordering not important as we everything will be matched up to opening parentheses\n append\n |csrf\n |default\n |else\n |endauth\n |endcan\n |endcanany\n |endcannot\n |endcomponent\n |endcomponentfirst\n |endempty\n |endenv\n |enderror\n |endfor\n |endforeach\n |endforelse\n |endguest\n |endif\n |endisset\n |endlang\n |endprepend\n |endproduction\n |endpush\n |endsection\n |endslot\n |endswitch\n |endunless\n |endwhile\n |overwrite\n |parent\n |production\n |show\n |stop\n )\n [\\t ]* # Whitespace between name and parentheses\n)\n(\\() # Followed by opening parentheses',
beginCaptures: {
1: {name: 'keyword.blade'},
2: {name: 'begin.bracket.round.blade.php'}
},
contentName: 'comment.blade',
end: '\\)',
endCaptures: {0: {name: 'end.bracket.round.blade.php'}},
name: 'meta.directive.blade',
patterns: [{include: '#balance_brackets'}]
},
{
match:
'(?x)\n(?<![A-Za-z0-9_@]) # Prepended @ or literal character escapes the sequence\n@\n(?: # Ordering not important as we everything will be matched up to word boundary\n (?i)append\n|(?i)auth\n|(?i)break\n|(?i)continue\n|(?i)csrf\n|(?i)default\n|(?i)else\n|(?i)elseauth\n|(?i)elseguest\n|(?i)empty\n|(?i)endauth\n|(?i)endcan\n|(?i)endcanany\n|(?i)endcannot\n|(?i)endcomponent\n|(?i)endcomponentfirst\n|(?i)endempty\n|(?i)endenv\n|(?i)enderror\n|(?i)endfor\n|(?i)endforeach\n|(?i)endforelse\n|(?i)endguest\n|(?i)endif\n|(?i)endisset\n|(?i)endlang\n|(?i)endprepend\n|(?i)endproduction\n|(?i)endpush\n|(?i)endsection\n|(?i)endslot\n|(?i)endswitch\n|(?i)endunless\n|endverbatim\n|(?i)endwhile\n|(?i)guest\n|(?i)lang\n|(?i)overwrite\n|(?i)parent\n|(?i)production\n|(?i)show\n|(?i)stop\n|verbatim\n)\n\\b',
name: 'keyword.blade'
},
{
begin: '(?<![A-Za-z0-9_@])@(?i:php)\\b',
beginCaptures: {0: {name: 'keyword.begin.blade'}},
contentName: 'source.php',
end: '(?<![A-Za-z0-9_@])(?=@(?i:endphp)\\b)',
endCaptures: {0: {name: 'keyword.end.blade'}},
name: 'meta.embedded.block.blade',
patterns: [{include: '#language'}]
},
{
begin:
'(?x)\n(?<![A-Za-z0-9_@]) # Prepended @ or literal character escapes the sequence\n(\n @\n (?i:\n endphp\n )\n [\\t ]* # Whitespace between name and parentheses\n)\n(\\() # Followed by opening parentheses',
beginCaptures: {
1: {name: 'keyword.end.blade'},
2: {name: 'begin.bracket.round.blade.php'}
},
contentName: 'comment.blade',
end: '\\)',
endCaptures: {0: {name: 'end.bracket.round.blade.php'}},
name: 'meta.directive.blade',
patterns: [{include: '#balance_brackets'}]
},
{
match:
'(?x)\n(?<![A-Za-z0-9_@]) # Prepended @ or literal character escapes the sequence\n@\n(?: # Ordering not important as we everything will be matched up to word boundary\n (?i)endphp\n)\n\\b',
name: 'keyword.end.blade'
},
{
begin:
'(?x)\n(?<![A-Za-z0-9_@]) # Prepended @ or literal character escapes the sequence\n(\n @\n \\w+(?:::\\w+)? # Any number/letter sequence, can also be postfixed by ::someOtherString\n [\\t ]* # Whitespace between name and parentheses\n)\n(\\() # Followed by opening parentheses',
beginCaptures: {
1: {name: 'entity.name.function.blade'},
2: {name: 'begin.bracket.round.blade.php'}
},
contentName: 'source.php',
end: '\\)',
endCaptures: {0: {name: 'end.bracket.round.blade.php'}},
name: 'meta.directive.custom.blade',
patterns: [{include: '#language'}]
},
{
match:
'(?x)\n(?<![A-Za-z0-9_@]) # Prepended @ or literal character escapes the sequence\n@\n\\w+(?:::\\w+)? # Any number/letter sequence, can also be postfixed by ::someOtherString\n\\b # Bounded by word boundary',
name: 'entity.name.function.blade'
}
]
},
'class-builtin': {
patterns: [
{
captures: {1: {name: 'punctuation.separator.inheritance.php'}},
match:
'(?xi)\n(\\\\)?\\b\n((APC|Append)Iterator|Array(Access|Iterator|Object)\n|Bad(Function|Method)CallException\n|(Caching|CallbackFilter)Iterator|Collator|Collectable|Cond|Countable|CURLFile\n|Date(Interval|Period|Time(Interface|Immutable|Zone)?)?|Directory(Iterator)?|DomainException\n|DOM(Attr|CdataSection|CharacterData|Comment|Document(Fragment)?|Element|EntityReference\n |Implementation|NamedNodeMap|Node(list)?|ProcessingInstruction|Text|XPath)\n|(Error)?Exception|EmptyIterator\n|finfo\n|Ev(Check|Child|Embed|Fork|Idle|Io|Loop|Periodic|Prepare|Signal|Stat|Timer|Watcher)?\n|Event(Base|Buffer(Event)?|SslContext|Http(Request|Connection)?|Config|DnsBase|Util|Listener)?\n|FANNConnection|(Filter|Filesystem)Iterator\n|Gender\\\\Gender|GlobIterator|Gmagick(Draw|Pixel)?\n|Haru(Annotation|Destination|Doc|Encoder|Font|Image|Outline|Page)\n|Http((Inflate|Deflate)?Stream|Message|Request(Pool)?|Response|QueryString)\n|HRTime\\\\(PerformanceCounter|StopWatch)\n|Intl(Calendar|((CodePoint|RuleBased)?Break|Parts)?Iterator|DateFormatter|TimeZone)\n|Imagick(Draw|Pixel(Iterator)?)?\n|InfiniteIterator|InvalidArgumentException|Iterator(Aggregate|Iterator)?\n|JsonSerializable\n|KTaglib_(MPEG_(File|AudioProperties)|Tag|ID3v2_(Tag|(AttachedPicture)?Frame))\n|Lapack|(Length|Locale|Logic)Exception|LimitIterator|Lua(Closure)?\n|Mongo(BinData|Client|Code|Collection|CommandCursor|Cursor(Exception)?|Date|DB(Ref)?|DeleteBatch\n |Grid(FS(Cursor|File)?)|Id|InsertBatch|Int(32|64)|Log|Pool|Regex|ResultException|Timestamp\n |UpdateBatch|Write(Batch|ConcernException))?\n|Memcache(d)?|MessageFormatter|MultipleIterator|Mutex\n|mysqli(_(driver|stmt|warning|result))?\n|MysqlndUh(Connection|PreparedStatement)\n|NoRewindIterator|Normalizer|NumberFormatter\n|OCI-(Collection|Lob)|OuterIterator|(OutOf(Bounds|Range)|Overflow)Exception\n|ParentIterator|PDO(Statement)?|Phar(Data|FileInfo)?|php_user_filter|Pool\n|QuickHash(Int(Set|StringHash)|StringIntHash)\n|Recursive(Array|Caching|Directory|Fallback|Filter|Iterator|Regex|Tree)?Iterator\n|Reflection(Class|Function(Abstract)?|Method|Object|Parameter|Property|(Zend)?Extension)?\n|RangeException|Reflector|RegexIterator|ResourceBundle|RuntimeException|RRD(Creator|Graph|Updater)\n|SAM(Connection|Message)|SCA(_(SoapProxy|LocalProxy))?\n|SDO_(DAS_(ChangeSummary|Data(Factory|Object)|Relational|Setting|XML(_Document)?)\n |Data(Factory|Object)|Exception|List|Model_(Property|ReflectionDataObject|Type)|Sequence)\n|SeekableIterator|Serializable|SessionHandler(Interface)?|SimpleXML(Iterator|Element)|SNMP\n|Soap(Client|Fault|Header|Param|Server|Var)\n|SphinxClient|Spoofchecker\n|Spl(DoublyLinkedList|Enum|File(Info|Object)|FixedArray|(Max|Min)?Heap|Observer|ObjectStorage\n |(Priority)?Queue|Stack|Subject|Type|TempFileObject)\n|SQLite(3(Result|Stmt)?|Database|Result|Unbuffered)\n|stdClass|streamWrapper|SVM(Model)?|Swish(Result(s)?|Search)?|Sync(Event|Mutex|ReaderWriter|Semaphore)\n|Thread(ed)?|tidy(Node)?|TokyoTyrant(Table|Iterator|Query)?|Transliterator|Traversable\n|UConverter|(Underflow|UnexpectedValue)Exception\n|V8Js(Exception)?|Varnish(Admin|Log|Stat)\n|Worker|Weak(Map|Ref)\n|XML(Diff\\\\(Base|DOM|File|Memory)|Reader|Writer)|XsltProcessor\n|Yaf_(Route_(Interface|Map|Regex|Rewrite|Simple|Supervar)\n |Action_Abstract|Application|Config_(Simple|Ini|Abstract)|Controller_Abstract\n |Dispatcher|Exception|Loader|Plugin_Abstract|Registry|Request_(Abstract|Simple|Http)\n |Response_Abstract|Router|Session|View_(Simple|Interface))\n|Yar_(Client(_Exception)?|Concurrent_Client|Server(_Exception)?)\n|ZipArchive|ZMQ(Context|Device|Poll|Socket)?)\n\\b',
name: 'support.class.builtin.php'
}
]
},
'class-name': {
patterns: [
{
begin: '(?i)(?=\\\\?[a-z_0-9]+\\\\)',
end: '(?i)([a-z_][a-z_0-9]*)?(?=[^a-z0-9_\\\\])',
endCaptures: {1: {name: 'support.class.php'}},
patterns: [{include: '#namespace'}]
},
{include: '#class-builtin'},
{
begin: '(?=[\\\\a-zA-Z_])',
end: '(?i)([a-z_][a-z_0-9]*)?(?=[^a-z0-9_\\\\])',
endCaptures: {1: {name: 'support.class.php'}},
patterns: [{include: '#namespace'}]
}
]
},
comments: {
patterns: [
{
begin: '/\\*\\*(?=\\s)',
beginCaptures: {0: {name: 'punctuation.definition.comment.php'}},
end: '\\*/',
endCaptures: {0: {name: 'punctuation.definition.comment.php'}},
name: 'comment.block.documentation.phpdoc.php',
patterns: [{include: '#php_doc'}]
},
{
begin: '/\\*',
captures: {0: {name: 'punctuation.definition.comment.php'}},
end: '\\*/',
name: 'comment.block.php'
},
{
begin: '(^\\s+)?(?=//)',
beginCaptures: {
1: {name: 'punctuation.whitespace.comment.leading.php'}
},
end: '(?!\\G)',
patterns: [
{
begin: '//',
beginCaptures: {0: {name: 'punctuation.definition.comment.php'}},
end: '\\n|(?=\\?>)',
name: 'comment.line.double-slash.php'
}
]
},
{
begin: '(^\\s+)?(?=#)',
beginCaptures: {
1: {name: 'punctuation.whitespace.comment.leading.php'}
},
end: '(?!\\G)',
patterns: [
{
begin: '#',
beginCaptures: {0: {name: 'punctuation.definition.comment.php'}},
end: '\\n|(?=\\?>)',
name: 'comment.line.number-sign.php'
}
]
}
]
},
constants: {
patterns: [
{
match:
'(?i)\\b(TRUE|FALSE|NULL|__(FILE|DIR|FUNCTION|CLASS|METHOD|LINE|NAMESPACE)__|ON|OFF|YES|NO|NL|BR|TAB)\\b',
name: 'constant.language.php'
},
{
captures: {1: {name: 'punctuation.separator.inheritance.php'}},
match:
'(?x)\n(\\\\)?\\b\n(DEFAULT_INCLUDE_PATH\n|EAR_(INSTALL|EXTENSION)_DIR\n|E_(ALL|COMPILE_(ERROR|WARNING)|CORE_(ERROR|WARNING)|DEPRECATED|ERROR|NOTICE\n |PARSE|RECOVERABLE_ERROR|STRICT|USER_(DEPRECATED|ERROR|NOTICE|WARNING)|WARNING)\n|PHP_(ROUND_HALF_(DOWN|EVEN|ODD|UP)|(MAJOR|MINOR|RELEASE)_VERSION|MAXPATHLEN\n |BINDIR|SHLIB_SUFFIX|SYSCONFDIR|SAPI|CONFIG_FILE_(PATH|SCAN_DIR)\n |INT_(MAX|SIZE)|ZTS|OS|OUTPUT_HANDLER_(START|CONT|END)|DEBUG|DATADIR\n |URL_(SCHEME|HOST|USER|PORT|PASS|PATH|QUERY|FRAGMENT)|PREFIX\n |EXTRA_VERSION|EXTENSION_DIR|EOL|VERSION(_ID)?\n |WINDOWS_(NT_(SERVER|DOMAIN_CONTROLLER|WORKSTATION)\n |VERSION_(MAJOR|MINOR)|BUILD|SUITEMASK|SP_(MAJOR|MINOR)\n |PRODUCTTYPE|PLATFORM)\n |LIBDIR|LOCALSTATEDIR)\n|STD(ERR|IN|OUT)|ZEND_(DEBUG_BUILD|THREAD_SAFE))\n\\b',
name: 'support.constant.core.php'
},
{
captures: {1: {name: 'punctuation.separator.inheritance.php'}},
match:
'(?x)\n(\\\\)?\\b\n(__COMPILER_HALT_OFFSET__|AB(MON_(1|2|3|4|5|6|7|8|9|10|11|12)|DAY[1-7])\n|AM_STR|ASSERT_(ACTIVE|BAIL|CALLBACK_QUIET_EVAL|WARNING)|ALT_DIGITS\n|CASE_(UPPER|LOWER)|CHAR_MAX|CONNECTION_(ABORTED|NORMAL|TIMEOUT)|CODESET|COUNT_(NORMAL|RECURSIVE)\n|CREDITS_(ALL|DOCS|FULLPAGE|GENERAL|GROUP|MODULES|QA|SAPI)\n|CRYPT_(BLOWFISH|EXT_DES|MD5|SHA(256|512)|SALT_LENGTH|STD_DES)|CURRENCY_SYMBOL\n|D_(T_)?FMT|DATE_(ATOM|COOKIE|ISO8601|RFC(822|850|1036|1123|2822|3339)|RSS|W3C)\n|DAY_[1-7]|DECIMAL_POINT|DIRECTORY_SEPARATOR\n|ENT_(COMPAT|IGNORE|(NO)?QUOTES)|EXTR_(IF_EXISTS|OVERWRITE|PREFIX_(ALL|IF_EXISTS|INVALID|SAME)|REFS|SKIP)\n|ERA(_(D_(T_)?FMT)|T_FMT|YEAR)?|FRAC_DIGITS|GROUPING|HASH_HMAC|HTML_(ENTITIES|SPECIALCHARS)\n|INF|INFO_(ALL|CREDITS|CONFIGURATION|ENVIRONMENT|GENERAL|LICENSEMODULES|VARIABLES)\n|INI_(ALL|CANNER_(NORMAL|RAW)|PERDIR|SYSTEM|USER)|INT_(CURR_SYMBOL|FRAC_DIGITS)\n|LC_(ALL|COLLATE|CTYPE|MESSAGES|MONETARY|NUMERIC|TIME)|LOCK_(EX|NB|SH|UN)\n|LOG_(ALERT|AUTH(PRIV)?|CRIT|CRON|CONS|DAEMON|DEBUG|EMERG|ERR|INFO|LOCAL[1-7]|LPR|KERN|MAIL\n |NEWS|NODELAY|NOTICE|NOWAIT|ODELAY|PID|PERROR|WARNING|SYSLOG|UCP|USER)\n|M_(1_PI|SQRT(1_2|2|3|PI)|2_(SQRT)?PI|PI(_(2|4))?|E(ULER)?|LN(10|2|PI)|LOG(10|2)E)\n|MON_(1|2|3|4|5|6|7|8|9|10|11|12|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)\n|N_(CS_PRECEDES|SEP_BY_SPACE|SIGN_POSN)|NAN|NEGATIVE_SIGN|NO(EXPR|STR)\n|P_(CS_PRECEDES|SEP_BY_SPACE|SIGN_POSN)|PM_STR|POSITIVE_SIGN\n|PATH(_SEPARATOR|INFO_(EXTENSION|(BASE|DIR|FILE)NAME))|RADIXCHAR\n|SEEK_(CUR|END|SET)|SORT_(ASC|DESC|LOCALE_STRING|REGULAR|STRING)|STR_PAD_(BOTH|LEFT|RIGHT)\n|T_FMT(_AMPM)?|THOUSEP|THOUSANDS_SEP\n|UPLOAD_ERR_(CANT_WRITE|EXTENSION|(FORM|INI)_SIZE|NO_(FILE|TMP_DIR)|OK|PARTIAL)\n|YES(EXPR|STR))\n\\b',
name: 'support.constant.std.php'
},
{
captures: {1: {name: 'punctuation.separator.inheritance.php'}},
match:
'(?x)\n(\\\\)?\\b\n(GLOB_(MARK|BRACE|NO(SORT|CHECK|ESCAPE)|ONLYDIR|ERR|AVAILABLE_FLAGS)\n|XML_(SAX_IMPL|(DTD|DOCUMENT(_(FRAG|TYPE))?|HTML_DOCUMENT|NOTATION|NAMESPACE_DECL|PI|COMMENT|DATA_SECTION|TEXT)_NODE\n |OPTION_(SKIP_(TAGSTART|WHITE)|CASE_FOLDING|TARGET_ENCODING)\n |ERROR_((BAD_CHAR|(ATTRIBUTE_EXTERNAL|BINARY|PARAM|RECURSIVE)_ENTITY)_REF|MISPLACED_XML_PI|SYNTAX|NONE\n |NO_(MEMORY|ELEMENTS)|TAG_MISMATCH|INCORRECT_ENCODING|INVALID_TOKEN|DUPLICATE_ATTRIBUTE\n |UNCLOSED_(CDATA_SECTION|TOKEN)|UNDEFINED_ENTITY|UNKNOWN_ENCODING|JUNK_AFTER_DOC_ELEMENT\n |PARTIAL_CHAR|EXTERNAL_ENTITY_HANDLING|ASYNC_ENTITY)\n |ENTITY_(((REF|DECL)_)?NODE)|ELEMENT(_DECL)?_NODE|LOCAL_NAMESPACE|ATTRIBUTE_(NMTOKEN(S)?|NOTATION|NODE)\n |CDATA|ID(REF(S)?)?|DECL_NODE|ENTITY|ENUMERATION)\n|MHASH_(RIPEMD(128|160|256|320)|GOST|MD(2|4|5)|SHA(1|224|256|384|512)|SNEFRU256|HAVAL(128|160|192|224|256)\n |CRC23(B)?|TIGER(128|160)?|WHIRLPOOL|ADLER32)\n|MYSQL_(BOTH|NUM|CLIENT_(SSL|COMPRESS|IGNORE_SPACE|INTERACTIVE|ASSOC))\n|MYSQLI_(REPORT_(STRICT|INDEX|OFF|ERROR|ALL)|REFRESH_(GRANT|MASTER|BACKUP_LOG|STATUS|SLAVE|HOSTS|THREADS|TABLES|LOG)\n |READ_DEFAULT_(FILE|GROUP)|(GROUP|MULTIPLE_KEY|BINARY|BLOB)_FLAG|BOTH\n |STMT_ATTR_(CURSOR_TYPE|UPDATE_MAX_LENGTH|PREFETCH_ROWS)|STORE_RESULT\n |SERVER_QUERY_(NO_((GOOD_)?INDEX_USED)|WAS_SLOW)|SET_(CHARSET_NAME|FLAG)\n |NO_(DEFAULT_VALUE_FLAG|DATA)|NOT_NULL_FLAG|NUM(_FLAG)?\n |CURSOR_TYPE_(READ_ONLY|SCROLLABLE|NO_CURSOR|FOR_UPDATE)\n |CLIENT_(SSL|NO_SCHEMA|COMPRESS|IGNORE_SPACE|INTERACTIVE|FOUND_ROWS)\n |TYPE_(GEOMETRY|((MEDIUM|LONG|TINY)_)?BLOB|BIT|SHORT|STRING|SET|YEAR|NULL|NEWDECIMAL|NEWDATE|CHAR\n |TIME(STAMP)?|TINY|INT24|INTERVAL|DOUBLE|DECIMAL|DATE(TIME)?|ENUM|VAR_STRING|FLOAT|LONG(LONG)?)\n |TIME_STAMP_FLAG|INIT_COMMAND|ZEROFILL_FLAG|ON_UPDATE_NOW_FLAG\n |OPT_(NET_((CMD|READ)_BUFFER_SIZE)|CONNECT_TIMEOUT|INT_AND_FLOAT_NATIVE|LOCAL_INFILE)\n |DEBUG_TRACE_ENABLED|DATA_TRUNCATED|USE_RESULT|(ENUM|(PART|PRI|UNIQUE)_KEY|UNSIGNED)_FLAG\n |ASSOC|ASYNC|AUTO_INCREMENT_FLAG)\n|MCRYPT_(RC(2|6)|RIJNDAEL_(128|192|256)|RAND|GOST|XTEA|MODE_(STREAM|NOFB|CBC|CFB|OFB|ECB)|MARS\n |BLOWFISH(_COMPAT)?|SERPENT|SKIPJACK|SAFER(64|128|PLUS)|CRYPT|CAST_(128|256)|TRIPLEDES|THREEWAY\n |TWOFISH|IDEA|(3)?DES|DECRYPT|DEV_(U)?RANDOM|PANAMA|ENCRYPT|ENIGNA|WAKE|LOKI97|ARCFOUR(_IV)?)\n|STREAM_(REPORT_ERRORS|MUST_SEEK|MKDIR_RECURSIVE|BUFFER_(NONE|FULL|LINE)|SHUT_(RD)?WR\n |SOCK_(RDM|RAW|STREAM|SEQPACKET|DGRAM)|SERVER_(BIND|LISTEN)\n |NOTIFY_(REDIRECTED|RESOLVE|MIME_TYPE_IS|SEVERITY_(INFO|ERR|WARN)|COMPLETED|CONNECT|PROGRESS\n |FILE_SIZE_IS|FAILURE|AUTH_(REQUIRED|RESULT))\n |CRYPTO_METHOD_((SSLv2(3)?|SSLv3|TLS)_(CLIENT|SERVER))|CLIENT_((ASYNC_)?CONNECT|PERSISTENT)\n |CAST_(AS_STREAM|FOR_SELECT)|(IGNORE|IS)_URL|IPPROTO_(RAW|TCP|ICMP|IP|UDP)|OOB\n |OPTION_(READ_(BUFFER|TIMEOUT)|BLOCKING|WRITE_BUFFER)|URL_STAT_(LINK|QUIET)|USE_PATH\n |PEEK|PF_(INET(6)?|UNIX)|ENFORCE_SAFE_MODE|FILTER_(ALL|READ|WRITE))\n|SUNFUNCS_RET_(DOUBLE|STRING|TIMESTAMP)\n|SQLITE_(READONLY|ROW|MISMATCH|MISUSE|BOTH|BUSY|SCHEMA|NOMEM|NOTFOUND|NOTADB|NOLFS|NUM|CORRUPT\n |CONSTRAINT|CANTOPEN|TOOBIG|INTERRUPT|INTERNAL|IOERR|OK|DONE|PROTOCOL|PERM|ERROR|EMPTY\n |FORMAT|FULL|LOCKED|ABORT|ASSOC|AUTH)\n|SQLITE3_(BOTH|BLOB|NUM|NULL|TEXT|INTEGER|OPEN_(READ(ONLY|WRITE)|CREATE)|FLOAT_ASSOC)\n|CURL(M_(BAD_((EASY)?HANDLE)|CALL_MULTI_PERFORM|INTERNAL_ERROR|OUT_OF_MEMORY|OK)\n |MSG_DONE|SSH_AUTH_(HOST|NONE|DEFAULT|PUBLICKEY|PASSWORD|KEYBOARD)\n |CLOSEPOLICY_(SLOWEST|CALLBACK|OLDEST|LEAST_(RECENTLY_USED|TRAFFIC)\n |INFO_(REDIRECT_(COUNT|TIME)|REQUEST_SIZE|SSL_VERIFYRESULT|STARTTRANSFER_TIME\n |(SIZE|SPEED)_(DOWNLOAD|UPLOAD)|HTTP_CODE|HEADER_(OUT|SIZE)|NAMELOOKUP_TIME\n |CONNECT_TIME|CONTENT_(TYPE|LENGTH_(DOWNLOAD|UPLOAD))|CERTINFO|TOTAL_TIME\n |PRIVATE|PRETRANSFER_TIME|EFFECTIVE_URL|FILETIME)\n |OPT_(RESUME_FROM|RETURNTRANSFER|REDIR_PROTOCOLS|REFERER|READ(DATA|FUNCTION)|RANGE|RANDOM_FILE\n |MAX(CONNECTS|REDIRS)|BINARYTRANSFER|BUFFERSIZE\n |SSH_(HOST_PUBLIC_KEY_MD5|(PRIVATE|PUBLIC)_KEYFILE)|AUTH_TYPES)\n |SSL(CERT(TYPE|PASSWD)?|ENGINE(_DEFAULT)?|VERSION|KEY(TYPE|PASSWD)?)\n |SSL_(CIPHER_LIST|VERIFY(HOST|PEER))\n |STDERR|HTTP(GET|HEADER|200ALIASES|_VERSION|PROXYTUNNEL|AUTH)\n |HEADER(FUNCTION)?|NO(BODY|SIGNAL|PROGRESS)|NETRC|CRLF|CONNECTTIMEOUT(_MS)?\n |COOKIE(SESSION|JAR|FILE)?|CUSTOMREQUEST|CERTINFO|CLOSEPOLICY|CA(INFO|PATH)|TRANSFERTEXT\n |TCP_NODELAY|TIME(CONDITION|OUT(_MS)?|VALUE)|INTERFACE|INFILE(SIZE)?|IPRESOLVE\n |DNS_(CACHE_TIMEOUT|USE_GLOBAL_CACHE)|URL|USER(AGENT|PWD)|UNRESTRICTED_AUTH|UPLOAD\n |PRIVATE|PROGRESSFUNCTION|PROXY(TYPE|USERPWD|PORT|AUTH)?|PROTOCOLS|PORT\n |POST(REDIR|QUOTE|FIELDS)?|PUT|EGDSOCKET|ENCODING|VERBOSE|KRB4LEVEL|KEYPASSWD|QUOTE|FRESH_CONNECT\n |FTP(APPEND|LISTONLY|PORT|SSLAUTH)\n |FTP_(SSL|SKIP_PASV_IP|CREATE_MISSING_DIRS|USE_EP(RT|SV)|FILEMETHOD)\n |FILE(TIME)?|FORBID_REUSE|FOLLOWLOCATION|FAILONERROR|WRITE(FUNCTION|HEADER)|LOW_SPEED_(LIMIT|TIME)\n |AUTOREFERER)\n |PROXY_(HTTP|SOCKS(4|5))|PROTO_(SCP|SFTP|HTTP(S)?|TELNET|TFTP|DICT|FTP(S)?|FILE|LDAP(S)?|ALL)\n |E_((RECV|READ)_ERROR|GOT_NOTHING|MALFORMAT_USER\n |BAD_(CONTENT_ENCODING|CALLING_ORDER|PASSWORD_ENTERED|FUNCTION_ARGUMENT)\n |SSH|SSL_(CIPHER|CONNECT_ERROR|CERTPROBLEM|CACERT|PEER_CERTIFICATE|ENGINE_(NOTFOUND|SETFAILED))\n |SHARE_IN_USE|SEND_ERROR|HTTP_(RANGE_ERROR|NOT_FOUND|PORT_FAILED|POST_ERROR)\n |COULDNT_(RESOLVE_(HOST|PROXY)|CONNECT)|TOO_MANY_REDIRECTS|TELNET_OPTION_SYNTAX|OBSOLETE\n |OUT_OF_MEMORY|OPERATION|TIMEOUTED|OK|URL_MALFORMAT(_USER)?|UNSUPPORTED_PROTOCOL\n |UNKNOWN_TELNET_OPTION|PARTIAL_FILE\n |FTP_(BAD_DOWNLOAD_RESUME|SSL_FAILED|COULDNT_(RETR_FILE|GET_SIZE|STOR_FILE|SET_(BINARY|ASCII)|USE_REST)\n |CANT_(GET_HOST|RECONNECT)|USER_PASSWORD_INCORRECT|PORT_FAILED|QUOTE_ERROR|WRITE_ERROR\n |WEIRD_((PASS|PASV|SERVER|USER)_REPLY|227_FORMAT)|ACCESS_DENIED)\n |FILESIZE_EXCEEDED|FILE_COULDNT_READ_FILE|FUNCTION_NOT_FOUND|FAILED_INIT|WRITE_ERROR|LIBRARY_NOT_FOUND\n |LDAP_(SEARCH_FAILED|CANNOT_BIND|INVALID_URL)|ABORTED_BY_CALLBACK)\n |VERSION_NOW\n |FTP(METHOD_(MULTI|SINGLE|NO)CWD|SSL_(ALL|NONE|CONTROL|TRY)|AUTH_(DEFAULT|SSL|TLS))\n |AUTH_(ANY(SAFE)?|BASIC|DIGEST|GSSNEGOTIATE|NTLM))\n|CURL_(HTTP_VERSION_(1_(0|1)|NONE)|NETRC_(REQUIRED|IGNORED|OPTIONAL)|TIMECOND_(IF(UN)?MODSINCE|LASTMOD)\n |IPRESOLVE_(V(4|6)|WHATEVER)|VERSION_(SSL|IPV6|KERBEROS4|LIBZ))\n|IMAGETYPE_(GIF|XBM|BMP|SWF|COUNT|TIFF_(MM|II)|ICO|IFF|UNKNOWN|JB2|JPX|JP2|JPC|JPEG(2000)?|PSD|PNG|WBMP)\n|INPUT_(REQUEST|GET|SERVER|SESSION|COOKIE|POST|ENV)|ICONV_(MIME_DECODE_(STRICT|CONTINUE_ON_ERROR)|IMPL|VERSION)\n|DNS_(MX|SRV|SOA|HINFO|NS|NAPTR|CNAME|TXT|PTR|ANY|ALL|AAAA|A(6)?)\n|DOM(STRING_SIZE_ERR)\n|DOM_((SYNTAX|HIERARCHY_REQUEST|NO_(MODIFICATION_ALLOWED|DATA_ALLOWED)|NOT_(FOUND|SUPPORTED)|NAMESPACE\n |INDEX_SIZE|USE_ATTRIBUTE|VALID_(MODIFICATION|STATE|CHARACTER|ACCESS)|PHP|VALIDATION|WRONG_DOCUMENT)_ERR)\n|JSON_(HEX_(TAG|QUOT|AMP|APOS)|NUMERIC_CHECK|ERROR_(SYNTAX|STATE_MISMATCH|NONE|CTRL_CHAR|DEPTH|UTF8)|FORCE_OBJECT)\n|PREG_((D_UTF8(_OFFSET)?|NO|INTERNAL|(BACKTRACK|RECURSION)_LIMIT)_ERROR|GREP_INVERT\n |SPLIT_(NO_EMPTY|(DELIM|OFFSET)_CAPTURE)|SET_ORDER|OFFSET_CAPTURE|PATTERN_ORDER)\n|PSFS_(PASS_ON|ERR_FATAL|FEED_ME|FLAG_(NORMAL|FLUSH_(CLOSE|INC)))\n|PCRE_VERSION|POSIX_((F|R|W|X)_OK|S_IF(REG|BLK|SOCK|CHR|IFO))\n|FNM_(NOESCAPE|CASEFOLD|PERIOD|PATHNAME)\n|FILTER_(REQUIRE_(SCALAR|ARRAY)|NULL_ON_FAILURE|CALLBACK|DEFAULT|UNSAFE_RAW\n |SANITIZE_(MAGIC_QUOTES|STRING|STRIPPED|SPECIAL_CHARS|NUMBER_(INT|FLOAT)|URL\n |EMAIL|ENCODED|FULL_SPCIAL_CHARS)\n |VALIDATE_(REGEXP|BOOLEAN|INT|IP|URL|EMAIL|FLOAT)\n |FORCE_ARRAY\n |FLAG_(SCHEME_REQUIRED|STRIP_(BACKTICK|HIGH|LOW)|HOST_REQUIRED|NONE|NO_(RES|PRIV)_RANGE|ENCODE_QUOTES\n |IPV(4|6)|PATH_REQUIRED|EMPTY_STRING_NULL|ENCODE_(HIGH|LOW|AMP)|QUERY_REQUIRED\n |ALLOW_(SCIENTIFIC|HEX|THOUSAND|OCTAL|FRACTION)))\n|FILE_(BINARY|SKIP_EMPTY_LINES|NO_DEFAULT_CONTEXT|TEXT|IGNORE_NEW_LINES|USE_INCLUDE_PATH|APPEND)\n|FILEINFO_(RAW|MIME(_(ENCODING|TYPE))?|SYMLINK|NONE|CONTINUE|DEVICES|PRESERVE_ATIME)\n|FORCE_(DEFLATE|GZIP)\n|LIBXML_(XINCLUDE|NSCLEAN|NO(XMLDECL|BLANKS|NET|CDATA|ERROR|EMPTYTAG|ENT|WARNING)\n |COMPACT|DTD(VALID|LOAD|ATTR)|((DOTTED|LOADED)_)?VERSION|PARSEHUGE|ERR_(NONE|ERROR|FATAL|WARNING)))\n\\b',
name: 'support.constant.ext.php'
},
{
captures: {1: {name: 'punctuation.separator.inheritance.php'}},
match:
'(?x)\n(\\\\)?\\b\n(T_(RETURN|REQUIRE(_ONCE)?|GOTO|GLOBAL|(MINUS|MOD|MUL|XOR)_EQUAL|METHOD_C|ML_COMMENT|BREAK\n |BOOL_CAST|BOOLEAN_(AND|OR)|BAD_CHARACTER|SR(_EQUAL)?|STRING(_CAST|VARNAME)?|START_HEREDOC|STATIC\n |SWITCH|SL(_EQUAL)?|HALT_COMPILER|NS_(C|SEPARATOR)|NUM_STRING|NEW|NAMESPACE|CHARACTER|COMMENT\n |CONSTANT(_ENCAPSED_STRING)?|CONCAT_EQUAL|CONTINUE|CURLY_OPEN|CLOSE_TAG|CLONE|CLASS(_C)?\n |CASE|CATCH|TRY|THROW|IMPLEMENTS|ISSET|IS_((GREATER|SMALLER)_OR_EQUAL|(NOT_)?(IDENTICAL|EQUAL))\n |INSTANCEOF|INCLUDE(_ONCE)?|INC|INT_CAST|INTERFACE|INLINE_HTML|IF|OR_EQUAL|OBJECT_(CAST|OPERATOR)\n |OPEN_TAG(_WITH_ECHO)?|OLD_FUNCTION|DNUMBER|DIR|DIV_EQUAL|DOC_COMMENT|DOUBLE_(ARROW|CAST|COLON)\n |DOLLAR_OPEN_CURLY_BRACES|DO|DEC|DECLARE|DEFAULT|USE|UNSET(_CAST)?|PRINT|PRIVATE|PROTECTED|PUBLIC\n |PLUS_EQUAL|PAAMAYIM_NEKUDOTAYIM|EXTENDS|EXIT|EMPTY|ENCAPSED_AND_WHITESPACE\n |END(SWITCH|IF|DECLARE|FOR(EACH)?|WHILE)|END_HEREDOC|ECHO|EVAL|ELSE(IF)?|VAR(IABLE)?|FINAL|FILE\n |FOR(EACH)?|FUNC_C|FUNCTION|WHITESPACE|WHILE|LNUMBER|LIST|LINE|LOGICAL_(AND|OR|XOR)\n |ARRAY_(CAST)?|ABSTRACT|AS|AND_EQUAL))\n\\b',
name: 'support.constant.parser-token.php'
},
{
match: '(?i)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*',
name: 'constant.other.php'
}
]
},
'function-call': {
patterns: [
{
begin:
'(?xi)\n(\n \\\\?\\b # Optional root namespace\n [a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]* # First namespace\n (?:\\\\[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*)+ # Additional namespaces\n)\\s*(\\()',
beginCaptures: {
1: {
patterns: [
{include: '#namespace'},
{
match: '(?i)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*',
name: 'entity.name.function.php'
}
]
},
2: {
name: 'punctuation.definition.arguments.begin.bracket.round.php'
}
},
end: '\\)|(?=\\?>)',
endCaptures: {
0: {name: 'punctuation.definition.arguments.end.bracket.round.php'}
},
name: 'meta.function-call.php',
patterns: [{include: '#language'}]
},
{
begin:
'(?i)(\\\\)?\\b([a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*)\\s*(\\()',
beginCaptures: {
1: {patterns: [{include: '#namespace'}]},
2: {
patterns: [
{include: '#support'},
{
match: '(?i)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*',
name: 'entity.name.function.php'
}
]
},
3: {
name: 'punctuation.definition.arguments.begin.bracket.round.php'
}
},
end: '\\)|(?=\\?>)',
endCaptures: {
0: {name: 'punctuation.definition.arguments.end.bracket.round.php'}
},
name: 'meta.function-call.php',
patterns: [{include: '#language'}]
},
{
match: '(?i)\\b(print|echo)\\b',
name: 'support.function.construct.output.php'
}
]
},
'function-parameters': {
patterns: [
{include: '#comments'},
{match: ',', name: 'punctuation.separator.delimiter.php'},
{
begin:
'(?xi)\n(array) # Typehint\n\\s+((&)?\\s*(\\$+)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*) # Variable name with possible reference\n\\s*(=)\\s*(array)\\s*(\\() # Default value',
beginCaptures: {
1: {name: 'storage.type.php'},
2: {name: 'variable.other.php'},
3: {name: 'storage.modifier.reference.php'},
4: {name: 'punctuation.definition.variable.php'},
5: {name: 'keyword.operator.assignment.php'},
6: {name: 'support.function.construct.php'},
7: {name: 'punctuation.definition.array.begin.bracket.round.php'}
},
contentName: 'meta.array.php',
end: '\\)',
endCaptures: {
0: {name: 'punctuation.definition.array.end.bracket.round.php'}
},
name: 'meta.function.parameter.array.php',
patterns: [
{include: '#comments'},
{include: '#strings'},
{include: '#numbers'}
]
},
{
captures: {
1: {name: 'storage.type.php'},
10: {name: 'invalid.illegal.non-null-typehinted.php'},
2: {name: 'variable.other.php'},
3: {name: 'storage.modifier.reference.php'},
4: {name: 'punctuation.definition.variable.php'},
5: {name: 'keyword.operator.assignment.php'},
6: {name: 'constant.language.php'},
7: {name: 'punctuation.section.array.begin.php'},
8: {patterns: [{include: '#parameter-default-types'}]},
9: {name: 'punctuation.section.array.end.php'}
},
match:
'(?xi)\n(array|callable) # Typehint\n\\s+((&)?\\s*(\\$+)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*) # Variable name with possible reference\n(?: # Optional default value\n \\s*(=)\\s*\n (?:\n (null)\n |\n (\\[)((?>[^\\[\\]]+|\\[\\g<8>\\])*)(\\])\n |((?:\\S*?\\(\\))|(?:\\S*?))\n )\n)?\n\\s*(?=,|\\)|/[/*]|\\#|$) # A closing parentheses (end of argument list) or a comma or a comment',
name: 'meta.function.parameter.array.php'
},
{
begin:
'(?xi)\n(\\\\?(?:[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*\\\\)*) # Optional namespace\n([a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*) # Typehinted class name\n\\s+((&)?\\s*(\\.\\.\\.)?(\\$+)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*) # Variable name with possible reference',
beginCaptures: {
1: {
name: 'support.other.namespace.php',
patterns: [
{
match: '(?i)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*',
name: 'storage.type.php'
},
{match: '\\\\', name: 'punctuation.separator.inheritance.php'}
]
},
2: {name: 'storage.type.php'},
3: {name: 'variable.other.php'},
4: {name: 'storage.modifier.reference.php'},
5: {name: 'keyword.operator.variadic.php'},
6: {name: 'punctuation.definition.variable.php'}
},
end: '(?=,|\\)|/[/*]|\\#)',
name: 'meta.function.parameter.typehinted.php',
patterns: [
{
begin: '=',
beginCaptures: {0: {name: 'keyword.operator.assignment.php'}},
end: '(?=,|\\)|/[/*]|\\#)',
patterns: [{include: '#language'}]
}
]
},
{
captures: {
1: {name: 'variable.other.php'},
2: {name: 'storage.modifier.reference.php'},
3: {name: 'keyword.operator.variadic.php'},
4: {name: 'punctuation.definition.variable.php'}
},
match:
'(?xi)\n((&)?\\s*(\\.\\.\\.)?(\\$+)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*) # Variable name with possible reference\n\\s*(?=,|\\)|/[/*]|\\#|$) # A closing parentheses (end of argument list) or a comma or a comment',
name: 'meta.function.parameter.no-default.php'
},
{
begin:
'(?xi)\n((&)?\\s*(\\.\\.\\.)?(\\$+)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*) # Variable name with possible reference\n\\s*(=)\\s*\n(?:(\\[)((?>[^\\[\\]]+|\\[\\g<6>\\])*)(\\]))? # Optional default type',
beginCaptures: {
1: {name: 'variable.other.php'},
2: {name: 'storage.modifier.reference.php'},
3: {name: 'keyword.operator.variadic.php'},
4: {name: 'punctuation.definition.variable.php'},
5: {name: 'keyword.operator.assignment.php'},
6: {name: 'punctuation.section.array.begin.php'},
7: {patterns: [{include: '#parameter-default-types'}]},
8: {name: 'punctuation.section.array.end.php'}
},
end: '(?=,|\\)|/[/*]|\\#)',
name: 'meta.function.parameter.default.php',
patterns: [{include: '#parameter-default-types'}]
}
]
},
heredoc: {
patterns: [
{
begin:
'(?i)(?=<<<\\s*("?)([a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*)(\\1)\\s*$)',
end: '(?!\\G)',
name: 'string.unquoted.heredoc.php',
patterns: [{include: '#heredoc_interior'}]
},
{
begin: "(?=<<<\\s*'([a-zA-Z_]+[a-zA-Z0-9_]*)'\\s*$)",
end: '(?!\\G)',
name: 'string.unquoted.nowdoc.php',
patterns: [{include: '#nowdoc_interior'}]
}
]
},
heredoc_interior: {
patterns: [
{
begin: '(<<<)\\s*("?)(HTML)(\\2)(\\s*)$',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'},
1: {name: 'punctuation.definition.string.php'},
3: {name: 'keyword.operator.heredoc.php'},
5: {name: 'invalid.illegal.trailing-whitespace.php'}
},
contentName: 'text.html',
end: '^(\\3)\\b',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'keyword.operator.heredoc.php'}
},
name: 'meta.embedded.html',
patterns: [{include: '#interpolation'}, {include: 'text.html.basic'}]
},
{
begin: '(<<<)\\s*("?)(XML)(\\2)(\\s*)$',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'},
1: {name: 'punctuation.definition.string.php'},
3: {name: 'keyword.operator.heredoc.php'},
5: {name: 'invalid.illegal.trailing-whitespace.php'}
},
contentName: 'text.xml',
end: '^(\\3)\\b',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'keyword.operator.heredoc.php'}
},
name: 'meta.embedded.xml',
patterns: [{include: '#interpolation'}, {include: 'text.xml'}]
},
{
begin: '(<<<)\\s*("?)(SQL)(\\2)(\\s*)$',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'},
1: {name: 'punctuation.definition.string.php'},
3: {name: 'keyword.operator.heredoc.php'},
5: {name: 'invalid.illegal.trailing-whitespace.php'}
},
contentName: 'source.sql',
end: '^(\\3)\\b',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'keyword.operator.heredoc.php'}
},
name: 'meta.embedded.sql',
patterns: [{include: '#interpolation'}, {include: 'source.sql'}]
},
{
begin: '(<<<)\\s*("?)(JAVASCRIPT|JS)(\\2)(\\s*)$',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'},
1: {name: 'punctuation.definition.string.php'},
3: {name: 'keyword.operator.heredoc.php'},
5: {name: 'invalid.illegal.trailing-whitespace.php'}
},
contentName: 'source.js',
end: '^(\\3)\\b',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'keyword.operator.heredoc.php'}
},
name: 'meta.embedded.js',
patterns: [{include: '#interpolation'}, {include: 'source.js'}]
},
{
begin: '(<<<)\\s*("?)(JSON)(\\2)(\\s*)$',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'},
1: {name: 'punctuation.definition.string.php'},
3: {name: 'keyword.operator.heredoc.php'},
5: {name: 'invalid.illegal.trailing-whitespace.php'}
},
contentName: 'source.json',
end: '^(\\3)\\b',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'keyword.operator.heredoc.php'}
},
name: 'meta.embedded.json',
patterns: [{include: '#interpolation'}, {include: 'source.json'}]
},
{
begin: '(<<<)\\s*("?)(CSS)(\\2)(\\s*)$',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'},
1: {name: 'punctuation.definition.string.php'},
3: {name: 'keyword.operator.heredoc.php'},
5: {name: 'invalid.illegal.trailing-whitespace.php'}
},
contentName: 'source.css',
end: '^(\\3)\\b',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'keyword.operator.heredoc.php'}
},
name: 'meta.embedded.css',
patterns: [{include: '#interpolation'}, {include: 'source.css'}]
},
{
begin: '(<<<)\\s*("?)(REGEXP?)(\\2)(\\s*)$',
beginCaptures: {
0: {name: 'punctuation.section.embedded.begin.php'},
1: {name: 'punctuation.definition.string.php'},
3: {name: 'keyword.operator.heredoc.php'},
5: {name: 'invalid.illegal.trailing-whitespace.php'}
},
contentName: 'string.regexp.heredoc.php',
end: '^(\\3)\\b',
endCaptures: {
0: {name: 'punctuation.section.embedded.end.php'},
1: {name: 'keyword.operator.heredoc.php'}
},
patterns: [
{include: '#interpolation'},
{
match: '(\\\\){1,2}[.$^\\[\\]{}]',
name: 'constant.character.escape.regex.php'
},
{
captures: {
1: {name: 'punctuation.definition.arbitrary-repitition.php'},
3: {name: 'punctuation.definition.arbitrary-repitition.php'}
},
match: '({)\\d+(,\\d+)?(})',
name: 'string.regexp.arbitrary-repitition.php'
},
{
begin: '\\[(?:\\^?\\])?',
captures: {
0: {name: 'punctuation.definition.character-class.php'}
},
end: '\\]',
name: 'string.regexp.character-class.php',
patterns: [
{
match: "\\\\[\\\\'\\[\\]]",
name: 'constant.character.escape.php'
}
]
},
{match: '[$^+*]', name: 'keyword.operator.regexp.php'},
{
begin:
'(?i)(?<=^|\\s)(#)\\s(?=[[a-z0-9_\\x{7f}-\\x{ff},. \\t?!-][^\\x{00}-\\x{7f}]]*$)',
beginCaptures: {1: {name: 'punctuation.definition.comment.php'}},
end: '$',
endCaptures: {0: {name: 'punctuation.definition.comment.php'}},
name: 'comment.line.number-sign.php'
}
]
},
{
begin:
'(?i)(<<<)\\s*("?)([a-z_\\x{7f}-\\x{ff}]+[a-z0-9_\\x{7f}-\\x{ff}]*)(\\2)(\\s*)',
beginCaptures: {
1: {name: 'punctuation.definition.string.php'},
3: {name: 'keyword.operator.heredoc.php'},
5: {name: 'invalid.illegal.trailing-whitespace.php'}
},
end: '^(\\3)\\b',
endCaptures: {1: {name: 'keyword.operator.heredoc.php'}},
patterns: [{include: '#interpolation'}]
}
]
},
instantiation: {
begin: '(?i)(new)\\s+',
beginCaptures: {1: {name: 'keyword.other.new.php'}},
end: '(?i)(?=[^a-z0-9_\\x{7f}-\\x{ff}\\\\])',
patterns: [
{
match: '(?i)(parent|static|self)(?![a-z0-9_\\x{7f}-\\x{ff}])',
name: 'storage.type.php'
},
{include: '#class-name'},
{include: '#variable-name'}
]
},
interpolation: {
patterns: [
{match: '\\\\[0-7]{1,3}', name: 'constant.character.escape.octal.php'},
{
match: '\\\\x[0-9A-Fa-f]{1,2}',
name: 'constant.character.escape.hex.php'
},
{
match: '\\\\u{[0-9A-Fa-f]+}',
name: 'constant.character.escape.unicode.php'
},
{match: '\\\\[nrtvef$"\\\\]', name: 'constant.character.escape.php'},
{
begin: '{(?=\\$.*?})',
beginCaptures: {0: {name: 'punctuation.definition.variable.php'}},
end: '}',
endCaptures: {0: {name: 'punctuation.definition.variable.php'}},
patterns: [{include: '#language'}]
},
{include: '#variable-name'}
]
},
'invoke-call': {
captures: {
1: {name: 'punctuation.definition.variable.php'},
2: {name: 'variable.other.php'}
},
match:
'(?i)(\\$+)([a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*)(?=\\s*\\()',
name: 'meta.function-call.invoke.php'
},
language: {
patterns: [
{include: '#comments'},
{
begin:
'(?i)^\\s*(interface)\\s+([a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*)\\s*(extends)?\\s*',
beginCaptures: {
1: {name: 'storage.type.interface.php'},
2: {name: 'entity.name.type.interface.php'},
3: {name: 'storage.modifier.extends.php'}
},
end: '(?i)((?:[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*\\s*,\\s*)*)([a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*)?\\s*(?:(?={)|$)',
endCaptures: {
1: {
patterns: [
{
match: '(?i)[a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*',
name: 'entity.other.inherited-class.php'
},
{match: ',', name: 'punctuation.separator.classes.php'}
]
},
2: {name: 'entity.other.inherited-class.php'}
},
name: 'meta.interface.php',
patterns: [{include: '#namespace'}]
},
{
begin:
'(?i)^\\s*(trait)\\s+([a-z_\\x{7f}-\\x{ff}][a-z0-9_\\x{7f}-\\x{ff}]*)',
beginCaptures: {
1: