Skip to content

Script Studio QA round ten: keys as uuids, linked prims, the link notice, event hovers - #593

Merged
RyeMutt merged 8 commits into
developfrom
rye/script-qa10
Oct 27, 2026
Merged

RyeMutt merged 8 commits into
developfrom
rye/script-qa10

Conversation

@RyeMutt

@RyeMutt RyeMutt commented Oct 27, 2026

Copy link
Copy Markdown
Member

Description

Tapple's tenth round of Script Studio QA covers six reports: two in the converter's keys as uuids, the explorer losing linked prims, the link notice's length and buttons, and SLua event hovers.

One commit partly undoes nopjmp's 7977a06902. That commit held a key declared with nothing as text, since LSL's key k; holds "". Tapple asked to have key k; mean key k = NULL_KEY; again where keys are uuids, as it did before, and that was decided on 2026-10-27. The difference from LSL is noted in the script. key k = ""; still stays text, for round seven's link-message case.

llList2Key's key made text holds its item's text, not NULL_KEY's

  • With keys as uuids, a key held as text that was given llList2Key's item took tostring(llcompat.List2Key(...)). SLua's List2Key answers NULL_KEY for "" and for any text that is no UUID. Tapple's av = llList2Key(["", ...], 0); if (av != "") printed ["00000000-..."] where LSL printed [].
  • Wherever llList2Key's key is made text (Writer::coerced), its item is now read as List2String reads it: av = newAssignments[1] or "". Keys as text already worked this way (round eight). A key held as a uuid keeps llcompat.List2Key.
  • The same applies to string msg = llList2Key(l, 0) with keys as uuids, which gave NULL_KEY's text for text that is no UUID. SluaList2KeyText is reworded to fit, in the converter and in strings.xml.

A key declared with nothing is NULL_KEY again where keys are uuids

  • key av; is local av: uuid = NULL_KEY, compared with "" as uuid(""), and given llList2Key as List2Key. Tapple's script now comes out exactly as they asked.
  • A note over the first such declaration says it (SluaKeyDeclared, once a script, like the other key notes). The key equals NULL_KEY and reads as NULL_KEY's text, where LSL's did neither.
  • key av = ""; is still text. With keys as text, nothing changes.
  • The test expectations that 7977a06902 changed for this are back to what they were (gOwner, gSitter, gSender), and its "holds no text" test is replaced.

A file's tab keeps the prims of the scripts it masters in the explorer

  • The explorer lists objects that are pinned, selected in world, or have a script open. A linked script's tab gives way to its file's tab, which names no prim. So a prim whose open scripts were all linked dropped out once the edit window closed and deselected it.
  • A file's tab now counts as open for every script it masters, unless the link is orphaned. Making or removing a link relists the explorer.

Hover on an SLua event's handler says its parameters again

  • function LLEvents.run_time_permissions() hovered as nothing. The old solver types only LLEvents in a function statement's name, and the editor's fallback asked the definitions for the dotted name, where events are kept bare. The old script editor showed the arguments.
  • A field with no type of its own now takes the type the table or extern type it is on gives it. A field holding a function or nil hovers as the function: function LLEvents.run_time_permissions(perm: number), under either solver.

Compare with the world's script says why it could not read it

  • The link notice's Compare read the script in-world and, where the read failed, returned without a word. Tapple saw the button only close the notice.
  • The failure is now reported on the file's tab, with the reason (MasterWorldNotRead). Nothing else on that path drops the comparison, and the masters test compares as it should. The cause in Tapple's viewer was not reproduced, so the hand check below matters.

Script Studio's notice wraps its words onto up to three lines

  • A link's notice was about three times what fitted on the bar's one line. It was cut off with an ellipsis, and the full text was only in the tooltip.
  • The words now wrap in the space the buttons leave, and the bar grows to fit them, up to three lines. It is fitted again when the window is resized, and the tooltip still holds all of it (ALScriptNoticeBar::fitWords).
  • Shorter link words: "[NAME] is linked to [FILE]: each save of the file sends it. They differ now: the next save sends the file, keeping what [NAME] held in History."

A file's link offers Update File: the script's world text into the file

  • Tapple asked for a way to sync the other way from Send File.
  • Update File (master_take_world) reads what the script holds in-world, out of its envelope, and puts it in the file's tab as one step to undo. The file on disk is written only when the tab is saved, and that save then sends what the script already holds.
  • It is offered wherever Send File and Compare are, on the file's tab. Where the tab already holds the world's text, it says so and changes nothing.

Related Issues

None: Tapple's QA notes of 2026-10-22 to 2026-10-25, forwarded.

Issue Link: none


Checklist

  • 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. (Unit tests only; see Hand checks.)
  • 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

Testing

  • On the tip, alscript passes 703/703 test cases and newview passes 747 of 748 (one skipped). The changed viewer files build.
  • New tests:
    • allsltoslua: Tapple's script with key av;, = "" and = NULL_KEY, and a key declared with nothing, noted and with keys as text.
    • alluauservice: an event's handler hovered while being written and while being read, under both solvers.
    • alscriptstudiomasters: Compare through a refused read and a successful one, and Update File put in the tab, undone, and taken again when already the same.
    • alscriptstudioorphans: the real bar from the skin, one line, two, and past three.

Hand checks

  • Link every open script of a prim to files, then close the edit window: the prim stays in the explorer. Close the file's tab: it goes.
  • Link a script to a file that differs: the notice wraps onto two or three lines, in a narrow window and a wide one.
  • On that notice, Compare shows the file beside the script in-world. If it still shows nothing, see what the status bar says.
  • Update File puts the in-world text in the file's tab, unsaved, with undo taking it back. Saving writes the file, and the send that follows should find the script already holds it.

🤖 Generated with Claude Code

RyeMutt and others added 8 commits October 27, 2026 08:15
With keys as uuids, a key held as text (declared with nothing, or given
"") that was given llList2Key's item took tostring of SLua's List2Key,
which answers NULL_KEY for "" and for any text that is no UUID: key av;
av = llList2Key(["", ...], 0); av != "" was true, where LSL's was false.
Wherever llList2Key's key is made text (Writer::coerced), its item is
read as List2String reads it, as it already was with keys as text:
av = newAssignments[1] or "". A key held as a uuid keeps List2Key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The explorer lists the objects pinned, selected in world, or holding an
open script, and a file's tab names no prim: a prim whose open scripts
were all linked to files, their tabs giving way to the files', dropped
out once the edit window closed and deselected it. A file's tab now
counts as open for every script it masters (not orphaned), and links
made and let go of relist the explorer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
function LLEvents.run_time_permissions() showed nothing under the old
solver, which types only LLEvents in a function statement's name, and
the editor's fallback asked the definitions for the dotted name, which
they keep events under bare. The old editor showed the event's
arguments. A field with no type of its own now takes the one the table
or extern type it is on gives it, and a field holding a function or
nil, as an event's handler does, hovers as the function:
function LLEvents.run_time_permissions(perm: number), under either
solver.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Compare a link offers read the script in-world and, where the read
failed, returned without a word, so the button only closed the notice.
The failure is now said on the file's tab, with the reason the read gave
(MasterWorldNotRead). The masters test now takes Compare through a
refused read and a read one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A link's notice ran three times past the one line the bar had, cut with
an ellipsis and whole only in its tip. The bar's words now wrap at what
its buttons leave them, and its layout panel is as tall as their lines,
up to three, again as the window is resized; all of them are still in
the tip. The link's own words are shorter too: "[NAME] is linked to
[FILE]: each save of the file sends it. They differ now: the next save
sends the file, keeping what [NAME] held in History."

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A link's notice offered Send File, which sends the file over the
script, and no way the other way. Update File (master_take_world) reads
what the script holds in-world, out of its envelope, and puts it in the
file's tab as one step to undo; the file on disk is written only by a
save of it, which then sends what the script already holds. Offered
wherever Send File and Compare are, on the file's tab: a link made to a
file that differs, a tab that gave way to such a file, a send held over
a change in-world, and a change heard in-world.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8da2f20 reworded SluaList2KeyText, which is said wherever llList2Key's
key is made text, not only where every key is held as text; the string
the studio shows it by was left with the old words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7977a06 held key k; as text, since LSL's held "": (string)k was ""
and k == NULL_KEY FALSE. Tapple asks for it as key k = NULL_KEY; is,
as it was before: local k = NULL_KEY, a uuid compared with "" as
uuid(""), and given llList2Key as List2Key. The difference is said once,
over the first such declaration (SluaKeyDeclared): it equals NULL_KEY
and reads as NULL_KEY's text, where LSL's did neither. key k = ""; is
still held as text, for the link-message case of QG10. With keys as
text, nothing changes.

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

coderabbitai Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 35 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 41502a6b-b468-4d0a-bbe2-247ac12731a0
Commits

Reviewing files that changed from the base of the PR and between da5a827 and 99de048.

Files selected for processing: 16
  • indra/alscript/lsl/allsltoslua.cpp
  • indra/alscript/luau/alluauservice.cpp
  • indra/alscript/tests/allsltoslua_test.cpp
  • indra/alscript/tests/alluauservice_test.cpp
  • indra/newview/alfloaterscriptstudio.cpp
  • indra/newview/alscriptexplorerpane.cpp
  • indra/newview/alscriptnoticebar.cpp
  • indra/newview/alscriptnoticebar.h
  • indra/newview/alscriptoutputpane.cpp
  • indra/newview/alscriptstudiomasters.cpp
  • indra/newview/alscriptstudiomasters.h
  • indra/newview/alscriptstudioorphans.cpp
  • indra/newview/skins/default/xui/en/floater_script_studio.xml
  • indra/newview/skins/default/xui/en/strings.xml
  • indra/newview/tests/alscriptstudiomasters_test.cpp
  • indra/newview/tests/alscriptstudioorphans_test.cpp
  • Autofix · 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
RyeMutt merged commit 046b5ea into develop Oct 27, 2026
22 checks passed
@RyeMutt
RyeMutt deleted the rye/script-qa10 branch October 27, 2026 19:54
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