Skip to content

Script Studio Followups 2 - #401

Merged
RyeMutt merged 42 commits into
developfrom
rye/scriptstudio2
Oct 4, 2026
Merged

RyeMutt merged 42 commits into
developfrom
rye/scriptstudio2

Conversation

@RyeMutt

@RyeMutt RyeMutt commented Oct 3, 2026

Copy link
Copy Markdown
Member

Description

Related Issues

  • Please link to a relevant GitHub issue for additional context.
    • Bug Fix: Link to an issue that includes reproduction steps and testing guidance.
    • Feature/Enhancement: Link to an issue with a write-up, rationale, and requirements.

Issue Link:


Checklist

Please ensure the following before requesting review:

  • I have provided a clear title and detailed description for this pull request.
  • If useful, I have included media such as screenshots and video to show off my changes.
  • I have tested the changes locally and verified they work as intended.
  • All new and existing tests pass.
  • Code follows the project's style guidelines.
  • Documentation has been updated if needed.
  • Any dependent changes have been merged and published in downstream modules
  • I have reviewed the contributing guidelines.

Additional Notes

RyeMutt and others added 30 commits October 3, 2026 18:36
ALTextCarets holds a view's other selections, each anchor to caret, in
the order they begin, and slides them with the text's edits: a caret is
pushed past what is typed at it, as the main one is, and a selection
keeps what it held, what goes in at either edge staying outside it --
which Edit::placed now offers, a place left before text put right at
it. Two that overlap become one, and so do a caret and whatever it
touches; two selections side by side stay two. One the main selection
meets becomes part of it, the main one keeping its place and its way,
so that everything that knows of one selection goes on as it did.

The view washes each selection and draws each caret as it does the main
one, in its style and blinking with it, every caret in sight in one
draw. A step to undo keeps the others as they stood before it and after,
undo and redo put them back, and a history written out keeps them too.
Nothing makes them yet but the view's own calls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Typing, Backspace and Delete, Return with its indent, Tab and Shift-Tab,
comments, and the commands over lines -- duplicate, move, delete, join,
a line put in above or below, the lines selected -- act at every
selection, each worked out over the text as it stands before any of
them and made as one edit, one step to undo. A command over lines acts
once on lines several selections share, and moving or deleting takes
lines next to each other as one. A run of Backspaces at several carets
is one step, apart from the typing before it. The caret's motions move
every caret, each keeping its own column between rows, and carets a
motion brings together become one.

Copy and cut take the selections one to a line; a paste gives each
selection a line where the clip has one for each, else the whole clip.
A command that acts at one place -- finding, going to a definition,
completing, the next function -- acts at the main caret and lets the
others go.

The code editor closes, types over and takes away its pairs at every
caret, and wraps every selection; what its typing puts up -- the list,
the signature, a snippet's stops -- goes while there are several. Its
typed-over closers and its inlay hints slide by each stretch of an edit
of several, not by the whole span, which had dropped those between them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Alt-click -- Option-click on a Mac -- puts a caret where it is pressed,
or takes away the one there, and any other click is one caret again.
Control-Alt with up or down -- Command-Option on a Mac -- adds a caret
on the row above or below each one, each keeping its column past a
short line, as a column grows. Escape goes back to one caret, keeping
its selection, before it lets the selection go; going to a place from
a list is one caret too. The newest caret is the main one, which the
view follows. Add Caret Above and Below are in the Selection menu and
take keys of their own.

Select Next Occurrence adds the next place as a selection of its own,
and Change All selects every place, rather than lighting them as a
snippet's mirrors; with nothing selected at several carets, the first
takes the word at each. The find bar selects every match with Alt-Return.

The completion list stays open at several carets, and what is chosen
from it goes in at each, over what reads there as the main caret's
word does, each caret on the first parameter or stop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
As Luau's documentation of generalized iteration names them, and as
SLua scripts mostly write them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ble set in it is a lint

SlGlobalFunction says what SlGlobalAssign said of function f() at the
top of a script, so that it can be turned off alone: a script moved
from LSL keeps its functions global while they still call functions
written after them, which a local function cannot be called before.
SlGlobalAssign keeps the globals given a value at the top and the
functions made global inside a block.

SlForIndexAssign warns where a numeric for's variable is set in its
body, plainly or by +=: LSL's for went on from what it was set to,
where Luau's gives it its own next value each time round, so a loop
moved from LSL that sets it to go back or to skip one does neither. A
while loop does; there is no fix, the loop being the scripter's to
rewrite. Both rules are added at the end of the table, so that the
lint masks already kept read as they did.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Apply with nothing previewed waiting, with the problems the fixes were
for gone since -- the script then checked again -- or with the text
refusing the edits, made nothing and said nothing. Each now says so in
the status line. A test follows what is left from LSL from its preview
to Apply.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The last way an asked Apply made nothing in silence: a tab no longer
loaded or no longer modifiable. A save's own fixes stay quiet, as the
save says what it did.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Weighed for SLua, a handler LLEvents is given -- LLEvents:on, once, a
field of LLEvents -- is a handler named by its event, and one in a
state's table, as the assistant writes them, with its state; what
LLTimers calls is named by how it is set going. Each part now spans its
function to its end, as the parser has it, where it ran only to the
last line that made code. The notes over the text and the Weights tab
said "unnamed" of every handler written as SLua writes them.

A line's bytes now take in the constants it is first to name in its
function and the strings it is first to name in the script, read off
the bytecode's instructions, so that a long string weighs on the line
that says it as it does under LSO. They had been nobody's.

LSL on Luau's compiler records no lines at all, so its lines cannot be
weighed one by one; the Weights tab says so, rather than showing a
heat of nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The install stamp left VCPKG_OVERLAY_PORTS out of what it keys on, so a
configure that set an overlay -- a port being tried before its registry
has it -- said nothing had changed and installed nothing. An overlay
port's own files changing is still not seen; deleting the stamp is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The registry's slua (2026-09-17#2) lets the fork's LSL compiler record
the line of each instruction, as SLua's compiler does, which it never
did. The weigher compiles twice: as the server does, for the total and
the parts, and with lines, for what each line comes to. The lines are
not in the server's asset, so the total stays what the server charges.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SDL frees the text it is given to copy when it decides another client
has taken the clipboard, while the Wayland source or X11 owner it gave
that text to can go on serving it; 3.4.18 decides so on Wayland each
time keyboard focus leaves with an offer held. Another application then
pasted a few bytes of whatever had since been allocated there, or
nothing, from chat, notecards, line editors and the studio alike.

The viewer now holds the text and gives SDL a callback onto it with a
cleanup that does nothing, under the names the X11 and Wayland backends
use for text. Other platforms keep SDL_SetClipboardText.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The registry's sdl3 (3.4.18#1) stops SDL deciding another client has
the clipboard when it has not -- on Wayland when keyboard focus leaves
or a clipboard manager serves a copy of the viewer's text, on X11 when
a stale TARGETS reply arrives -- so that the viewer's own copy pastes
back into it. The viewer still holds what it copied, for any such
decision the patch does not cover.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…arrow

Shift-Alt-drag -- Shift-Option on a Mac -- selects a column from the
anchor to the mouse, and Control-Shift-Alt with an arrow -- Command-
Shift-Option -- grows one a column or a row at a time, or begins one
from the selection there is. Each row between the corners gets a
selection from one corner's x to the other's, so that a tab or a wide
character counts as wide as it is drawn and a row too short gets a caret
at its end; the row the corner moves on is the main one, and each caret
keeps the column's x for the motions after.

On Windows and Linux those keys had selected by a name's parts; the
column takes them, as Visual Studio Code has it, and selecting by parts
there is left for a key given it by hand. The Mac keeps both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A backslash joined its line to the next only where a newline came right
after it. Before CRLF -- from a disk include, an external editor, an
inventory include -- or with a space or a tab between, the backslash
stood as a stray token, the macro's body ended there, and the lines meant
for it went on as code, in LSL's #define and SLua's --#define alike.

The preprocessor now ends a line at CRLF and at a lone CR as at LF, as
C's first phase does and as the studio's own text already did. On a
directive's line, blanks between the backslash and the newline are let
by, as GCC and Clang let them by, with a warning that says so; elsewhere
they join nothing, so that a note ending in a backslash and a space does
not take the line of code after it. The place a fix puts a line at the
head of a script sees such a directive's lines as one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h CRLF too

Every file of NexiiLSL a directive is in, and the one they include
besides, copied as they are under its licence, with a golden script for
each that calls every macro it defines -- the 28 the repository never
uses among them -- and remote-linkset-data.lsl twice, its #ifdefs on and
off. The expected texts agree with clang's preprocessor given the same
type macros, but for strings over several lines, which come out with
\n where their newlines were, as Firestorm writes them.

Every golden file and its includes is run again with its lines ended in
CRLF and in a lone CR, as a Windows checkout or an old Mac would end
them, and must come out the same and say nothing: what NexiiLSL's
texture.lsl did not, read from a disk where Git for Windows had ended
its lines in CRLF.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vim has one caret: what insert mode typed at several stays, and Escape
leaves the main one alone before a count or a block puts its text in
again, there only.

A composition stands at the main caret only, the others moving aside
for it and back, and what it commits is typed at each; the find bar is
seeded from the main selection. Both were so already, and are tested.

Mirrors brought up as each key was typed were Select Next Occurrence's,
which makes selections now: nothing set them live any more. Their
highlight, the undo and redo that ended them, the key's scope that kept
them up, and a mirror added as it was found go; a snippet's mirrors,
brought up as their stop is left, stay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A caret besides the main one put on a line folded away -- by Select
Next Occurrence, Select All Matches, a column, an undo -- was not drawn,
and nothing opened its line. Its line opens now, as the main one's
does. Folding a block, or everything, moves the others in it to the end
of the line the fold shows, as it already moved the main one; those that
meet there become one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…udes apart

A script's problems are made once and shared: the Problems pane's store
takes the rows its tab holds rather than a copy of them, each file's
findings held as shared and never changed after (ALFindings).

A tab's tip reads where its script is from the skin once, not for every
tab at every refill of the strip.

Search's Replace All and the Explorer's opening of many rows, or of the
scripts a listing brings, hold the tabs as the window's own openings do:
the strip, the toolbar and the lists made once, as the last opens.

A file a script includes is searched away from the main thread, as a
script not open is, and counted as still to come until it is back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A function's integer parameter the script reads only as a truth -- in
an if, behind !, with && and || -- is a boolean in the SLua written, as
the script's own variables already were: typed so where types are
written, and each call giving it a truth, a number turned into one.
One read as a number, or given more than TRUE where it is asked about
TRUE, stays a number. An event's parameters stay the numbers the grid's
signatures give them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A string declared empty just before the loop that builds it, in the
same block, with nothing between reading or setting it, is declared
where its pieces are joined -- local row = table.concat(rowParts) --
rather than declared empty and then added to. One declared with words
of its own, or read before the loop, is added to as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a note

SlGlobalAssign said a global made at the top of the script, and a
function made global in a block, but not a global first set inside a
function: `count = 0` in init() and `count += 1` in a handler. Where
more than one statement of the top names it, it is a note now, fixed by
a local of the script's declared before the first of them, which every
function there still shares. Where one function alone names it, Luau's
own GlobalUsedAsLocal says so, and this says nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A string of 256 bytes or more the script keeps -- a key, a table of
names, a notecard's worth of text -- is a part of its own, named by the
start of its text and placed at the line that first loads it, so the
Weights tab lists it as a row beside the functions and handlers. Its
bytes are each target's: in SLua's and LSL on Luau's table of strings,
taken out of that table's part; in LSO's code, taken out of the function
or handler that writes it; in Mono's strings, taken out of the method
that first loads it. No byte is counted twice, and each total is as it
was.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The region tells its scripts' time only to an estate manager, through
Top Scripts. Where the agent manages the estate, the studio asks Top
Scripts of each owner of the objects it has in hand -- the agent, or one
whose name is known -- once a minute an owner, and keeps each object's
time by its id beside what the region said it reserves: the Explorer's
object rows say it after the memory, and the Weights tab's heading as a
sentence of its own. Memory and time each keep what the other said.

The region's answer says neither who asked nor what for, and had one
handler, the Top Objects floater's. It is the workspace's now: an answer
of top scripts filtered by owner while the studio waits on one is the
studio's, and every other goes on to Top Objects as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With several carets, F3 went to the next match with the main caret
alone, but the find bar's buttons kept the others where they were. Both
come to the same function, which now lets the others go when it finds a
match, so the bar and the keys agree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reference grouped functions by the categories in the shipped
lsl_definitions.yaml, while their names and signatures came from what the
region sent. It reads the YAML through the syntax cache now, as the
keywords are read: the region's where it sent one, else the shipped one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tip said how the region counts memory whenever the region had said
anything, and nothing of time. It is built from parts now: the code size
always; how the region counts memory, where it said what the object
reserves; and how its time is counted, where an estate manager was told
it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An answer of top scripts filtered by owner says neither who asked nor
what for, so while the studio waited on one it took the first that came,
even one the Top Objects floater asked for with its own owner filter.
Each of the studio's asks keeps its owner now, and an answer is the
oldest one's whose owner its rows name, names compared as usernames.
One naming none of them -- empty, or another owner's -- is the oldest
ask's only while Top Objects is closed, and Top Objects' while it is
open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A loop counting from 0 to below a list's length, whose counter is read
as nothing but that list's items, becomes SLua's walk over the list,
for _, item in l, each read the item by name. A loop inside another gets
a name of its own, and where the script has a name _, the unread index
gets a fresh one. A loop starting further in, or reading its counter as
anything else, still counts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dropping a snippets notecard on the Snippets tab copies its snippets
into one's own. A notecard can now be followed instead, dropped on the
tab's Follow box: its snippets are offered beside the viewer's and one's
own for as long as it is followed, as the notecard stands whoever
changes it -- a team's notecard, kept up to date by one of them. Each is
in the language it says, one saying none in both. The list shows them
after one's own, quiet and read-only, to copy to change; they are never
written to one's own file or notecard. A notecard that is not snippets
gives none and says why in the box's tip. Clear stops following it, and
Cancel puts back the one followed before.

Following a notecard is the vimrc notecard's way, taken out into a class
of its own that both use: the item in a per-account setting, the text
kept on disk with the asset it was read from, and fetched again only
when the item has a new asset.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Top Objects' handler for LandStatReply got its window, and the
Region/Estate window, by building them where they were not open. Script
Studio asks Top Scripts too now, and an answer to one of its asks that
comes after it gave up on it goes to that handler, which built both
windows, hidden, to drop it. It finds them now, and an answer neither is
open for is dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Why a followed notecard's snippets could not be read was only in the
Follow box's tip. It is a row of the list now, in the error colour, where
the notecard's snippets would be, which cannot be chosen. And a row of
the notecard's that was chosen is chosen again by its name when the
notecard changes, rather than by its place, which may now be another
snippet's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 134 files, which is 34 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6baaf145-3367-426c-bc37-8c504dd367ae
📥 Commits

Reviewing files that changed from the base of the PR and between ec9592b and 95c9a43.

📒 Files selected for processing (134)
  • indra/alscript/allsltoslua.cpp
  • indra/alscript/alpreprocessor.cpp
  • indra/alscript/alpreprocessor.h
  • indra/alscript/alscriptfixes.cpp
  • indra/alscript/alscriptlintpass.cpp
  • indra/alscript/alscriptweight.cpp
  • indra/alscript/tests/allsltoslua_test.cpp
  • indra/alscript/tests/alpreprocessor_test.cpp
  • indra/alscript/tests/alpreprocessorc11_test.cpp
  • indra/alscript/tests/alscriptlintpass_test.cpp
  • indra/alscript/tests/alscriptweight_test.cpp
  • indra/alscript/tests/preprocessor/include/NexiiLSL/LICENSE
  • indra/alscript/tests/preprocessor/include/NexiiLSL/app-uri.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/damage-types.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/inverse-kinematics.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/linkset.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/remote-linkset-data.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/scripts/rez-queue-check.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/scripts/roundabout.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/scripts/sync-lsd.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/string-compression.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/texture.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/time.lsl
  • indra/alscript/tests/preprocessor/include/NexiiLSL/utilities.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_app_uri.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_app_uri_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_damage_types.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_damage_types_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_inverse_kinematics.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_inverse_kinematics_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_linkset.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_linkset_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_remote_linkset_data.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_remote_linkset_data_bare.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_remote_linkset_data_bare_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_remote_linkset_data_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_rez_queue_check.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_rez_queue_check_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_roundabout.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_roundabout_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_string_compression.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_string_compression_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_sync_lsd.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_sync_lsd_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_texture.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_texture_expected.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_utilities.lsl
  • indra/alscript/tests/preprocessor/test_nexiilsl_utilities_expected.lsl
  • indra/cmake/BootstrapVcpkg.cmake
  • indra/llui/CMakeLists.txt
  • indra/llui/alcodeeditor.cpp
  • indra/llui/alcodeeditor.h
  • indra/llui/alfindbar.cpp
  • indra/llui/alfindbar.h
  • indra/llui/alfindings.h
  • indra/llui/alkeymap.cpp
  • indra/llui/alkeymap.h
  • indra/llui/alsnippetsession.cpp
  • indra/llui/alsnippetsession.h
  • indra/llui/altextcarets.cpp
  • indra/llui/altextcarets.h
  • indra/llui/altextdocument.cpp
  • indra/llui/altextdocument.h
  • indra/llui/altextediting.cpp
  • indra/llui/altextediting.h
  • indra/llui/altextindent.cpp
  • indra/llui/altextindent.h
  • indra/llui/altextundo.cpp
  • indra/llui/altextundo.h
  • indra/llui/altextview.cpp
  • indra/llui/altextview.h
  • indra/llui/alvimkeymap.cpp
  • indra/llui/tests/alcodeeditor_test.cpp
  • indra/llui/tests/altextcarets_test.cpp
  • indra/llui/tests/altextdocument_test.cpp
  • indra/llui/tests/altextediting_test.cpp
  • indra/llui/tests/altextindent_test.cpp
  • indra/llui/tests/altextundo_test.cpp
  • indra/llui/tests/altextview_gl_test.cpp
  • indra/llui/tests/altextview_test.cpp
  • indra/llui/tests/alvimkeymap_test.cpp
  • indra/llui/tests/alxuifindings_test.cpp
  • indra/llwindow/llwindowsdl.cpp
  • indra/newview/CMakeLists.txt
  • indra/newview/alfloaterscriptpreferences.cpp
  • indra/newview/alfloaterscriptpreferences.h
  • indra/newview/alfloaterscriptstudio.cpp
  • indra/newview/alfloaterscriptstudio.h
  • indra/newview/alfollowednotecard.cpp
  • indra/newview/alfollowednotecard.h
  • indra/newview/alscriptcrumbsbar.cpp
  • indra/newview/alscriptcrumbsbar.h
  • indra/newview/alscriptexplorerpane.cpp
  • indra/newview/alscriptobjectcheck.cpp
  • indra/newview/alscriptproblemspane.cpp
  • indra/newview/alscriptregionusage.cpp
  • indra/newview/alscriptregionusage.h
  • indra/newview/alscriptsearchpane.cpp
  • indra/newview/alscriptsearchpane.h
  • indra/newview/alscriptsnippets.cpp
  • indra/newview/alscriptsnippets.h
  • indra/newview/alscriptstudiochecking.cpp
  • indra/newview/alscriptstudiochecking.h
  • indra/newview/alscriptstudiodoc.cpp
  • indra/newview/alscriptstudiodoc.h
  • indra/newview/alscriptstudioservices.h
  • indra/newview/alscriptstudiosnippetnotecard.cpp
  • indra/newview/alscriptstudiosnippetnotecard.h
  • indra/newview/alscriptstudiovimrc.cpp
  • indra/newview/alscriptstudiovimrc.h
  • indra/newview/alscriptweightspane.cpp
  • indra/newview/alscriptworkspace.cpp
  • indra/newview/alscriptworkspace.h
  • indra/newview/app_settings/settings_alchemy.xml
  • indra/newview/app_settings/settings_per_account_alchemy.xml
  • indra/newview/app_settings/snippets/slua.xml
  • indra/newview/llcompilequeue.cpp
  • indra/newview/llfloatertopobjects.cpp
  • indra/newview/llfloatertopobjects.h
  • indra/newview/llscripteditorws.cpp
  • indra/newview/llstartup.cpp
  • indra/newview/skins/default/xui/en/floater_script_studio.xml
  • indra/newview/skins/default/xui/en/floater_script_studio_prefs.xml
  • indra/newview/skins/default/xui/en/panel_script_studio_keys.xml
  • indra/newview/skins/default/xui/en/strings.xml
  • indra/newview/tests/alscriptcrumbsbar_test.cpp
  • indra/newview/tests/alscriptproblemspane_test.cpp
  • indra/newview/tests/alscriptregionusage_test.cpp
  • indra/newview/tests/alscriptsearchpane_test.cpp
  • indra/newview/tests/alscriptsnippets_test.cpp
  • indra/newview/tests/alscriptstudiochecking_test.cpp
  • indra/newview/tests/alscriptstudiodoc_test.cpp
  • indra/newview/tests/alscriptweightspane_test.cpp
  • indra/vcpkg-configuration.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

RyeMutt and others added 10 commits October 3, 2026 20:08
A script with #define, #include or another directive, checked while it
is not preprocessed, had the LSL parser's complaint on the directive's
line -- "Missing '('" for #define -- and a fix that put a '(' in. The
complaint now says lines starting with # are the preprocessor's and how
to turn it on, and carries no fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Script Studio preferences' notecard boxes -- the vimrc's, the
snippet list, the Follow box -- read what a drag carries as an inventory
item before asking what kind of drag it was. A person or a group dragged
from People carries an id, not an item, and the call through it crashed
while the drag was merely over a box. The kind is asked first now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…is not built

A string declared just before the first of two loops that build it was
declared again at the second's join, so the second loop's local took the
place of what the first had built: "aabb" came out "bb". Where it is
declared at a join is now each loop's own.

And a string appended whole to another in a loop, all += line, counted
as only appended to, so the loop built it too and its reads in the loop
saw it unbuilt -- and, declared at its join now, not declared at all.
Only the string an append adds to is the append's own; one appended is
read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ery caret

- Tab with a caret on a line a selection indents: the caret goes in with
  the line rather than putting a tab before the selection's text, which
  left the selection over the wrong characters.
- Fold All with the main caret folded away moves every caret out at once;
  moving the main one first opened again the folds the others were in.
- Copy with a selection among carets copies what Cut takes, the
  selections' text, not the carets' lines as well.
- A jump to a line leaves one caret, as a jump to a place does.
- A closer typed plain at one caret beside one typed over at another is
  brought out as it would be alone, and the step settles as one caret's.
- The column's corners and each caret's kept x stand only in the layout
  they were taken in, not after a zoom or a wrap.
- Vim: keys held for a mapping, and Replace mode, go in at every caret
  (ALTextView::typeText); an undo or redo in normal mode leaves one caret.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ey know

- Top Objects keeps what it last asked until its answer comes, and an
  answer of top scripts by owner is its own only while it is open and
  waits on one: no longer an empty answer to one of the studio's, which
  turned a Top Colliders list into Top Scripts, nor the studio taking one
  of Top Objects' own. Waiting on one, Top Objects takes all but an
  answer naming an owner only the studio asked about.
- A group's objects are not asked about by owner: the agent may act as
  their owner, and their owner id is the group's, which no avatar name
  answers for.
- An owner's answer naming fewer than Top Scripts gives at most leaves
  the objects of theirs it does not name with no time, rather than the
  last said of them standing as if current.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A failed fetch left nothing to say the asset had been tried, so the
check each second fetched it again -- clearing the error and saying the
notecard changed twice each time, rereading the snippet files and filling
the preferences' list again, or asking the asset again where the failure
came late. The asset that failed is kept, and asked for again only once
the item has another or another item is followed. The vimrc's notecard,
which shares the class, had the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… whole

- A table written with record fields whose values are constants is a
  template carrying those values, and no instruction loads them: they
  were nobody's line, and a heavy one never a part of its own. The
  template's values are read with its keys now, at the table's line.
- A heavy constant's name, its first 32 bytes, could end inside a
  character, or lose the last byte of a whole one, leaving it not UTF-8:
  it is cut before the character the cut falls in now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LuauLintSlGlobalInFunction counted a global as set at the top only where
a statement of the top itself set it: one set in an if, a do or a loop
at the top read as set inside a function. And a function f() at the top
was not counted at all where SlGlobalFunction was off. A set is the
top's now wherever it stands outside every function, and function f()
at the top is one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ys why

Whether a save ran the preprocessor was the setting's, but for a script
saved in its envelope before: a new script with #define, the setting
off, was checked and saved as written -- the parser's complaint on the
directive, and an upload the grid refuses -- while an older one with
the same defines worked, and Preprocess Now showed a clean expansion of
either. A script that holds a directive could go up no other way, so it
is preprocessed now whatever the setting says; the setting is for every
other script (ALPreprocessor::usesDirectives, ALPreprocessor::wanted,
one rule for the tabs, the object check, the workspace's saves, the
recompile queue and the external editor's).

And the tab says what a save does: the Source/Preprocessed word's tip
gives why a save preprocesses it -- its envelope, its directives, the
setting -- and a preprocessed view of a script a save sends as written
is marked "Not preprocessed on save", in the warning's colour, lest it
be taken for what goes up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
std::llround returns long long, and passing it to spanRange's S32 is
C4244, an error under /WX on the Windows test builds. ll_round rounds
an F32 to an S32.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@RyeMutt
RyeMutt merged commit 7ddf780 into develop Oct 4, 2026
19 of 21 checks passed
@RyeMutt
RyeMutt deleted the rye/scriptstudio2 branch October 4, 2026 04:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant