roblox-opencode 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -122
- package/commands/setup-game.md +108 -108
- package/commands/sync-check.md +53 -53
- package/core/roblox-core.md +93 -93
- package/dist/server.js +189 -167
- package/package.json +35 -35
- package/skills/roblox-analytics/SKILL.md +277 -277
- package/skills/roblox-analytics/references/event-batcher.luau +75 -75
- package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
- package/skills/roblox-architecture/SKILL.md +863 -863
- package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
- package/skills/roblox-code-review/SKILL.md +686 -686
- package/skills/roblox-data/SKILL.md +889 -889
- package/skills/roblox-data/references/inventory-systems.md +1729 -1729
- package/skills/roblox-debug/SKILL.md +98 -98
- package/skills/roblox-gui/SKILL.md +1103 -1103
- package/skills/roblox-gui-fusion/SKILL.md +150 -150
- package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
- package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
- package/skills/roblox-gui-fusion/references/shop.luau +411 -411
- package/skills/roblox-luau-mastery/SKILL.md +1519 -1519
- package/skills/roblox-monetization/SKILL.md +1084 -1084
- package/skills/roblox-monetization/references/process-receipt.luau +131 -131
- package/skills/roblox-networking/SKILL.md +669 -669
- package/skills/roblox-networking/references/remote-validator.luau +193 -193
- package/skills/roblox-publish-checklist/SKILL.md +127 -127
- package/skills/roblox-runtime/SKILL.md +753 -753
- package/skills/roblox-sharp-edges/SKILL.md +294 -294
- package/skills/roblox-sync/SKILL.md +126 -126
- package/skills/roblox-testing/SKILL.md +943 -943
- package/skills/roblox-tooling/SKILL.md +149 -149
- package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
- package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
- package/vendor/LICENSES/promise-LICENSE +20 -20
- package/vendor/LICENSES/t-LICENSE +21 -21
- package/vendor/LICENSES/testez-LICENSE +200 -200
- package/vendor/README.md +83 -83
- package/vendor/fusion/Animation/ExternalTime.luau +83 -83
- package/vendor/fusion/Animation/Spring.luau +321 -321
- package/vendor/fusion/Animation/Stopwatch.luau +127 -127
- package/vendor/fusion/Animation/Tween.luau +187 -187
- package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
- package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
- package/vendor/fusion/Animation/lerpType.luau +163 -163
- package/vendor/fusion/Animation/packType.luau +99 -99
- package/vendor/fusion/Animation/springCoefficients.luau +80 -80
- package/vendor/fusion/Animation/unpackType.luau +102 -102
- package/vendor/fusion/Colour/Oklab.luau +70 -70
- package/vendor/fusion/Colour/sRGB.luau +54 -54
- package/vendor/fusion/External.luau +167 -167
- package/vendor/fusion/ExternalDebug.luau +69 -69
- package/vendor/fusion/Graph/Observer.luau +113 -113
- package/vendor/fusion/Graph/castToGraph.luau +28 -28
- package/vendor/fusion/Graph/change.luau +80 -80
- package/vendor/fusion/Graph/depend.luau +32 -32
- package/vendor/fusion/Graph/evaluate.luau +55 -55
- package/vendor/fusion/Instances/Attribute.luau +57 -57
- package/vendor/fusion/Instances/AttributeChange.luau +46 -46
- package/vendor/fusion/Instances/AttributeOut.luau +63 -63
- package/vendor/fusion/Instances/Child.luau +21 -21
- package/vendor/fusion/Instances/Children.luau +147 -147
- package/vendor/fusion/Instances/Hydrate.luau +32 -32
- package/vendor/fusion/Instances/New.luau +52 -52
- package/vendor/fusion/Instances/OnChange.luau +49 -49
- package/vendor/fusion/Instances/OnEvent.luau +53 -53
- package/vendor/fusion/Instances/Out.luau +69 -69
- package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
- package/vendor/fusion/Instances/defaultProps.luau +194 -194
- package/vendor/fusion/LICENSE +21 -21
- package/vendor/fusion/Logging/formatError.luau +48 -48
- package/vendor/fusion/Logging/messages.luau +51 -51
- package/vendor/fusion/Logging/parseError.luau +24 -24
- package/vendor/fusion/Memory/checkLifetime.luau +133 -133
- package/vendor/fusion/Memory/deriveScope.luau +23 -23
- package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
- package/vendor/fusion/Memory/doCleanup.luau +78 -78
- package/vendor/fusion/Memory/innerScope.luau +33 -33
- package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
- package/vendor/fusion/Memory/needsDestruction.luau +16 -16
- package/vendor/fusion/Memory/poisonScope.luau +33 -33
- package/vendor/fusion/Memory/scopePool.luau +54 -54
- package/vendor/fusion/Memory/scoped.luau +26 -26
- package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
- package/vendor/fusion/RobloxExternal.luau +97 -97
- package/vendor/fusion/State/Computed.luau +138 -138
- package/vendor/fusion/State/For/Disassembly.luau +210 -210
- package/vendor/fusion/State/For/ForTypes.luau +30 -30
- package/vendor/fusion/State/For/init.luau +109 -109
- package/vendor/fusion/State/ForKeys.luau +93 -93
- package/vendor/fusion/State/ForPairs.luau +96 -96
- package/vendor/fusion/State/ForValues.luau +93 -93
- package/vendor/fusion/State/Value.luau +87 -87
- package/vendor/fusion/State/castToState.luau +25 -25
- package/vendor/fusion/State/peek.luau +30 -30
- package/vendor/fusion/Types.luau +314 -314
- package/vendor/fusion/Utility/Contextual.luau +90 -90
- package/vendor/fusion/Utility/Safe.luau +22 -22
- package/vendor/fusion/Utility/isSimilar.luau +29 -29
- package/vendor/fusion/Utility/merge.luau +35 -35
- package/vendor/fusion/Utility/nameOf.luau +34 -34
- package/vendor/fusion/Utility/never.luau +13 -13
- package/vendor/fusion/Utility/nicknames.luau +10 -10
- package/vendor/fusion/Utility/xtypeof.luau +26 -26
- package/vendor/fusion/init.luau +82 -82
- package/vendor/profilestore/init.luau +2242 -2242
- package/vendor/promise/init.luau +1982 -1982
- package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
- package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
- package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
- package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
- package/vendor/rbxutil/buffer-util/Types.luau +60 -60
- package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
- package/vendor/rbxutil/buffer-util/init.luau +41 -41
- package/vendor/rbxutil/buffer-util/package.json +16 -16
- package/vendor/rbxutil/buffer-util/wally.toml +9 -9
- package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
- package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
- package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
- package/vendor/rbxutil/comm/Client/init.luau +135 -135
- package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
- package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
- package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
- package/vendor/rbxutil/comm/Server/init.luau +140 -140
- package/vendor/rbxutil/comm/Types.luau +18 -18
- package/vendor/rbxutil/comm/Util.luau +27 -27
- package/vendor/rbxutil/comm/init.luau +35 -35
- package/vendor/rbxutil/comm/wally.toml +13 -13
- package/vendor/rbxutil/component/init.luau +759 -759
- package/vendor/rbxutil/component/init.test.luau +311 -311
- package/vendor/rbxutil/component/wally.toml +14 -14
- package/vendor/rbxutil/concur/init.luau +542 -542
- package/vendor/rbxutil/concur/init.test.luau +364 -364
- package/vendor/rbxutil/concur/wally.toml +8 -8
- package/vendor/rbxutil/enum-list/init.luau +101 -101
- package/vendor/rbxutil/enum-list/init.test.luau +91 -91
- package/vendor/rbxutil/enum-list/wally.toml +8 -8
- package/vendor/rbxutil/find/index.d.ts +20 -20
- package/vendor/rbxutil/find/init.luau +44 -44
- package/vendor/rbxutil/find/package.json +17 -17
- package/vendor/rbxutil/find/wally.toml +8 -8
- package/vendor/rbxutil/input/Gamepad.luau +559 -559
- package/vendor/rbxutil/input/Keyboard.luau +124 -124
- package/vendor/rbxutil/input/Mouse.luau +278 -278
- package/vendor/rbxutil/input/PreferredInput.luau +91 -91
- package/vendor/rbxutil/input/Touch.luau +120 -120
- package/vendor/rbxutil/input/init.luau +33 -33
- package/vendor/rbxutil/input/wally.toml +12 -12
- package/vendor/rbxutil/loader/index.d.ts +15 -15
- package/vendor/rbxutil/loader/init.luau +137 -137
- package/vendor/rbxutil/loader/wally.toml +8 -8
- package/vendor/rbxutil/log/index.d.ts +38 -38
- package/vendor/rbxutil/log/init.luau +746 -746
- package/vendor/rbxutil/log/wally.toml +8 -8
- package/vendor/rbxutil/net/init.luau +190 -190
- package/vendor/rbxutil/net/wally.toml +8 -8
- package/vendor/rbxutil/option/index.d.ts +44 -44
- package/vendor/rbxutil/option/init.luau +489 -489
- package/vendor/rbxutil/option/init.test.luau +342 -342
- package/vendor/rbxutil/option/wally.toml +8 -8
- package/vendor/rbxutil/pid/index.d.ts +53 -53
- package/vendor/rbxutil/pid/init.luau +195 -195
- package/vendor/rbxutil/pid/package.json +16 -16
- package/vendor/rbxutil/pid/wally.toml +9 -9
- package/vendor/rbxutil/quaternion/index.d.ts +117 -117
- package/vendor/rbxutil/quaternion/init.luau +570 -570
- package/vendor/rbxutil/quaternion/package.json +16 -16
- package/vendor/rbxutil/quaternion/wally.toml +9 -9
- package/vendor/rbxutil/query/index.d.ts +43 -43
- package/vendor/rbxutil/query/init.luau +117 -117
- package/vendor/rbxutil/query/package.json +18 -18
- package/vendor/rbxutil/query/wally.toml +9 -9
- package/vendor/rbxutil/sequent/index.d.ts +28 -28
- package/vendor/rbxutil/sequent/init.luau +340 -340
- package/vendor/rbxutil/sequent/package.json +16 -16
- package/vendor/rbxutil/sequent/wally.toml +9 -9
- package/vendor/rbxutil/ser/init.luau +175 -175
- package/vendor/rbxutil/ser/init.test.luau +50 -50
- package/vendor/rbxutil/ser/wally.toml +11 -11
- package/vendor/rbxutil/shake/index.d.ts +36 -36
- package/vendor/rbxutil/shake/init.luau +532 -532
- package/vendor/rbxutil/shake/init.test.luau +267 -267
- package/vendor/rbxutil/shake/package.json +16 -16
- package/vendor/rbxutil/shake/wally.toml +9 -9
- package/vendor/rbxutil/signal/index.d.ts +100 -100
- package/vendor/rbxutil/signal/init.luau +432 -432
- package/vendor/rbxutil/signal/init.test.luau +190 -190
- package/vendor/rbxutil/signal/package.json +17 -17
- package/vendor/rbxutil/signal/wally.toml +9 -9
- package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
- package/vendor/rbxutil/silo/Util.luau +55 -55
- package/vendor/rbxutil/silo/init.luau +338 -338
- package/vendor/rbxutil/silo/init.test.luau +215 -215
- package/vendor/rbxutil/silo/wally.toml +8 -8
- package/vendor/rbxutil/spring/index.d.ts +40 -40
- package/vendor/rbxutil/spring/init.luau +97 -97
- package/vendor/rbxutil/spring/package.json +17 -17
- package/vendor/rbxutil/spring/wally.toml +8 -8
- package/vendor/rbxutil/stream/index.d.ts +88 -88
- package/vendor/rbxutil/stream/init.luau +597 -597
- package/vendor/rbxutil/stream/package.json +18 -18
- package/vendor/rbxutil/stream/wally.toml +9 -9
- package/vendor/rbxutil/streamable/Streamable.luau +202 -202
- package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
- package/vendor/rbxutil/streamable/init.luau +8 -8
- package/vendor/rbxutil/streamable/wally.toml +12 -12
- package/vendor/rbxutil/symbol/init.luau +56 -56
- package/vendor/rbxutil/symbol/init.test.luau +37 -37
- package/vendor/rbxutil/symbol/wally.toml +8 -8
- package/vendor/rbxutil/table-util/init.luau +938 -938
- package/vendor/rbxutil/table-util/init.test.luau +439 -439
- package/vendor/rbxutil/task-queue/index.d.ts +27 -27
- package/vendor/rbxutil/task-queue/init.luau +97 -97
- package/vendor/rbxutil/task-queue/wally.toml +8 -8
- package/vendor/rbxutil/timer/index.d.ts +81 -81
- package/vendor/rbxutil/timer/init.luau +249 -249
- package/vendor/rbxutil/timer/init.test.luau +73 -73
- package/vendor/rbxutil/timer/wally.toml +11 -11
- package/vendor/rbxutil/tree/index.d.ts +15 -15
- package/vendor/rbxutil/tree/init.luau +137 -137
- package/vendor/rbxutil/tree/wally.toml +8 -8
- package/vendor/rbxutil/trove/index.d.ts +46 -46
- package/vendor/rbxutil/trove/init.luau +787 -787
- package/vendor/rbxutil/trove/init.test.luau +203 -203
- package/vendor/rbxutil/trove/wally.toml +8 -8
- package/vendor/rbxutil/typed-remote/init.luau +196 -196
- package/vendor/rbxutil/typed-remote/wally.toml +8 -8
- package/vendor/rbxutil/wait-for/index.d.ts +17 -17
- package/vendor/rbxutil/wait-for/init.luau +257 -257
- package/vendor/rbxutil/wait-for/init.test.luau +182 -182
- package/vendor/rbxutil/wait-for/wally.toml +11 -11
- package/vendor/t/t.lua +1350 -1350
- package/vendor/testez/Context.lua +26 -26
- package/vendor/testez/Expectation.lua +311 -311
- package/vendor/testez/ExpectationContext.lua +38 -38
- package/vendor/testez/LifecycleHooks.lua +89 -89
- package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
- package/vendor/testez/Reporters/TextReporter.lua +105 -105
- package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
- package/vendor/testez/TestBootstrap.lua +146 -146
- package/vendor/testez/TestEnum.lua +27 -27
- package/vendor/testez/TestPlan.lua +304 -304
- package/vendor/testez/TestPlanner.lua +39 -39
- package/vendor/testez/TestResults.lua +111 -111
- package/vendor/testez/TestRunner.lua +188 -188
- package/vendor/testez/TestSession.lua +243 -243
- package/vendor/testez/init.lua +39 -39
package/vendor/fusion/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2024 Daniel P H Fox
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Daniel P H Fox
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Formats a Fusion-specific error message.
|
|
8
|
-
]]
|
|
9
|
-
|
|
10
|
-
local Package = script.Parent.Parent
|
|
11
|
-
local Types = require(Package.Types)
|
|
12
|
-
local messages = require(Package.Logging.messages)
|
|
13
|
-
|
|
14
|
-
local ERROR_INFO_URL = "https://elttob.uk/Fusion/0.3/api-reference/general/errors/#"
|
|
15
|
-
|
|
16
|
-
local function formatError(
|
|
17
|
-
externalProvider: Types.ExternalProvider?,
|
|
18
|
-
messageID: string,
|
|
19
|
-
errorOrTrace: Types.Error | string | nil,
|
|
20
|
-
...: unknown
|
|
21
|
-
): string
|
|
22
|
-
local originalMessageID = messageID
|
|
23
|
-
local error: Types.Error? = if typeof(errorOrTrace) == "table" then errorOrTrace else nil
|
|
24
|
-
local trace: string? = if typeof(errorOrTrace) == "table" then errorOrTrace.trace else errorOrTrace
|
|
25
|
-
local messageText = messages[messageID]
|
|
26
|
-
if messageText == nil then
|
|
27
|
-
messageID = "unknownMessage"
|
|
28
|
-
messageText = messages[messageID]
|
|
29
|
-
end
|
|
30
|
-
messageText = messageText:format(...)
|
|
31
|
-
if error ~= nil then
|
|
32
|
-
messageText = messageText:gsub("ERROR_MESSAGE", error.message)
|
|
33
|
-
if error.context ~= nil then
|
|
34
|
-
messageText ..= ` ({error.context})`
|
|
35
|
-
end
|
|
36
|
-
else
|
|
37
|
-
messageText = messageText:gsub("ERROR_MESSAGE", originalMessageID)
|
|
38
|
-
end
|
|
39
|
-
messageText = `[Fusion] {messageText} \nID: {messageID}`
|
|
40
|
-
if externalProvider ~= nil and externalProvider.policies.allowWebLinks then
|
|
41
|
-
messageText ..= `\nLearn more: {ERROR_INFO_URL}{messageID:lower()}`
|
|
42
|
-
end
|
|
43
|
-
if trace ~= nil then
|
|
44
|
-
messageText ..= ` \n---- Stack trace ----\n{trace}`
|
|
45
|
-
end
|
|
46
|
-
return messageText:gsub("\n", "\n ")
|
|
47
|
-
end
|
|
48
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Formats a Fusion-specific error message.
|
|
8
|
+
]]
|
|
9
|
+
|
|
10
|
+
local Package = script.Parent.Parent
|
|
11
|
+
local Types = require(Package.Types)
|
|
12
|
+
local messages = require(Package.Logging.messages)
|
|
13
|
+
|
|
14
|
+
local ERROR_INFO_URL = "https://elttob.uk/Fusion/0.3/api-reference/general/errors/#"
|
|
15
|
+
|
|
16
|
+
local function formatError(
|
|
17
|
+
externalProvider: Types.ExternalProvider?,
|
|
18
|
+
messageID: string,
|
|
19
|
+
errorOrTrace: Types.Error | string | nil,
|
|
20
|
+
...: unknown
|
|
21
|
+
): string
|
|
22
|
+
local originalMessageID = messageID
|
|
23
|
+
local error: Types.Error? = if typeof(errorOrTrace) == "table" then errorOrTrace else nil
|
|
24
|
+
local trace: string? = if typeof(errorOrTrace) == "table" then errorOrTrace.trace else errorOrTrace
|
|
25
|
+
local messageText = messages[messageID]
|
|
26
|
+
if messageText == nil then
|
|
27
|
+
messageID = "unknownMessage"
|
|
28
|
+
messageText = messages[messageID]
|
|
29
|
+
end
|
|
30
|
+
messageText = messageText:format(...)
|
|
31
|
+
if error ~= nil then
|
|
32
|
+
messageText = messageText:gsub("ERROR_MESSAGE", error.message)
|
|
33
|
+
if error.context ~= nil then
|
|
34
|
+
messageText ..= ` ({error.context})`
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
messageText = messageText:gsub("ERROR_MESSAGE", originalMessageID)
|
|
38
|
+
end
|
|
39
|
+
messageText = `[Fusion] {messageText} \nID: {messageID}`
|
|
40
|
+
if externalProvider ~= nil and externalProvider.policies.allowWebLinks then
|
|
41
|
+
messageText ..= `\nLearn more: {ERROR_INFO_URL}{messageID:lower()}`
|
|
42
|
+
end
|
|
43
|
+
if trace ~= nil then
|
|
44
|
+
messageText ..= ` \n---- Stack trace ----\n{trace}`
|
|
45
|
+
end
|
|
46
|
+
return messageText:gsub("\n", "\n ")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
49
|
return formatError
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Stores templates for different kinds of logging messages.
|
|
8
|
-
]]
|
|
9
|
-
|
|
10
|
-
return {
|
|
11
|
-
callbackError = "Error in callback:\nERROR_MESSAGE",
|
|
12
|
-
cannotAssignProperty = "The class type '%s' has no assignable property '%s'.",
|
|
13
|
-
cannotConnectChange = "The %s class doesn't have a property called '%s'.",
|
|
14
|
-
cannotConnectEvent = "The %s class doesn't have an event called '%s'.",
|
|
15
|
-
cannotCreateClass = "Can't create a new instance of class '%s'.",
|
|
16
|
-
cannotDepend = "%s can't depend on %s.",
|
|
17
|
-
cleanupWasRenamed = "`Fusion.cleanup` was renamed to `Fusion.doCleanup`. This will be an error in future versions of Fusion.",
|
|
18
|
-
destroyedTwice = "`doCleanup()` was given something that it is already cleaning up. Unclear how to proceed.",
|
|
19
|
-
destructorRedundant = "%s destructors no longer do anything. If you wish to run code on destroy, `table.insert` a function into the `scope` argument. See discussion #292 on GitHub for advice.",
|
|
20
|
-
forKeyCollision = "The key '%s' was returned multiple times simultaneously, which is not allowed in `For` objects.",
|
|
21
|
-
infiniteLoop = "Detected an infinite loop. Consider adding an explicit breakpoint to your code to prevent a cyclic dependency.",
|
|
22
|
-
invalidAttributeChangeHandler = "The change handler for the '%s' attribute must be a function.",
|
|
23
|
-
invalidAttributeOutType = "[AttributeOut] properties must be given Value objects.",
|
|
24
|
-
invalidChangeHandler = "The change handler for the '%s' property must be a function.",
|
|
25
|
-
invalidEventHandler = "The handler for the '%s' event must be a function.",
|
|
26
|
-
invalidOutProperty = "The %s class doesn't have a property called '%s'.",
|
|
27
|
-
invalidOutType = "[Out] properties must be given Value objects.",
|
|
28
|
-
invalidPropertyType = "'%s.%s' expected a '%s' type, but got a '%s' type.",
|
|
29
|
-
invalidRefType = "Instance refs must be Value objects.",
|
|
30
|
-
invalidSpringDamping = "The damping ratio for a spring must be >= 0. (damping was %.2f)",
|
|
31
|
-
invalidSpringSpeed = "The speed of a spring must be >= 0. (speed was %.2f)",
|
|
32
|
-
mergeConflict = "Multiple definitions for '%s' found while merging.",
|
|
33
|
-
mistypedSpringDamping = "The damping ratio for a spring must be a number. (got a %s)",
|
|
34
|
-
mistypedSpringSpeed = "The speed of a spring must be a number. (got a %s)",
|
|
35
|
-
mistypedTweenInfo = "The tween info of a tween must be a TweenInfo. (got a %s)",
|
|
36
|
-
noTaskScheduler = "Fusion is not connected to an external task scheduler.",
|
|
37
|
-
poisonedScope = "Attempted to use a scope after it's been destroyed; %s",
|
|
38
|
-
possiblyOutlives = "%s will be destroyed before %s; %s. To fix this, review the order they're created in, and what scopes they belong to. See discussion #292 on GitHub for advice.",
|
|
39
|
-
propertySetError = "Error setting property:\nERROR_MESSAGE",
|
|
40
|
-
scopeMissing = "To create %s, provide a scope. (e.g. `%s`). See discussion #292 on GitHub for advice.",
|
|
41
|
-
springNanGoal = "A spring was given a NaN goal, so some simulation has been skipped. Ensure no springs have NaN goals.",
|
|
42
|
-
springNanMotion = "A spring encountered NaN during motion, so has snapped to the goal position. Ensure no springs have NaN positions or velocities.",
|
|
43
|
-
springTypeMismatch = "The type '%s' doesn't match the spring's type '%s'.",
|
|
44
|
-
stateGetWasRemoved = "`StateObject:get()` has been replaced by `use()` and `peek()` - see discussion #217 on GitHub.",
|
|
45
|
-
tweenNanGoal = "A tween was given a NaN goal, so some animation has been skipped. Ensure no tweens have NaN goals.",
|
|
46
|
-
tweenNanMotion = "A tween encountered NaN during motion, so has snapped to the goal. Ensure no tweens have NaN in their tween infos.",
|
|
47
|
-
unknownMessage = "Unknown error:\nERROR_MESSAGE",
|
|
48
|
-
unrecognisedChildType = "'%s' type children aren't accepted by `[Children]`.",
|
|
49
|
-
unrecognisedPropertyKey = "'%s' keys aren't accepted in property tables.",
|
|
50
|
-
unrecognisedPropertyStage = "'%s' isn't a valid stage for a special key to be applied at.",
|
|
51
|
-
useAfterDestroy = "%s is no longer valid - it was destroyed before %s. See discussion #292 on GitHub for advice."
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Stores templates for different kinds of logging messages.
|
|
8
|
+
]]
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
callbackError = "Error in callback:\nERROR_MESSAGE",
|
|
12
|
+
cannotAssignProperty = "The class type '%s' has no assignable property '%s'.",
|
|
13
|
+
cannotConnectChange = "The %s class doesn't have a property called '%s'.",
|
|
14
|
+
cannotConnectEvent = "The %s class doesn't have an event called '%s'.",
|
|
15
|
+
cannotCreateClass = "Can't create a new instance of class '%s'.",
|
|
16
|
+
cannotDepend = "%s can't depend on %s.",
|
|
17
|
+
cleanupWasRenamed = "`Fusion.cleanup` was renamed to `Fusion.doCleanup`. This will be an error in future versions of Fusion.",
|
|
18
|
+
destroyedTwice = "`doCleanup()` was given something that it is already cleaning up. Unclear how to proceed.",
|
|
19
|
+
destructorRedundant = "%s destructors no longer do anything. If you wish to run code on destroy, `table.insert` a function into the `scope` argument. See discussion #292 on GitHub for advice.",
|
|
20
|
+
forKeyCollision = "The key '%s' was returned multiple times simultaneously, which is not allowed in `For` objects.",
|
|
21
|
+
infiniteLoop = "Detected an infinite loop. Consider adding an explicit breakpoint to your code to prevent a cyclic dependency.",
|
|
22
|
+
invalidAttributeChangeHandler = "The change handler for the '%s' attribute must be a function.",
|
|
23
|
+
invalidAttributeOutType = "[AttributeOut] properties must be given Value objects.",
|
|
24
|
+
invalidChangeHandler = "The change handler for the '%s' property must be a function.",
|
|
25
|
+
invalidEventHandler = "The handler for the '%s' event must be a function.",
|
|
26
|
+
invalidOutProperty = "The %s class doesn't have a property called '%s'.",
|
|
27
|
+
invalidOutType = "[Out] properties must be given Value objects.",
|
|
28
|
+
invalidPropertyType = "'%s.%s' expected a '%s' type, but got a '%s' type.",
|
|
29
|
+
invalidRefType = "Instance refs must be Value objects.",
|
|
30
|
+
invalidSpringDamping = "The damping ratio for a spring must be >= 0. (damping was %.2f)",
|
|
31
|
+
invalidSpringSpeed = "The speed of a spring must be >= 0. (speed was %.2f)",
|
|
32
|
+
mergeConflict = "Multiple definitions for '%s' found while merging.",
|
|
33
|
+
mistypedSpringDamping = "The damping ratio for a spring must be a number. (got a %s)",
|
|
34
|
+
mistypedSpringSpeed = "The speed of a spring must be a number. (got a %s)",
|
|
35
|
+
mistypedTweenInfo = "The tween info of a tween must be a TweenInfo. (got a %s)",
|
|
36
|
+
noTaskScheduler = "Fusion is not connected to an external task scheduler.",
|
|
37
|
+
poisonedScope = "Attempted to use a scope after it's been destroyed; %s",
|
|
38
|
+
possiblyOutlives = "%s will be destroyed before %s; %s. To fix this, review the order they're created in, and what scopes they belong to. See discussion #292 on GitHub for advice.",
|
|
39
|
+
propertySetError = "Error setting property:\nERROR_MESSAGE",
|
|
40
|
+
scopeMissing = "To create %s, provide a scope. (e.g. `%s`). See discussion #292 on GitHub for advice.",
|
|
41
|
+
springNanGoal = "A spring was given a NaN goal, so some simulation has been skipped. Ensure no springs have NaN goals.",
|
|
42
|
+
springNanMotion = "A spring encountered NaN during motion, so has snapped to the goal position. Ensure no springs have NaN positions or velocities.",
|
|
43
|
+
springTypeMismatch = "The type '%s' doesn't match the spring's type '%s'.",
|
|
44
|
+
stateGetWasRemoved = "`StateObject:get()` has been replaced by `use()` and `peek()` - see discussion #217 on GitHub.",
|
|
45
|
+
tweenNanGoal = "A tween was given a NaN goal, so some animation has been skipped. Ensure no tweens have NaN goals.",
|
|
46
|
+
tweenNanMotion = "A tween encountered NaN during motion, so has snapped to the goal. Ensure no tweens have NaN in their tween infos.",
|
|
47
|
+
unknownMessage = "Unknown error:\nERROR_MESSAGE",
|
|
48
|
+
unrecognisedChildType = "'%s' type children aren't accepted by `[Children]`.",
|
|
49
|
+
unrecognisedPropertyKey = "'%s' keys aren't accepted in property tables.",
|
|
50
|
+
unrecognisedPropertyStage = "'%s' isn't a valid stage for a special key to be applied at.",
|
|
51
|
+
useAfterDestroy = "%s is no longer valid - it was destroyed before %s. See discussion #292 on GitHub for advice."
|
|
52
52
|
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
An xpcall() error handler to collect and parse useful information about
|
|
8
|
-
errors, such as clean messages and stack traces.
|
|
9
|
-
]]
|
|
10
|
-
|
|
11
|
-
local Package = script.Parent.Parent
|
|
12
|
-
local Types = require(Package.Types)
|
|
13
|
-
|
|
14
|
-
local function parseError(
|
|
15
|
-
err: string
|
|
16
|
-
): Types.Error
|
|
17
|
-
return {
|
|
18
|
-
type = "Error",
|
|
19
|
-
raw = err,
|
|
20
|
-
message = err:gsub("^.+:%d+:%s*", ""),
|
|
21
|
-
trace = debug.traceback(nil, 2)
|
|
22
|
-
}
|
|
23
|
-
end
|
|
24
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
An xpcall() error handler to collect and parse useful information about
|
|
8
|
+
errors, such as clean messages and stack traces.
|
|
9
|
+
]]
|
|
10
|
+
|
|
11
|
+
local Package = script.Parent.Parent
|
|
12
|
+
local Types = require(Package.Types)
|
|
13
|
+
|
|
14
|
+
local function parseError(
|
|
15
|
+
err: string
|
|
16
|
+
): Types.Error
|
|
17
|
+
return {
|
|
18
|
+
type = "Error",
|
|
19
|
+
raw = err,
|
|
20
|
+
message = err:gsub("^.+:%d+:%s*", ""),
|
|
21
|
+
trace = debug.traceback(nil, 2)
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
25
|
return parseError
|
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
--!strict
|
|
4
|
-
--!nolint LocalUnused
|
|
5
|
-
--!nolint LocalShadow
|
|
6
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
7
|
-
|
|
8
|
-
--[[
|
|
9
|
-
Procedures for checking lifetimes and printing helpful warnings about them.
|
|
10
|
-
]]
|
|
11
|
-
|
|
12
|
-
local Package = script.Parent.Parent
|
|
13
|
-
local Types = require(Package.Types)
|
|
14
|
-
local External = require(Package.External)
|
|
15
|
-
local whichLivesLonger = require(Package.Memory.whichLivesLonger)
|
|
16
|
-
local nameOf = require(Package.Utility.nameOf)
|
|
17
|
-
|
|
18
|
-
local checkLifetime = {}
|
|
19
|
-
|
|
20
|
-
checkLifetime.formatters = {}
|
|
21
|
-
|
|
22
|
-
function checkLifetime.formatters.useFunction(
|
|
23
|
-
self: unknown,
|
|
24
|
-
used: unknown
|
|
25
|
-
): (string, string)
|
|
26
|
-
local selfName = nameOf(self, "object")
|
|
27
|
-
local usedName = nameOf(used, "object")
|
|
28
|
-
return `The use()-d {usedName}`, `the {selfName}`
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
function checkLifetime.formatters.boundProperty(
|
|
32
|
-
instance: Instance,
|
|
33
|
-
bound: unknown,
|
|
34
|
-
property: string
|
|
35
|
-
): (string, string)
|
|
36
|
-
local selfName = instance.Name
|
|
37
|
-
local boundName = nameOf(bound, "value")
|
|
38
|
-
return `The {boundName} (bound to the {property} property)`, `the {selfName} instance`
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
function checkLifetime.formatters.boundAttribute(
|
|
42
|
-
instance: Instance,
|
|
43
|
-
bound: unknown,
|
|
44
|
-
attribute: string
|
|
45
|
-
): (string, string)
|
|
46
|
-
local selfName = instance.Name
|
|
47
|
-
local boundName = nameOf(bound, "value")
|
|
48
|
-
return `The {boundName} (bound to the {attribute} attribute)`, `the {selfName} instance`
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
function checkLifetime.formatters.propertyOutputsTo(
|
|
52
|
-
instance: Instance,
|
|
53
|
-
bound: unknown,
|
|
54
|
-
property: string
|
|
55
|
-
): (string, string)
|
|
56
|
-
local selfName = instance.Name
|
|
57
|
-
local boundName = nameOf(bound, "object")
|
|
58
|
-
return `The {boundName} (which the {property} property outputs to)`, `the {selfName} instance`
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
function checkLifetime.formatters.attributeOutputsTo(
|
|
62
|
-
instance: Instance,
|
|
63
|
-
bound: unknown,
|
|
64
|
-
attribute: string
|
|
65
|
-
): (string, string)
|
|
66
|
-
local selfName = instance.Name
|
|
67
|
-
local boundName = nameOf(bound, "object")
|
|
68
|
-
return `The {boundName} (which the {attribute} attribute outputs to)`, `the {selfName} instance`
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
function checkLifetime.formatters.refOutputsTo(
|
|
72
|
-
instance: Instance,
|
|
73
|
-
bound: unknown
|
|
74
|
-
): (string, string)
|
|
75
|
-
local selfName = instance.Name
|
|
76
|
-
local boundName = nameOf(bound, "object")
|
|
77
|
-
return `The {boundName} (which the Ref key outputs to)`, `the {selfName} instance`
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
function checkLifetime.formatters.animationGoal(
|
|
81
|
-
self: unknown,
|
|
82
|
-
goal: unknown
|
|
83
|
-
): (string, string)
|
|
84
|
-
local selfName = nameOf(self, "object")
|
|
85
|
-
local goalName = nameOf(goal, "object")
|
|
86
|
-
return `The goal {goalName}`, `the {selfName} that is following it`
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
function checkLifetime.formatters.parameter(
|
|
90
|
-
self: unknown,
|
|
91
|
-
used: unknown,
|
|
92
|
-
parameterName: string | false
|
|
93
|
-
): (string, string)
|
|
94
|
-
local selfName = nameOf(self, "object")
|
|
95
|
-
local usedName = nameOf(used, "object")
|
|
96
|
-
if parameterName == false then
|
|
97
|
-
return `The {usedName} parameter`, `the {selfName} that it was used for`
|
|
98
|
-
else
|
|
99
|
-
return `The {usedName} representing the {parameterName} parameter`, `the {selfName} that it was used for`
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
function checkLifetime.formatters.observer(
|
|
104
|
-
self: unknown,
|
|
105
|
-
watched: unknown
|
|
106
|
-
): (string, string)
|
|
107
|
-
local selfName = nameOf(self, "object")
|
|
108
|
-
local watchedName = nameOf(watched, "object")
|
|
109
|
-
return `The watched {watchedName}`, `the {selfName} that's observing it for changes`
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
function checkLifetime.bOutlivesA<A, B, Args...>(
|
|
113
|
-
scopeA: Types.Scope<unknown>,
|
|
114
|
-
a: A,
|
|
115
|
-
scopeB: Types.Scope<unknown>?,
|
|
116
|
-
b: B,
|
|
117
|
-
formatter: (a: A, b: B, Args...) -> (string, string),
|
|
118
|
-
...: Args...
|
|
119
|
-
)
|
|
120
|
-
if scopeB == nil then
|
|
121
|
-
External.logError("useAfterDestroy", nil, formatter(a, b, ...))
|
|
122
|
-
elseif whichLivesLonger(scopeA, a, scopeB, b) == "definitely-a" then
|
|
123
|
-
local aName, bName = formatter(a, b, ...)
|
|
124
|
-
External.logWarn(
|
|
125
|
-
"possiblyOutlives",
|
|
126
|
-
aName, bName,
|
|
127
|
-
if scopeA == scopeB then
|
|
128
|
-
"they're in the same scope, but the latter is destroyed too quickly"
|
|
129
|
-
else
|
|
130
|
-
"the latter is in a different scope that gets destroyed too quickly"
|
|
131
|
-
)
|
|
132
|
-
end
|
|
133
|
-
end
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
--!strict
|
|
4
|
+
--!nolint LocalUnused
|
|
5
|
+
--!nolint LocalShadow
|
|
6
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
7
|
+
|
|
8
|
+
--[[
|
|
9
|
+
Procedures for checking lifetimes and printing helpful warnings about them.
|
|
10
|
+
]]
|
|
11
|
+
|
|
12
|
+
local Package = script.Parent.Parent
|
|
13
|
+
local Types = require(Package.Types)
|
|
14
|
+
local External = require(Package.External)
|
|
15
|
+
local whichLivesLonger = require(Package.Memory.whichLivesLonger)
|
|
16
|
+
local nameOf = require(Package.Utility.nameOf)
|
|
17
|
+
|
|
18
|
+
local checkLifetime = {}
|
|
19
|
+
|
|
20
|
+
checkLifetime.formatters = {}
|
|
21
|
+
|
|
22
|
+
function checkLifetime.formatters.useFunction(
|
|
23
|
+
self: unknown,
|
|
24
|
+
used: unknown
|
|
25
|
+
): (string, string)
|
|
26
|
+
local selfName = nameOf(self, "object")
|
|
27
|
+
local usedName = nameOf(used, "object")
|
|
28
|
+
return `The use()-d {usedName}`, `the {selfName}`
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
function checkLifetime.formatters.boundProperty(
|
|
32
|
+
instance: Instance,
|
|
33
|
+
bound: unknown,
|
|
34
|
+
property: string
|
|
35
|
+
): (string, string)
|
|
36
|
+
local selfName = instance.Name
|
|
37
|
+
local boundName = nameOf(bound, "value")
|
|
38
|
+
return `The {boundName} (bound to the {property} property)`, `the {selfName} instance`
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
function checkLifetime.formatters.boundAttribute(
|
|
42
|
+
instance: Instance,
|
|
43
|
+
bound: unknown,
|
|
44
|
+
attribute: string
|
|
45
|
+
): (string, string)
|
|
46
|
+
local selfName = instance.Name
|
|
47
|
+
local boundName = nameOf(bound, "value")
|
|
48
|
+
return `The {boundName} (bound to the {attribute} attribute)`, `the {selfName} instance`
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
function checkLifetime.formatters.propertyOutputsTo(
|
|
52
|
+
instance: Instance,
|
|
53
|
+
bound: unknown,
|
|
54
|
+
property: string
|
|
55
|
+
): (string, string)
|
|
56
|
+
local selfName = instance.Name
|
|
57
|
+
local boundName = nameOf(bound, "object")
|
|
58
|
+
return `The {boundName} (which the {property} property outputs to)`, `the {selfName} instance`
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
function checkLifetime.formatters.attributeOutputsTo(
|
|
62
|
+
instance: Instance,
|
|
63
|
+
bound: unknown,
|
|
64
|
+
attribute: string
|
|
65
|
+
): (string, string)
|
|
66
|
+
local selfName = instance.Name
|
|
67
|
+
local boundName = nameOf(bound, "object")
|
|
68
|
+
return `The {boundName} (which the {attribute} attribute outputs to)`, `the {selfName} instance`
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
function checkLifetime.formatters.refOutputsTo(
|
|
72
|
+
instance: Instance,
|
|
73
|
+
bound: unknown
|
|
74
|
+
): (string, string)
|
|
75
|
+
local selfName = instance.Name
|
|
76
|
+
local boundName = nameOf(bound, "object")
|
|
77
|
+
return `The {boundName} (which the Ref key outputs to)`, `the {selfName} instance`
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
function checkLifetime.formatters.animationGoal(
|
|
81
|
+
self: unknown,
|
|
82
|
+
goal: unknown
|
|
83
|
+
): (string, string)
|
|
84
|
+
local selfName = nameOf(self, "object")
|
|
85
|
+
local goalName = nameOf(goal, "object")
|
|
86
|
+
return `The goal {goalName}`, `the {selfName} that is following it`
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
function checkLifetime.formatters.parameter(
|
|
90
|
+
self: unknown,
|
|
91
|
+
used: unknown,
|
|
92
|
+
parameterName: string | false
|
|
93
|
+
): (string, string)
|
|
94
|
+
local selfName = nameOf(self, "object")
|
|
95
|
+
local usedName = nameOf(used, "object")
|
|
96
|
+
if parameterName == false then
|
|
97
|
+
return `The {usedName} parameter`, `the {selfName} that it was used for`
|
|
98
|
+
else
|
|
99
|
+
return `The {usedName} representing the {parameterName} parameter`, `the {selfName} that it was used for`
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
function checkLifetime.formatters.observer(
|
|
104
|
+
self: unknown,
|
|
105
|
+
watched: unknown
|
|
106
|
+
): (string, string)
|
|
107
|
+
local selfName = nameOf(self, "object")
|
|
108
|
+
local watchedName = nameOf(watched, "object")
|
|
109
|
+
return `The watched {watchedName}`, `the {selfName} that's observing it for changes`
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
function checkLifetime.bOutlivesA<A, B, Args...>(
|
|
113
|
+
scopeA: Types.Scope<unknown>,
|
|
114
|
+
a: A,
|
|
115
|
+
scopeB: Types.Scope<unknown>?,
|
|
116
|
+
b: B,
|
|
117
|
+
formatter: (a: A, b: B, Args...) -> (string, string),
|
|
118
|
+
...: Args...
|
|
119
|
+
)
|
|
120
|
+
if scopeB == nil then
|
|
121
|
+
External.logError("useAfterDestroy", nil, formatter(a, b, ...))
|
|
122
|
+
elseif whichLivesLonger(scopeA, a, scopeB, b) == "definitely-a" then
|
|
123
|
+
local aName, bName = formatter(a, b, ...)
|
|
124
|
+
External.logWarn(
|
|
125
|
+
"possiblyOutlives",
|
|
126
|
+
aName, bName,
|
|
127
|
+
if scopeA == scopeB then
|
|
128
|
+
"they're in the same scope, but the latter is destroyed too quickly"
|
|
129
|
+
else
|
|
130
|
+
"the latter is in a different scope that gets destroyed too quickly"
|
|
131
|
+
)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
134
|
return checkLifetime
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Creates an empty scope with the same metatables as the original scope. Used
|
|
8
|
-
for preserving access to constructors when creating inner scopes.
|
|
9
|
-
|
|
10
|
-
This is the public version of the function, which implements external
|
|
11
|
-
debugging hooks.
|
|
12
|
-
]]
|
|
13
|
-
local Package = script.Parent.Parent
|
|
14
|
-
local Types = require(Package.Types)
|
|
15
|
-
local ExternalDebug = require(Package.ExternalDebug)
|
|
16
|
-
local deriveScopeImpl = require(Package.Memory.deriveScopeImpl)
|
|
17
|
-
|
|
18
|
-
local function deriveScope(...)
|
|
19
|
-
local scope = deriveScopeImpl(...)
|
|
20
|
-
ExternalDebug.trackScope(scope)
|
|
21
|
-
return scope
|
|
22
|
-
end
|
|
23
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Creates an empty scope with the same metatables as the original scope. Used
|
|
8
|
+
for preserving access to constructors when creating inner scopes.
|
|
9
|
+
|
|
10
|
+
This is the public version of the function, which implements external
|
|
11
|
+
debugging hooks.
|
|
12
|
+
]]
|
|
13
|
+
local Package = script.Parent.Parent
|
|
14
|
+
local Types = require(Package.Types)
|
|
15
|
+
local ExternalDebug = require(Package.ExternalDebug)
|
|
16
|
+
local deriveScopeImpl = require(Package.Memory.deriveScopeImpl)
|
|
17
|
+
|
|
18
|
+
local function deriveScope(...)
|
|
19
|
+
local scope = deriveScopeImpl(...)
|
|
20
|
+
ExternalDebug.trackScope(scope)
|
|
21
|
+
return scope
|
|
22
|
+
end
|
|
23
|
+
|
|
24
24
|
return deriveScope :: Types.DeriveScopeConstructor
|