To ignore any remaining items: >
[a, b; _] = longList
-< *E1092*
Declaring more than one variable at a time, using the unpack notation, is
-currently not supported: >
- var [v1, v2] = GetValues() # Error!
-That is because the type needs to be inferred from the list item type, which
-isn't that easy.
+possible. Each variable can have a type or infer it from the value: >
+ var [v1: number, v2] = GetValues()
+Use this only when there is a list with values, declaring one variable per
+line is much easier to read and change later.
Constants ~
assert_equal(['sdf', 'asdf', 'end'], list3)
CheckDefExecFailure(['var ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
- CheckDefExecFailure(['var [v1, v2] = [1, 2]'], 'E1092:')
# type becomes list<any>
var somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
CheckDefExecAndScriptFailure(lines, 'E1012:', 5)
enddef
+def Test_list_declaration()
+ var [v1, v2] = [1, 2]
+ v1 += 3
+ assert_equal(4, v1)
+ v2 *= 3
+ assert_equal(6, v2)
+
+ var lines =<< trim END
+ var [v1, v2] = [1]
+ END
+ CheckDefExecAndScriptFailure2(lines, 'E1093: Expected 2 items but got 1', 'E688:')
+ lines =<< trim END
+ var testlist = [1]
+ var [v1, v2] = testlist
+ END
+ CheckDefExecAndScriptFailure2(lines, 'E1093: Expected 2 items but got 1', 'E688:')
+ lines =<< trim END
+ var [v1, v2] = [1, 2, 3]
+ END
+ CheckDefExecAndScriptFailure2(lines, 'E1093: Expected 2 items but got 3', 'E687:')
+ lines =<< trim END
+ var testlist = [1, 2, 3]
+ var [v1, v2] = testlist
+ END
+ CheckDefExecAndScriptFailure2(lines, 'E1093: Expected 2 items but got 3', 'E687:')
+
+ var [vnr, vstr] = [123, 'text']
+ vnr += 3
+ assert_equal(126, vnr)
+ vstr ..= 'end'
+ assert_equal('textend', vstr)
+
+ var [vnr2: number, vstr2: string] = [123, 'text']
+ vnr2 += 3
+ assert_equal(126, vnr2)
+ vstr2 ..= 'end'
+ assert_equal('textend', vstr2)
+
+ var [vnr3: number; vlist: list<string>] = [123, 'foo', 'bar']
+ vnr3 += 5
+ assert_equal(128, vnr3)
+ assert_equal(['foo', 'bar'], vlist)
+
+ lines =<< trim END
+ var [vnr2: number, vstr2: number] = [123, 'text']
+ END
+ CheckDefExecAndScriptFailure2(lines, 'E1163: Variable 2: type mismatch, expected number but got string', 'E1012: Type mismatch; expected number but got string')
+ lines =<< trim END
+ var testlist = [234, 'text']
+ var [vnr2: number, vstr2: number] = testlist
+ END
+ CheckDefExecAndScriptFailure2(lines, 'E1163: Variable 2: type mismatch, expected number but got string', 'E1012: Type mismatch; expected number but got string')
+enddef
+
def PartFuncBool(b: bool): string
return 'done'
enddef
// any "[expr]" or ".name"
char_u *lhs_dest_end; // end of the destination, including
// "[expr]" or ".name".
+ char_u *lhs_end; // end including any type
int lhs_has_index; // has "[expr]" or ".name"
--lhs->lhs_dest_end;
if (is_decl && var_end == var_start + 2 && var_end[-1] == ':')
--var_end;
+ lhs->lhs_end = lhs->lhs_dest_end;
// compute the length of the destination without "[expr]" or ".name"
lhs->lhs_varlen = var_end - var_start;
}
}
- // handle "a:name" as a name, not index "name" on "a"
+ // handle "a:name" as a name, not index "name" in "a"
if (lhs->lhs_varlen > 1 || var_start[lhs->lhs_varlen] != ':')
var_end = lhs->lhs_dest_end;
if (lhs->lhs_type == NULL)
return FAIL;
lhs->lhs_has_type = TRUE;
+ lhs->lhs_end = p;
}
else if (lhs->lhs_lvar != NULL)
lhs->lhs_type = lhs->lhs_lvar->lv_type;
if (p == NULL)
return *arg == '[' ? arg : NULL;
- if (var_count > 0 && is_decl)
- {
- // TODO: should we allow this, and figure out type inference from list
- // members?
- emsg(_(e_cannot_use_list_for_declaration));
- return NULL;
- }
lhs.lhs_name = NULL;
sp = p;
cctx->ctx_lnum = save_lnum;
if (var_idx + 1 < var_count)
- var_start = skipwhite(lhs.lhs_dest_end + 1);
+ var_start = skipwhite(lhs.lhs_end + 1);
}
// For "[var, var] = expr" drop the "expr" value.