[{"id":1123060,"link":"/plugin/30982-rescript-ide/versions/stable/1123060","version":"0.7.1","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1785601496000","file":"30982/1123060/intellij-rescript-0.7.1.zip","notes":"<h3>Parser</h3>\n\n<ul><li><strong>Applied and container attribute values now parse.</strong> <code>&lt;Modal   onCancel=Action(onClose)&gt;</code>, <code>&lt;A b=f(x) /&gt;</code>, <code>&lt;A b=#tag(x) /&gt;</code>, <code>&lt;A b=[1, 2] /&gt;</code>\n  and <code>&lt;A b=(a, b) /&gt;</code> are all valid ReScript, and none of them worked: <code>(</code>, <code>)</code>,\n  <code>[</code> and <code>]</code> had no rules inside a tag, so they became <code>BAD_CHARACTER</code>. The\n  applied forms errored at the <code>(</code>; the bracket and paren forms produced no error\n  at all and silently dropped the attribute's value. An unbraced attribute value\n  is a ReScript <em>primary</em> expression, and the grammar now says so.</li><li>A malformed attribute value now reports <strong>at the value</strong>. Previously the whole\n  <code>= value</code> group rolled back, the attribute silently became punned, and the rest\n  of the tag turned into soup with no error anywhere.</li><li>Known gaps, all deliberate: <code>b=list{1, 2}</code> and <code>b=dict{…}</code> (a braced suffix on\n  a path is indistinguishable from the commoner <code>&lt;A b=x {...p} /&gt;</code> without\n  whitespace sensitivity), <code>b=&lt;C /&gt;</code> (a bare element as an unbraced value), and\n  <code>b=f`x`</code> (tagged template). The grammar is also whitespace-insensitive, so\n  it accepts <code>b=f</code> ⏎ <code>(x)</code>, which the compiler rejects.</li></ul>\n\n<h3>Lexer</h3>\n\n<ul><li><strong>Nested JSX regions are no longer capped.</strong> The lexer's context-frame stack\n  lived entirely in the 32-bit restart state, three frames deep, and pushing a\n  fourth silently dropped the outermost one — so ordinary markup like\n  <code>&lt;ul&gt; {&lt;li&gt; &lt;span className={</code>x ${y}<code>} /&gt; &lt;/li&gt;} &lt;/ul&gt;</code> lost its outer element\n  and reported the error at the closing tag, far from the cause. The stack is\n  now an ordinary unbounded array; the restart int keeps a truncated copy as a\n  hint, which is safe because the platform only ever restarts where the state is\n  the initial one, and any live frame makes it non-zero.</li><li>The same cap applied to <strong>consecutively nested unbraced elements</strong>, which\n  shared one frame with a 3-bit count. Nine levels — reached by real ReScript —\n  popped a live frame and unravelled the outermost element. Also lifted.</li><li><strong>Block comments nested more than three deep</strong> (<code>/* a /* b /* c /* d */ */ */   */</code>) closed one <code>*/</code> early and leaked the last one into the token stream as\n  <code>*</code> <code>/</code>. The depth counter saturated at the width of its restart-state field;\n  it is now a plain counter, clamped only on the way into that field.</li><li>A stray closing tag inside a <code>{child}</code> brace no longer decrements the\n  <strong>enclosing</strong> region's element count, which could pop a frame that was still\n  live. The closing-tag rule now carries the same brace-depth guard as its\n  opening-tag twin.</li><li><strong>JSX in statement position</strong> now parses. An element returned by a block after\n  another statement — the ordinary <code>@react.component let make</code> shape, where the\n  element follows a <code>let</code> ending in <code>}</code> — was lexed as the comparison operator,\n  because a <code>&lt;</code> after any value-producing token was unconditionally an operator.\n  A <code>&lt;</code> glued to a name now starts a tag once a line break separates it from the\n  previous token, matching how the ReScript compiler disambiguates. Same-line\n  <code>a&lt;b</code> and <code>a &lt; b</code> stay comparisons, a lone CR is not a break, a break hidden\n  inside a block comment still counts, and a leading <code>/</code> still never starts a\n  regex after a value.</li><li>A <strong>completed regex literal now counts as an expression end</strong>, like any other\n  literal: <code>/a/&lt;b</code> compares and <code>/a/ / 2</code> divides, where the <code>&lt;</code> previously\n  opened a JSX tag. Pre-existing, found while reviewing the above.</li><li><strong>Comments inside JSX now parse.</strong> A <code>//</code> line comment inside an opening tag —\n  the ordinary way to document the attribute below it — lexed as two\n  <code>BAD_CHARACTER</code>s, and the prose after it was read as attributes. Block\n  comments were worse: they could not be entered from any JSX state at all, and\n  their closing <code>*/</code> always returned to expression context. Comments are now\n  legal wherever the compiler allows them: opening tags, closing tags, and\n  between children. The parser needed no change — both comment types are already\n  in <code>getCommentTokens()</code>, so the builder skips them everywhere.</li><li>A <strong>newline inside a closing tag</strong> (<code>&lt;/A</code> ⏎ <code>&gt;</code>) is legal and did not parse:\n  the mid-edit bail there fired on any newline, not just a declaration-shaped\n  one, so the <code>&gt;</code> was left to lex as a comparison. Guarded the same way the\n  opening tag's bail already was. Found while adding comment support; it\n  predates it.</li><li>Known limitation: a <strong>type application wrapped so that <code>&lt;</code> opens a line</strong>\n  (<code>let xs: array</code> ⏎ <code>&lt;int&gt;</code>, and the same shape in return-type annotations and\n  module bodies) is now read as JSX. The two are the same token sequence and\n  only a parser knows which is which; <code>rescript format</code> collapses the shape, and\n  the error stays inside that one declaration.</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":200166,"downloads":53,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1120904,"link":"/plugin/30982-rescript-ide/versions/stable/1120904","version":"0.7.0","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1785444549000","file":"30982/1120904/intellij-rescript-0.7.0.zip","notes":"<h3>Parser</h3>\n\n<ul><li><strong>JSX elements and fragments</strong> are now parsed into real PSI nodes instead of being\n  swallowed as anonymous token soup. Covers self-closing (<code>&lt;Icon name=\"disk\" /&gt;</code>) and\n  paired (<code>&lt;div&gt;…&lt;/div&gt;</code>) elements, fragments (<code>&lt;&gt;…&lt;/&gt;</code>), dotted component paths\n  (<code>&lt;Mod.Component /&gt;</code>, <code>&lt;Mod.sub /&gt;</code>), punned and optional attributes (<code>label</code>,\n  <code>?icon</code>, <code>label=?x</code>), spread attributes (<code>{...props}</code>), and children — nested\n  elements, braced expressions, bare paths, polymorphic variants (<code>#tag</code>) and\n  extensions (<code>%raw(…)</code>).</li><li><strong>Hyphenated names</strong> — web components (<code>&lt;model-viewer /&gt;</code>) and hyphenated props\n  (<code>data-testid=\"x\"</code>) — parse as single names. The ReScript manual says prop names\n  can't contain hyphens; the compiler accepts them, and the plugin follows the\n  compiler.</li><li>Known limitation: <strong>mismatched closing tags</strong> (<code>&lt;div&gt;&lt;/span&gt;</code>) still parse clean.\n  A BNF grammar can't compare names — catching this needs a semantic inspection.</li></ul>\n\n<h3>Editor features</h3>\n\n<ul><li><strong>JSX syntax coloring</strong>: component names, intrinsic tag names, attribute names, and\n  the <code>&lt;</code> <code>&lt;/</code> <code>/&gt;</code> <code>&gt;</code> delimiters each get their own color, distinguishing a tag name\n  from a plain identifier.</li><li><strong>Code folding</strong> for multi-line JSX elements and fragments, collapsing to <code>&lt;Tag ...&gt;</code>\n  and <code>&lt;&gt; ...</code>. Single-line elements aren't offered a fold.</li></ul>\n\n<h3>Lexer</h3>\n\n<ul><li>An <strong>unclosed tag</strong> mid-edit no longer eats the rest of the file. <code>&lt;div</code> followed by\n  a declaration-shaped line (<code>let x = …</code>, <code>module M = …</code>, <code>@decorator</code>, …) now bails\n  out of the tag state instead of lexing every following declaration as attribute\n  soup. The discriminator is the shape <em>after</em> the keyword, so legal attribute names\n  like <code>type=\"text\"</code> are unaffected.</li><li>Numeric and polymorphic-variant attribute values (<code>count=3</code>, <code>size=#large</code>) now lex\n  correctly inside tags.</li></ul>\n\n<h3>Navigation</h3>\n\n<ul><li><strong>Find Usages</strong> now targets the symbol under the caret rather than the enclosing\n  declaration.</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":195449,"downloads":16,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1059788,"link":"/plugin/30982-rescript-ide/versions/stable/1059788","version":"0.6.1","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1780009218000","file":"30982/1059788/intellij-rescript-0.6.1.zip","notes":"<h3>Parser</h3>\n\n<ul><li><strong>Mutually-recursive declarations</strong> chained with <code>and</code> now parse correctly: <code>type … and …</code>, <code>let rec … and …</code>, and decorated continuations (<code>@deprecated and legacyProgram = …</code>). Previously a decorated continuation was a hard parse error, and a bare continuation parsed but was absorbed into the preceding declaration instead of getting its own PSI node — so structure view, breadcrumbs, and navigation didn't list each member as a sibling.</li></ul>\n\n<h3>Lexer</h3>\n\n<ul><li><strong>JSX elements used as attribute values</strong> — <code>&lt;Outer prop={&lt;Inner attr=\"literal\" /&gt;} /&gt;</code>, including nested forms — no longer turn the whole file red. The inner <code>/&gt;</code> was lexed as the start of a regex literal, which then swallowed the surrounding <code>/&gt;</code> and <code>}</code> and left braces unbalanced. The lexer now treats <code>}</code>, a string end, a template end, a bigint, and <code>true</code>/<code>false</code> as expression-ends, so a following <code>/</code> is division (or JSX close) rather than a regex start.</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":168457,"downloads":76,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1055892,"link":"/plugin/30982-rescript-ide/versions/stable/1055892","version":"0.6.0","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1779618697000","file":"30982/1055892/intellij-rescript-0.6.0.zip","notes":"<h3>Parser</h3>\n\n<ul><li><strong>First-class modules</strong> are now parsed: value-level <code>module(M)</code> and <code>module(M : T)</code> (including <code>let f = (m: module(T)) =&gt; ...</code> parameter shape and <code>let module M = unpack(...)</code> rebinding), plus type-level <code>type t = module(T)</code> and <code>module(T with type a = ...)</code> constraint forms. Previously these triggered parse errors at the <code>module</code> keyword inside expressions.</li><li><strong>Standalone attributes</strong> at module scope — <code>@@warning(\"-26\")</code>, <code>@@toplevel</code>, etc. — are now recognized as their own structure items rather than producing errors. Works at file scope and inside <code>module</code>/<code>module type</code> bodies.</li><li><strong>Type-body parsing</strong> no longer leaks past the closing <code>}</code> into the following decorated declaration. Cases like <code>type t = { ... }</code> immediately followed by <code>@deriving let make = ...</code> were previously consuming the decorator into the type body. Also adds support for <code>type t = private { ... }</code>.</li></ul>\n\n<h3>Lexer</h3>\n\n<ul><li><strong>Nested template interpolation</strong> (<code>`outer ${`inner ${x}`}`</code>) now lexes correctly — lifting the limitation documented in v0.5.0. The lexer's brace-depth tracking can now follow multiple active interpolations on a packed state stack.</li><li><strong>Escaped backticks inside backtick strings</strong> (<code>`a \\` b`</code>) are no longer mis-terminated.</li><li><strong>Multi-line double-quoted strings</strong> (<code>\"foo\\nbar\"</code> with a literal newline) are now accepted, matching actual ReScript behavior.</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":163319,"downloads":49,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1055504,"link":"/plugin/30982-rescript-ide/versions/stable/1055504","version":"0.5.1","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1779544651000","file":"30982/1055504/intellij-rescript-0.5.1.zip","notes":"<h3>Parser</h3>\n\n<ul><li><strong>Module type declarations</strong> are now parsed: <code>module type Counter = { ... }</code> (signature body), <code>module type Serializable = Contract.Serializable</code> (alias), and the abstract form <code>module type Counter</code> (no body, common in <code>.resi</code> files). Previously these triggered parse errors at the <code>module type</code> keyword.</li><li><strong>Variant constructor attributes</strong> — <code>| @as(\"json\") Json</code>, <code>@unboxed type t = | A | @as(\"x\") B</code>, etc. — no longer error. <code>@</code> is now permitted inside type bodies without leaking into general expression syntax.</li><li><strong>Record field attributes</strong> — <code>@as(\"type\") kind: string</code> and <code>@as(\"display_name\") displayName: string</code> inside record type bodies — now parse correctly. The decorator pin was committing too eagerly, which broke fields that lead with <code>@as(...)</code>.</li></ul>\n\n<h3>Navigation</h3>\n\n<ul><li><strong>Breadcrumbs</strong> now include <code>module type Foo</code>, on par with <code>module</code>, <code>let</code>, and <code>type</code>. Nested signature contents (<code>module type Counter &gt; type t</code>) show up correctly.</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":157113,"downloads":40,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1019590,"link":"/plugin/30982-rescript-ide/versions/stable/1019590","version":"0.5.0","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1776115581000","file":"30982/1019590/intellij-rescript-0.5.0.zip","notes":"<h3>Parser</h3>\n\n<ul><li><strong>Template string interpolation</strong> (<code>`Hello ${name}`</code>) is now parsed. Interpolated expressions inside backtick strings become their own <code>TemplateInterpolation</code> PSI nodes alongside the surrounding template content, and no longer produce parse errors.</li><li>Known limitation: <strong>nested template literals inside interpolations</strong> — e.g. <code>`outer ${`inner ${x}`}`</code> — are not yet handled. This is valid ReScript but rare in practice; the lexer's brace-depth counter can't yet track multiple active interpolations at once.</li><li>Language injection is no longer offered on interpolated template literals — splitting the injected text across <code>${...}</code> holes would never produce valid output. Plain (non-interpolated) backtick strings remain injectable.</li></ul>\n\n<h3>LSP</h3>\n\n<ul><li><strong>Node path setting</strong>: the ReScript settings page now has a Node path field alongside the language server path. Both are required to launch the LSP server properly. An <code>Auto-detect</code> button probes <code>PATH</code> and common install locations (including every <code>~/.nvm/versions/node/*/bin</code>). Existing users upgrading from v0.4.x will need to set it.</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":151493,"downloads":75,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1016767,"link":"/plugin/30982-rescript-ide/versions/stable/1016767","version":"0.4.2","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1775896003000","file":"30982/1016767/intellij-rescript-0.4.2.zip","notes":"<h3>LSP</h3>\n\n<ul><li><strong>ReScript settings page</strong> (<code>Languages &amp; Frameworks &gt; ReScript</code>): configure an explicit absolute path to <code>rescript-language-server</code>. Replaces the previous implicit <code>PATH</code> lookup, which silently failed for GUI-launched IDEs that don't inherit the shell environment.</li><li><strong>Auto-detect</strong> button probes common install locations (<code>/usr/local/bin</code>, <code>/opt/homebrew/bin</code>, <code>/usr/bin</code>, and every <code>~/.nvm/versions/node/*/bin</code>) in addition to <code>PATH</code>, and fills the field with the first match.</li><li>\"Server not found\" notification now shows the configured path (if any), explains that an absolute path is required, and includes an <strong>Open ReScript Settings</strong> action to jump straight to the settings page.</li><li>Saving the settings restarts the language server in all open projects, so path changes take effect without an IDE restart.</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":144591,"downloads":17,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1015296,"link":"/plugin/30982-rescript-ide/versions/stable/1015296","version":"0.4.1","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1775803313000","file":"30982/1015296/intellij-rescript-0.4.1.zip","notes":"<h3>Parser</h3>\n\n<ul><li><strong>Top-level expression statements</strong> are now recognized at file scope. Previously, files starting with <code>switch</code>, <code>if</code>, a function call like <code>Console.log(\"hi\")</code>, or any other non-declaration expression produced parse errors and red squiggles on valid ReScript code. The parser now accepts them as opaque structure items, on par with <code>let</code>/<code>type</code>/<code>module</code>/etc.</li><li><strong>Move Statement</strong> (<code>Alt+Shift+Up/Down</code>): partial support for top-level expression statements. They reorder correctly across declaration boundaries (e.g. swapping a <code>Console.log(...)</code> with an adjacent <code>let</code>). Two or more consecutive expression statements currently move as a single block rather than individually — a known limitation of the opaque-parsing strategy that will be lifted once expressions get real grammatical structure.</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":130623,"downloads":33,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1008505,"link":"/plugin/30982-rescript-ide/versions/stable/1008505","version":"0.4.0","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1775300454000","file":"30982/1008505/intellij-rescript-0.4.0.zip","notes":"<h3>Editor features</h3>\n\n<ul><li><strong>Language injection</strong>: inject SQL, HTML, RegExp, or any other language into string literals via Alt+Enter → \"Inject Language or Reference\". Works on both <code>\"double-quoted\"</code> and <code>`backtick`</code> strings.</li><li><strong>Inspection suppression</strong>: <code>// noinspection</code> comments above declarations now suppress warnings (e.g. from injected languages)</li></ul>","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":127764,"downloads":42,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1007971,"link":"/plugin/30982-rescript-ide/versions/stable/1007971","version":"0.3.0","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1775249521000","file":"30982/1007971/intellij-rescript-0.3.0.zip","notes":"","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":111391,"downloads":26,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1005347,"link":"/plugin/30982-rescript-ide/versions/stable/1005347","version":"0.2.1","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1775050031000","file":"30982/1005347/intellij-rescript-0.2.1.zip","notes":"","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":87928,"downloads":1,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]},{"id":1001239,"link":"/plugin/30982-rescript-ide/versions/stable/1001239","version":"0.1.0","approve":true,"listed":true,"hidden":false,"recalculateCompatibilityAllowed":true,"cdate":"1774820123000","file":"30982/1001239/intellij-rescript-0.1.0.zip","notes":"","since":"253.0","until":"","sinceUntil":"253.0+","channel":"","size":75123,"downloads":1,"pluginId":30982,"compatibleVersions":{"CWMGUEST":"1.0+","GOLAND":"2025.3+","PYCHARM_COMMUNITY":"2025.3+","PHPSTORM":"2025.3+","DBE":"2025.3+","WEBSTORM":"2025.3+","IDEA_COMMUNITY":"2025.3+","ANDROID_STUDIO":"Panda 1 | 2025.3.1+","IDEA":"2025.3+","CLION":"2025.3+","MPS":"2025.3+","GATEWAY":"2025.3+","RUBYMINE":"2025.3+","RUST":"2025.3+","JBCLIENT":"1.0+","RIDER":"2025.3+","DATASPELL":"2025.3+","PYCHARM":"2025.3+"},"author":{"id":"7171a711-a800-41d7-8898-e6351380cae6","name":"Benjamin Thomas","link":"/author/7171a711-a800-41d7-8898-e6351380cae6","hubLogin":"benjamin.guy.thomas","icon":"https://hub.jetbrains.com/api/rest/avatar/7171a711-a800-41d7-8898-e6351380cae6","showMarketoCheckbox":true},"modules":[]}]