Script Studio Followups 2 - #401
Merged
Merged
Conversation
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>
Contributor
|
Important Review skippedToo 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
📒 Files selected for processing (134)
You can disable this status message by setting the
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. Comment |
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Related Issues
Issue Link:
Checklist
Please ensure the following before requesting review:
Additional Notes