Skip to content

Commit 1633204

Browse files
committed
---@enum supports runtime values
resolve #1619
1 parent 00dd1ed commit 1633204

File tree

9 files changed

+313
-83
lines changed

9 files changed

+313
-83
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ server will generate `doc.json` and `doc.md` in `LOGPATH`.
146146
---@type boolean[]
147147
local t = { 1, 2, 3 } --> Warning: Cannot assign `integer` to `boolean`
148148
```
149+
* `CHG` `---@enum` supports runtime values
149150
* `FIX` [#1479]
150151
* `FIX` [#1480]
151152
* `FIX` [#1567]

locale/zh-cn/script.lua

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,17 @@ DIAG_UNDEFINED_DOC_PARAM =
117117
DIAG_UNKNOWN_DIAG_CODE =
118118
'未知的诊断代号 `{}`。'
119119
DIAG_CAST_LOCAL_TYPE =
120-
'已显式定义变量的类型为 `{def}` ,不能再将其类型转换为 `{ref}`。'
120+
'已显式定义变量的类型为 `{def}` ,不能再将其类型转换为 `{ref}`。\n{err}'
121121
DIAG_CAST_FIELD_TYPE =
122-
'已显式定义字段的类型为 `{def}` ,不能再将其类型转换为 `{ref}`。'
122+
'已显式定义字段的类型为 `{def}` ,不能再将其类型转换为 `{ref}`。\n{err}'
123123
DIAG_ASSIGN_TYPE_MISMATCH =
124-
'不能将 `{ref}` 赋值给 `{def}`。'
124+
'不能将 `{ref}` 赋值给 `{def}`。\n{err}'
125125
DIAG_PARAM_TYPE_MISMATCH =
126-
'不能将 `{ref}` 赋给参数 `{def}`。'
126+
'不能将 `{ref}` 赋给参数 `{def}`。\n{err}'
127127
DIAG_UNKNOWN_CAST_VARIABLE =
128128
'未知的类型转换变量 `{}`。'
129129
DIAG_CAST_TYPE_MISMATCH =
130-
'不能将 `{def}` 转换为 `{ref}`。'
130+
'不能将 `{def}` 转换为 `{ref}`。\n{err}'
131131
DIAG_MISSING_RETURN_VALUE =
132132
'至少需要 {min} 个返回值,但此处只返回 {rmax} 个值。'
133133
DIAG_MISSING_RETURN_VALUE_RANGE =
@@ -589,6 +589,40 @@ CLI_CHECK_SUCCESS =
589589
CLI_CHECK_RESULTS =
590590
'诊断完成,共有 {} 个问题,请查看 {}'
591591

592+
TYPE_ERROR_ENUM_GLOBAL_DISMATCH =
593+
'类型 `{child}` 无法匹配 `{parent}` 的枚举类型'
594+
TYPE_ERROR_ENUM_GENERIC_UNSUPPORTED =
595+
'无法在枚举中使用泛型 `{child}`'
596+
TYPE_ERROR_ENUM_LITERAL_DISMATCH =
597+
'字面量 `{child}` 无法匹配 `{parent}` 的枚举值'
598+
TYPE_ERROR_ENUM_OBJECT_DISMATCH =
599+
'对象 `{child}` 无法匹配 `{parent}` 的枚举值,它们必须是同一个对象'
600+
TYPE_ERROR_ENUM_NO_OBJECT =
601+
'无法识别传入的枚举值 `{child}`'
602+
TYPE_ERROR_INTEGER_DISMATCH =
603+
'字面量 `{child}` 无法匹配整数 `{parent}`'
604+
TYPE_ERROR_STRING_DISMATCH =
605+
'字面量 `{child}` 无法匹配字符串 `{parent}`'
606+
TYPE_ERROR_BOOLEAN_DISMATCH =
607+
'字面量 `{child}` 无法匹配布尔值 `{parent}`'
608+
TYPE_ERROR_TABLE_NO_FIELD =
609+
'表中不存在字段 `{key}`'
610+
TYPE_ERROR_TABLE_FIELD_DISMATCH =
611+
'字段 `{key}` 的类型为 `{child}`,无法匹配 `{parent}`'
612+
TYPE_ERROR_UNION_ALL_DISMATCH =
613+
'`{child}` 中的所有子类型均无法匹配 `{parent}`'
614+
TYPE_ERROR_UNION_DISMATCH =
615+
'联合类型中的 `{child}` 无法匹配 `{parent}`'
616+
TYPE_ERROR_OPTIONAL_DISMATCH =
617+
'可选类型无法匹配 `{parent}`'
618+
TYPE_ERROR_NUMBER_LITERAL_TO_INTEGER =
619+
'无法将数字 `{child}` 转换为整数'
620+
TYPE_ERROR_NUMBER_TYPE_TO_INTEGER =
621+
'无法将数字类型转换为整数类型'
622+
TYPE_ERROR_DISMATCH =
623+
'类型 `{child}` 无法匹配 `{parent}`'
624+
625+
592626
LUADOC_DESC_CLASS = -- TODO: need translate!
593627
[=[
594628
Defines a class/table structure

script/core/diagnostics/assign-type-mismatch.lua

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ return function (uri, callback)
9696
end
9797

9898
local varNode = vm.compileNode(source)
99-
if vm.canCastType(uri, varNode, valueNode) then
99+
local suc, errs = vm.canCastType(uri, varNode, valueNode)
100+
if suc then
100101
return
101102
end
102103

@@ -107,12 +108,15 @@ return function (uri, callback)
107108
end
108109
end
109110

111+
assert(errs)
112+
110113
callback {
111114
start = source.start,
112115
finish = source.finish,
113116
message = lang.script('DIAG_ASSIGN_TYPE_MISMATCH', {
114117
def = vm.getInfer(varNode):view(uri),
115118
ref = vm.getInfer(valueNode):view(uri),
119+
err = vm.viewTypeErrorMessage(uri, errs),
116120
}),
117121
}
118122
end)

script/core/diagnostics/cast-local-type.lua

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@ return function (uri, callback)
3434
refNode = refNode:copy():setTruthy()
3535
end
3636

37-
if not vm.canCastType(uri, locNode, refNode) then
37+
local suc, errs = vm.canCastType(uri, locNode, refNode)
38+
39+
if not suc then
40+
assert(errs)
3841
callback {
3942
start = ref.start,
4043
finish = ref.finish,
4144
message = lang.script('DIAG_CAST_LOCAL_TYPE', {
4245
def = vm.getInfer(locNode):view(uri),
4346
ref = vm.getInfer(refNode):view(uri),
47+
err = vm.viewTypeErrorMessage(uri, errs),
4448
}),
4549
}
4650
end

script/core/diagnostics/cast-type-mismatch.lua

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ return function (uri, callback)
2626
for _, cast in ipairs(doc.casts) do
2727
if not cast.mode and cast.extends then
2828
local refNode = vm.compileNode(cast.extends)
29-
if not vm.canCastType(uri, defNode, refNode) then
29+
local suc, errs = vm.canCastType(uri, defNode, refNode)
30+
if not suc then
31+
assert(errs)
3032
callback {
3133
start = cast.extends.start,
3234
finish = cast.extends.finish,
3335
message = lang.script('DIAG_CAST_TYPE_MISMATCH', {
3436
def = vm.getInfer(defNode):view(uri),
3537
ref = vm.getInfer(refNode):view(uri),
38+
err = vm.viewTypeErrorMessage(uri, errs),
3639
})
3740
}
3841
end

script/core/diagnostics/param-type-mismatch.lua

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,17 @@ return function (uri, callback)
100100
-- 因此将假值移除再进行检查
101101
refNode = refNode:copy():setTruthy()
102102
end
103-
if not vm.canCastType(uri, defNode, refNode) then
103+
local suc, errs = vm.canCastType(uri, defNode, refNode)
104+
if not suc then
104105
local rawDefNode = getRawDefNode(funcNode, i)
106+
assert(errs)
105107
callback {
106108
start = arg.start,
107109
finish = arg.finish,
108110
message = lang.script('DIAG_PARAM_TYPE_MISMATCH', {
109111
def = vm.getInfer(rawDefNode):view(uri),
110112
ref = vm.getInfer(refNode):view(uri),
113+
err = vm.viewTypeErrorMessage(uri, errs),
111114
})
112115
}
113116
end

script/vm/infer.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ local viewNodeSwitch;viewNodeSwitch = util.switch()
234234
end
235235
return ('fun(%s)%s'):format(argView, regView)
236236
end)
237+
: case 'doc.field.name'
238+
: call(function (source, infer, uri)
239+
return vm.viewKey(source, uri)
240+
end)
237241

238242
---@class vm.node
239243
---@field lastInfer? vm.infer

0 commit comments

Comments
 (0)