patch 9.0.2184: Vim9: inconsistent :type/:class messages
Problem: Vim9: inconsistent :type/:class messages Solution: Update the Messages (Ernie Rael) closes: #13706 Signed-off-by: Ernie Rael <errael@raelity.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
18ab6c3392
commit
e75fde6b04
23
src/eval.c
23
src/eval.c
@ -1890,10 +1890,8 @@ set_var_lval(
|
|||||||
if (eval_variable(lp->ll_name, (int)STRLEN(lp->ll_name),
|
if (eval_variable(lp->ll_name, (int)STRLEN(lp->ll_name),
|
||||||
lp->ll_sid, &tv, &di, EVAL_VAR_VERBOSE) == OK)
|
lp->ll_sid, &tv, &di, EVAL_VAR_VERBOSE) == OK)
|
||||||
{
|
{
|
||||||
if (di != NULL && di->di_tv.v_type == VAR_TYPEALIAS)
|
if (di != NULL && check_typval_is_value(&di->di_tv) == FAIL)
|
||||||
{
|
{
|
||||||
semsg(_(e_cannot_modify_typealias),
|
|
||||||
di->di_tv.vval.v_typealias->ta_name);
|
|
||||||
clear_tv(&tv);
|
clear_tv(&tv);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2007,9 +2005,10 @@ tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
|
|||||||
char_u *s;
|
char_u *s;
|
||||||
int failed = FALSE;
|
int failed = FALSE;
|
||||||
|
|
||||||
// Can't do anything with a Funcref or Dict on the right.
|
// Can't do anything with a Funcref or Dict or Type on the right.
|
||||||
// v:true and friends only work with "..=".
|
// v:true and friends only work with "..=".
|
||||||
if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT
|
if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT
|
||||||
|
&& tv2->v_type != VAR_CLASS && tv2->v_type != VAR_TYPEALIAS
|
||||||
&& ((tv2->v_type != VAR_BOOL && tv2->v_type != VAR_SPECIAL)
|
&& ((tv2->v_type != VAR_BOOL && tv2->v_type != VAR_SPECIAL)
|
||||||
|| *op == '.'))
|
|| *op == '.'))
|
||||||
{
|
{
|
||||||
@ -2026,10 +2025,12 @@ tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
|
|||||||
case VAR_JOB:
|
case VAR_JOB:
|
||||||
case VAR_CHANNEL:
|
case VAR_CHANNEL:
|
||||||
case VAR_INSTR:
|
case VAR_INSTR:
|
||||||
case VAR_CLASS:
|
|
||||||
case VAR_OBJECT:
|
case VAR_OBJECT:
|
||||||
case VAR_TYPEALIAS:
|
|
||||||
break;
|
break;
|
||||||
|
case VAR_CLASS:
|
||||||
|
case VAR_TYPEALIAS:
|
||||||
|
check_typval_is_value(tv1);
|
||||||
|
return FAIL;
|
||||||
|
|
||||||
case VAR_BLOB:
|
case VAR_BLOB:
|
||||||
if (*op != '+' || tv2->v_type != VAR_BLOB)
|
if (*op != '+' || tv2->v_type != VAR_BLOB)
|
||||||
@ -2142,7 +2143,8 @@ tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
semsg(_(e_wrong_variable_type_for_str_equal), op);
|
if (check_typval_is_value(tv2) == OK)
|
||||||
|
semsg(_(e_wrong_variable_type_for_str_equal), op);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5019,12 +5021,15 @@ check_can_index(typval_T *rettv, int evaluate, int verbose)
|
|||||||
case VAR_JOB:
|
case VAR_JOB:
|
||||||
case VAR_CHANNEL:
|
case VAR_CHANNEL:
|
||||||
case VAR_INSTR:
|
case VAR_INSTR:
|
||||||
case VAR_CLASS:
|
|
||||||
case VAR_OBJECT:
|
case VAR_OBJECT:
|
||||||
case VAR_TYPEALIAS:
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
emsg(_(e_cannot_index_special_variable));
|
emsg(_(e_cannot_index_special_variable));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
case VAR_CLASS:
|
||||||
|
case VAR_TYPEALIAS:
|
||||||
|
if (verbose)
|
||||||
|
check_typval_is_value(rettv);
|
||||||
|
return FAIL;
|
||||||
case VAR_UNKNOWN:
|
case VAR_UNKNOWN:
|
||||||
case VAR_ANY:
|
case VAR_ANY:
|
||||||
case VAR_VOID:
|
case VAR_VOID:
|
||||||
|
|||||||
@ -3974,12 +3974,8 @@ set_var_const(
|
|||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (di->di_tv.v_type == VAR_TYPEALIAS)
|
if (check_typval_is_value(&di->di_tv) == FAIL)
|
||||||
{
|
|
||||||
semsg(_(e_cannot_modify_typealias),
|
|
||||||
di->di_tv.vval.v_typealias->ta_name);
|
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
|
||||||
|
|
||||||
if (var_in_vim9script && (flags & ASSIGN_FOR_LOOP) == 0)
|
if (var_in_vim9script && (flags & ASSIGN_FOR_LOOP) == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -3090,18 +3090,18 @@ def Test_type_check()
|
|||||||
assert_fails('l = N', 'E1012: Type mismatch; expected list<number> but got number')
|
assert_fails('l = N', 'E1012: Type mismatch; expected list<number> but got number')
|
||||||
assert_fails('b = N', 'E1012: Type mismatch; expected blob but got number')
|
assert_fails('b = N', 'E1012: Type mismatch; expected blob but got number')
|
||||||
assert_fails('Fn = N', 'E1012: Type mismatch; expected func(...): unknown but got number')
|
assert_fails('Fn = N', 'E1012: Type mismatch; expected func(...): unknown but got number')
|
||||||
assert_fails('A = N', 'E1012: Type mismatch; expected class<A> but got number')
|
assert_fails('A = N', 'E1405: Class "A" cannot be used as a value')
|
||||||
assert_fails('o = N', 'E1012: Type mismatch; expected object<A> but got number')
|
assert_fails('o = N', 'E1012: Type mismatch; expected object<A> but got number')
|
||||||
assert_fails('T = N', 'E1395: Type alias "T" cannot be modified')
|
assert_fails('T = N', 'E1403: Type alias "T" cannot be used as a value')
|
||||||
|
|
||||||
# Use a compound operator with different LHS types
|
# Use a compound operator with different LHS types
|
||||||
assert_fails('d += N', 'E734: Wrong variable type for +=')
|
assert_fails('d += N', 'E734: Wrong variable type for +=')
|
||||||
assert_fails('l += N', 'E734: Wrong variable type for +=')
|
assert_fails('l += N', 'E734: Wrong variable type for +=')
|
||||||
assert_fails('b += N', 'E734: Wrong variable type for +=')
|
assert_fails('b += N', 'E734: Wrong variable type for +=')
|
||||||
assert_fails('Fn += N', 'E734: Wrong variable type for +=')
|
assert_fails('Fn += N', 'E734: Wrong variable type for +=')
|
||||||
assert_fails('A += N', 'E734: Wrong variable type for +=')
|
assert_fails('A += N', 'E1405: Class "A" cannot be used as a value')
|
||||||
assert_fails('o += N', 'E734: Wrong variable type for +=')
|
assert_fails('o += N', 'E734: Wrong variable type for +=')
|
||||||
assert_fails('T += N', 'E1395: Type alias "T" cannot be modified')
|
assert_fails('T += N', 'E1403: Type alias "T" cannot be used as a value')
|
||||||
|
|
||||||
# Assign to a number variable
|
# Assign to a number variable
|
||||||
assert_fails('N = d', 'E1012: Type mismatch; expected number but got dict<number>')
|
assert_fails('N = d', 'E1012: Type mismatch; expected number but got dict<number>')
|
||||||
@ -3144,9 +3144,9 @@ def Test_type_check()
|
|||||||
assert_fails('l ..= S', 'E734: Wrong variable type for .=')
|
assert_fails('l ..= S', 'E734: Wrong variable type for .=')
|
||||||
assert_fails('b ..= S', 'E734: Wrong variable type for .=')
|
assert_fails('b ..= S', 'E734: Wrong variable type for .=')
|
||||||
assert_fails('Fn ..= S', 'E734: Wrong variable type for .=')
|
assert_fails('Fn ..= S', 'E734: Wrong variable type for .=')
|
||||||
assert_fails('A ..= S', 'E734: Wrong variable type for .=')
|
assert_fails('A ..= S', 'E1405: Class "A" cannot be used as a value')
|
||||||
assert_fails('o ..= S', 'E734: Wrong variable type for .=')
|
assert_fails('o ..= S', 'E734: Wrong variable type for .=')
|
||||||
assert_fails('T ..= S', 'E1395: Type alias "T" cannot be modified')
|
assert_fails('T ..= S', 'E1403: Type alias "T" cannot be used as a value')
|
||||||
END
|
END
|
||||||
v9.CheckSourceSuccess(lines)
|
v9.CheckSourceSuccess(lines)
|
||||||
|
|
||||||
|
|||||||
@ -242,7 +242,7 @@ def Test_class_basic()
|
|||||||
if A
|
if A
|
||||||
endif
|
endif
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1319: Using a Class as a Number', 4)
|
v9.CheckSourceFailure(lines, 'E1405: Class "A" cannot be used as a value', 4)
|
||||||
|
|
||||||
# Test for using object as a bool
|
# Test for using object as a bool
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@ -281,7 +281,7 @@ def Test_class_basic()
|
|||||||
endclass
|
endclass
|
||||||
:exe 'call ' .. A
|
:exe 'call ' .. A
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1323: Using a Class as a String', 4)
|
v9.CheckSourceFailure(lines, 'E1405: Class "A" cannot be used as a value', 4)
|
||||||
|
|
||||||
# Test for using object as a string
|
# Test for using object as a string
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
|
|||||||
@ -3193,7 +3193,7 @@ def Test_disassemble_ifargnotset()
|
|||||||
unlet g:instr
|
unlet g:instr
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
" Disassemble instructions for ISN_COMPARECLASS and ISN_COMPAREOBJECT
|
" Disassemble instructions for ISN_COMPAREOBJECT
|
||||||
def Test_disassemble_compare_class_object()
|
def Test_disassemble_compare_class_object()
|
||||||
var lines =<< trim END
|
var lines =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
@ -3202,8 +3202,6 @@ def Test_disassemble_compare_class_object()
|
|||||||
class B
|
class B
|
||||||
endclass
|
endclass
|
||||||
def Foo(a: A, b: B)
|
def Foo(a: A, b: B)
|
||||||
if A == B
|
|
||||||
endif
|
|
||||||
if a == b
|
if a == b
|
||||||
endif
|
endif
|
||||||
enddef
|
enddef
|
||||||
@ -3211,19 +3209,13 @@ def Test_disassemble_compare_class_object()
|
|||||||
END
|
END
|
||||||
v9.CheckScriptSuccess(lines)
|
v9.CheckScriptSuccess(lines)
|
||||||
assert_match('<SNR>\d*_Foo\_s*' ..
|
assert_match('<SNR>\d*_Foo\_s*' ..
|
||||||
'if A == B\_s*' ..
|
'if a == b\_s*' ..
|
||||||
'0 LOADSCRIPT A-0 from .*\_s*' ..
|
'0 LOAD arg\[-2\]\_s*' ..
|
||||||
'1 LOADSCRIPT B-1 from .*\_s*' ..
|
'1 LOAD arg\[-1\]\_s*' ..
|
||||||
'2 COMPARECLASS ==\_s*' ..
|
'2 COMPAREOBJECT ==\_s*' ..
|
||||||
'3 JUMP_IF_FALSE -> 4\_s*' ..
|
'3 JUMP_IF_FALSE -> 4\_s*' ..
|
||||||
'endif\_s*' ..
|
'endif\_s*' ..
|
||||||
'if a == b\_s*' ..
|
'4 RETURN void', g:instr)
|
||||||
'4 LOAD arg\[-2\]\_s*' ..
|
|
||||||
'5 LOAD arg\[-1\]\_s*' ..
|
|
||||||
'6 COMPAREOBJECT ==\_s*' ..
|
|
||||||
'7 JUMP_IF_FALSE -> 8\_s*' ..
|
|
||||||
'endif\_s*' ..
|
|
||||||
'8 RETURN void', g:instr)
|
|
||||||
unlet g:instr
|
unlet g:instr
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@ def Test_typealias()
|
|||||||
assert_equal('typealias<list<string>>', typename(ListOfStrings))
|
assert_equal('typealias<list<string>>', typename(ListOfStrings))
|
||||||
assert_equal(v:t_typealias, type(ListOfStrings))
|
assert_equal(v:t_typealias, type(ListOfStrings))
|
||||||
assert_equal('ListOfStrings', string(ListOfStrings))
|
assert_equal('ListOfStrings', string(ListOfStrings))
|
||||||
assert_equal(false, null == ListOfStrings)
|
assert_fails('var x = null == ListOfStrings', 'E1403: Type alias "ListOfStrings" cannot be used as a value')
|
||||||
END
|
END
|
||||||
v9.CheckSourceSuccess(lines)
|
v9.CheckSourceSuccess(lines)
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ def Test_typealias()
|
|||||||
assert_equal('typealias<list<string>>', typename(ListOfStrings))
|
assert_equal('typealias<list<string>>', typename(ListOfStrings))
|
||||||
assert_equal(v:t_typealias, type(ListOfStrings))
|
assert_equal(v:t_typealias, type(ListOfStrings))
|
||||||
assert_equal('ListOfStrings', string(ListOfStrings))
|
assert_equal('ListOfStrings', string(ListOfStrings))
|
||||||
assert_equal(false, null == ListOfStrings)
|
#assert_equal(false, null == ListOfStrings)
|
||||||
enddef
|
enddef
|
||||||
Bar()
|
Bar()
|
||||||
END
|
END
|
||||||
@ -201,7 +201,7 @@ def Test_typealias()
|
|||||||
type MyType = list<number>
|
type MyType = list<number>
|
||||||
MyType = [1, 2, 3]
|
MyType = [1, 2, 3]
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1395: Type alias "MyType" cannot be modified', 3)
|
v9.CheckSourceFailure(lines, 'E1403: Type alias "MyType" cannot be used as a value', 3)
|
||||||
|
|
||||||
# Assigning a type alias (def function level)
|
# Assigning a type alias (def function level)
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@ -219,11 +219,11 @@ def Test_typealias()
|
|||||||
vim9script
|
vim9script
|
||||||
type MyType = list<number>
|
type MyType = list<number>
|
||||||
assert_fails('var m = MyType', 'E1403: Type alias "MyType" cannot be used as a value')
|
assert_fails('var m = MyType', 'E1403: Type alias "MyType" cannot be used as a value')
|
||||||
assert_fails('var i = MyType + 1', 'E1400: Using type alias "MyType" as a Number')
|
assert_fails('var i = MyType + 1', 'E1403: Type alias "MyType" cannot be used as a value')
|
||||||
assert_fails('var f = 1.0 + MyType', 'E1400: Using type alias "MyType" as a Number')
|
assert_fails('var f = 1.0 + MyType', 'E1403: Type alias "MyType" cannot be used as a value')
|
||||||
assert_fails('MyType += 10', 'E1395: Type alias "MyType" cannot be modified')
|
assert_fails('MyType += 10', 'E1403: Type alias "MyType" cannot be used as a value')
|
||||||
assert_fails('var x = $"-{MyType}-"', 'E1402: Using type alias "MyType" as a String')
|
assert_fails('var x = $"-{MyType}-"', 'E1403: Type alias "MyType" cannot be used as a value')
|
||||||
assert_fails('var x = MyType[1]', 'E909: Cannot index a special variable')
|
assert_fails('var x = MyType[1]', 'E1403: Type alias "MyType" cannot be used as a value')
|
||||||
END
|
END
|
||||||
v9.CheckSourceSuccess(lines)
|
v9.CheckSourceSuccess(lines)
|
||||||
|
|
||||||
@ -236,7 +236,7 @@ def Test_typealias()
|
|||||||
enddef
|
enddef
|
||||||
Foo()
|
Foo()
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1051: Wrong argument type for +', 1)
|
v9.CheckSourceFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 1)
|
||||||
|
|
||||||
# Using type alias in an expression (def function level)
|
# Using type alias in an expression (def function level)
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@ -305,7 +305,7 @@ def Test_typealias()
|
|||||||
var n: number
|
var n: number
|
||||||
var x = A == n
|
var x = A == n
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1072: Cannot compare typealias with number', 4)
|
v9.CheckSourceFailure(lines, 'E1403: Type alias "A" cannot be used as a value', 4)
|
||||||
|
|
||||||
# Comparing type alias with a number (def function level)
|
# Comparing type alias with a number (def function level)
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@ -317,7 +317,7 @@ def Test_typealias()
|
|||||||
enddef
|
enddef
|
||||||
Foo()
|
Foo()
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1072: Cannot compare typealias with number', 2)
|
v9.CheckSourceFailure(lines, 'E1407: Cannot use a Typealias as a variable or value', 2)
|
||||||
|
|
||||||
# casting a number to a type alias (script level)
|
# casting a number to a type alias (script level)
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
|
|||||||
38
src/typval.c
38
src/typval.c
@ -262,7 +262,8 @@ tv_get_bool_or_number_chk(
|
|||||||
emsg(_(e_using_blob_as_number));
|
emsg(_(e_using_blob_as_number));
|
||||||
break;
|
break;
|
||||||
case VAR_CLASS:
|
case VAR_CLASS:
|
||||||
emsg(_(e_using_class_as_number));
|
case VAR_TYPEALIAS:
|
||||||
|
check_typval_is_value(varp);
|
||||||
break;
|
break;
|
||||||
case VAR_OBJECT:
|
case VAR_OBJECT:
|
||||||
emsg(_(e_using_object_as_number));
|
emsg(_(e_using_object_as_number));
|
||||||
@ -270,10 +271,6 @@ tv_get_bool_or_number_chk(
|
|||||||
case VAR_VOID:
|
case VAR_VOID:
|
||||||
emsg(_(e_cannot_use_void_value));
|
emsg(_(e_cannot_use_void_value));
|
||||||
break;
|
break;
|
||||||
case VAR_TYPEALIAS:
|
|
||||||
semsg(_(e_using_typealias_as_number),
|
|
||||||
varp->vval.v_typealias->ta_name);
|
|
||||||
break;
|
|
||||||
case VAR_UNKNOWN:
|
case VAR_UNKNOWN:
|
||||||
case VAR_ANY:
|
case VAR_ANY:
|
||||||
case VAR_INSTR:
|
case VAR_INSTR:
|
||||||
@ -383,7 +380,8 @@ tv_get_float_chk(typval_T *varp, int *error)
|
|||||||
emsg(_(e_using_blob_as_float));
|
emsg(_(e_using_blob_as_float));
|
||||||
break;
|
break;
|
||||||
case VAR_CLASS:
|
case VAR_CLASS:
|
||||||
emsg(_(e_using_class_as_float));
|
case VAR_TYPEALIAS:
|
||||||
|
check_typval_is_value(varp);
|
||||||
break;
|
break;
|
||||||
case VAR_OBJECT:
|
case VAR_OBJECT:
|
||||||
emsg(_(e_using_object_as_float));
|
emsg(_(e_using_object_as_float));
|
||||||
@ -391,10 +389,6 @@ tv_get_float_chk(typval_T *varp, int *error)
|
|||||||
case VAR_VOID:
|
case VAR_VOID:
|
||||||
emsg(_(e_cannot_use_void_value));
|
emsg(_(e_cannot_use_void_value));
|
||||||
break;
|
break;
|
||||||
case VAR_TYPEALIAS:
|
|
||||||
semsg(_(e_using_typealias_as_float),
|
|
||||||
varp->vval.v_typealias->ta_name);
|
|
||||||
break;
|
|
||||||
case VAR_UNKNOWN:
|
case VAR_UNKNOWN:
|
||||||
case VAR_ANY:
|
case VAR_ANY:
|
||||||
case VAR_INSTR:
|
case VAR_INSTR:
|
||||||
@ -1131,7 +1125,8 @@ tv_get_string_buf_chk_strict(typval_T *varp, char_u *buf, int strict)
|
|||||||
emsg(_(e_using_blob_as_string));
|
emsg(_(e_using_blob_as_string));
|
||||||
break;
|
break;
|
||||||
case VAR_CLASS:
|
case VAR_CLASS:
|
||||||
emsg(_(e_using_class_as_string));
|
case VAR_TYPEALIAS:
|
||||||
|
check_typval_is_value(varp);
|
||||||
break;
|
break;
|
||||||
case VAR_OBJECT:
|
case VAR_OBJECT:
|
||||||
emsg(_(e_using_object_as_string));
|
emsg(_(e_using_object_as_string));
|
||||||
@ -1159,10 +1154,6 @@ tv_get_string_buf_chk_strict(typval_T *varp, char_u *buf, int strict)
|
|||||||
case VAR_VOID:
|
case VAR_VOID:
|
||||||
emsg(_(e_cannot_use_void_value));
|
emsg(_(e_cannot_use_void_value));
|
||||||
break;
|
break;
|
||||||
case VAR_TYPEALIAS:
|
|
||||||
semsg(_(e_using_typealias_as_string),
|
|
||||||
varp->vval.v_typealias->ta_name);
|
|
||||||
break;
|
|
||||||
case VAR_UNKNOWN:
|
case VAR_UNKNOWN:
|
||||||
case VAR_ANY:
|
case VAR_ANY:
|
||||||
case VAR_INSTR:
|
case VAR_INSTR:
|
||||||
@ -1358,7 +1349,13 @@ typval_compare(
|
|||||||
int res = 0;
|
int res = 0;
|
||||||
int type_is = type == EXPR_IS || type == EXPR_ISNOT;
|
int type_is = type == EXPR_IS || type == EXPR_ISNOT;
|
||||||
|
|
||||||
if (type_is && tv1->v_type != tv2->v_type)
|
if (check_typval_is_value(tv1) == FAIL
|
||||||
|
|| check_typval_is_value(tv2) == FAIL)
|
||||||
|
{
|
||||||
|
clear_tv(tv1);
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
else if (type_is && tv1->v_type != tv2->v_type)
|
||||||
{
|
{
|
||||||
// For "is" a different type always means FALSE, for "isnot"
|
// For "is" a different type always means FALSE, for "isnot"
|
||||||
// it means TRUE.
|
// it means TRUE.
|
||||||
@ -1397,15 +1394,6 @@ typval_compare(
|
|||||||
}
|
}
|
||||||
n1 = res;
|
n1 = res;
|
||||||
}
|
}
|
||||||
else if (tv1->v_type == VAR_CLASS || tv2->v_type == VAR_CLASS)
|
|
||||||
{
|
|
||||||
if (typval_compare_class(tv1, tv2, type, ic, &res) == FAIL)
|
|
||||||
{
|
|
||||||
clear_tv(tv1);
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
n1 = res;
|
|
||||||
}
|
|
||||||
else if (tv1->v_type == VAR_OBJECT || tv2->v_type == VAR_OBJECT)
|
else if (tv1->v_type == VAR_OBJECT || tv2->v_type == VAR_OBJECT)
|
||||||
{
|
{
|
||||||
if (typval_compare_object(tv1, tv2, type, ic, &res) == FAIL)
|
if (typval_compare_object(tv1, tv2, type, ic, &res) == FAIL)
|
||||||
|
|||||||
@ -704,6 +704,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2184,
|
||||||
/**/
|
/**/
|
||||||
2183,
|
2183,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
@ -168,7 +168,6 @@ typedef enum {
|
|||||||
ISN_COMPAREDICT,
|
ISN_COMPAREDICT,
|
||||||
ISN_COMPAREFUNC,
|
ISN_COMPAREFUNC,
|
||||||
ISN_COMPAREANY,
|
ISN_COMPAREANY,
|
||||||
ISN_COMPARECLASS,
|
|
||||||
ISN_COMPAREOBJECT,
|
ISN_COMPAREOBJECT,
|
||||||
|
|
||||||
// expression operations
|
// expression operations
|
||||||
|
|||||||
@ -550,6 +550,12 @@ need_type_where(
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (expected->tt_type != VAR_CLASS && expected->tt_type != VAR_TYPEALIAS)
|
||||||
|
{
|
||||||
|
if (check_type_is_value(actual) == FAIL)
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
if (expected == &t_bool && actual != &t_bool
|
if (expected == &t_bool && actual != &t_bool
|
||||||
&& (actual->tt_flags & TTFLAG_BOOL_OK))
|
&& (actual->tt_flags & TTFLAG_BOOL_OK))
|
||||||
{
|
{
|
||||||
|
|||||||
@ -5034,7 +5034,6 @@ exec_instructions(ectx_T *ectx)
|
|||||||
case ISN_COMPAREFUNC:
|
case ISN_COMPAREFUNC:
|
||||||
case ISN_COMPARESTRING:
|
case ISN_COMPARESTRING:
|
||||||
case ISN_COMPAREBLOB:
|
case ISN_COMPAREBLOB:
|
||||||
case ISN_COMPARECLASS:
|
|
||||||
case ISN_COMPAREOBJECT:
|
case ISN_COMPAREOBJECT:
|
||||||
{
|
{
|
||||||
typval_T *tv1 = STACK_TV_BOT(-2);
|
typval_T *tv1 = STACK_TV_BOT(-2);
|
||||||
@ -5069,11 +5068,6 @@ exec_instructions(ectx_T *ectx)
|
|||||||
{
|
{
|
||||||
status = typval_compare_blob(tv1, tv2, exprtype, &res);
|
status = typval_compare_blob(tv1, tv2, exprtype, &res);
|
||||||
}
|
}
|
||||||
else if (iptr->isn_type == ISN_COMPARECLASS)
|
|
||||||
{
|
|
||||||
status = typval_compare_class(tv1, tv2,
|
|
||||||
exprtype, FALSE, &res);
|
|
||||||
}
|
|
||||||
else // ISN_COMPAREOBJECT
|
else // ISN_COMPAREOBJECT
|
||||||
{
|
{
|
||||||
status = typval_compare_object(tv1, tv2,
|
status = typval_compare_object(tv1, tv2,
|
||||||
@ -7206,7 +7200,6 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
|
|||||||
case ISN_COMPARELIST:
|
case ISN_COMPARELIST:
|
||||||
case ISN_COMPAREDICT:
|
case ISN_COMPAREDICT:
|
||||||
case ISN_COMPAREFUNC:
|
case ISN_COMPAREFUNC:
|
||||||
case ISN_COMPARECLASS:
|
|
||||||
case ISN_COMPAREOBJECT:
|
case ISN_COMPAREOBJECT:
|
||||||
case ISN_COMPAREANY:
|
case ISN_COMPAREANY:
|
||||||
{
|
{
|
||||||
@ -7245,7 +7238,6 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
|
|||||||
case ISN_COMPARELIST: type = "COMPARELIST"; break;
|
case ISN_COMPARELIST: type = "COMPARELIST"; break;
|
||||||
case ISN_COMPAREDICT: type = "COMPAREDICT"; break;
|
case ISN_COMPAREDICT: type = "COMPAREDICT"; break;
|
||||||
case ISN_COMPAREFUNC: type = "COMPAREFUNC"; break;
|
case ISN_COMPAREFUNC: type = "COMPAREFUNC"; break;
|
||||||
case ISN_COMPARECLASS: type = "COMPARECLASS"; break;
|
|
||||||
case ISN_COMPAREOBJECT:
|
case ISN_COMPAREOBJECT:
|
||||||
type = "COMPAREOBJECT"; break;
|
type = "COMPAREOBJECT"; break;
|
||||||
case ISN_COMPAREANY: type = "COMPAREANY"; break;
|
case ISN_COMPAREANY: type = "COMPAREANY"; break;
|
||||||
|
|||||||
@ -255,13 +255,18 @@ may_generate_2STRING(int offset, int tolerant, cctx_T *cctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
check_number_or_float(vartype_T type1, vartype_T type2, char_u *op)
|
check_number_or_float(type_T *typ1, type_T *typ2, char_u *op)
|
||||||
{
|
{
|
||||||
|
vartype_T type1 = typ1->tt_type;
|
||||||
|
vartype_T type2 = typ2->tt_type;
|
||||||
if (!((type1 == VAR_NUMBER || type1 == VAR_FLOAT
|
if (!((type1 == VAR_NUMBER || type1 == VAR_FLOAT
|
||||||
|| type1 == VAR_ANY || type1 == VAR_UNKNOWN)
|
|| type1 == VAR_ANY || type1 == VAR_UNKNOWN)
|
||||||
&& (type2 == VAR_NUMBER || type2 == VAR_FLOAT
|
&& (type2 == VAR_NUMBER || type2 == VAR_FLOAT
|
||||||
|| type2 == VAR_ANY || type2 == VAR_UNKNOWN)))
|
|| type2 == VAR_ANY || type2 == VAR_UNKNOWN)))
|
||||||
{
|
{
|
||||||
|
if (check_type_is_value(typ1) == FAIL
|
||||||
|
|| check_type_is_value(typ2) == FAIL)
|
||||||
|
return FAIL;
|
||||||
if (*op == '+')
|
if (*op == '+')
|
||||||
emsg(_(e_wrong_argument_type_for_plus));
|
emsg(_(e_wrong_argument_type_for_plus));
|
||||||
else
|
else
|
||||||
@ -294,8 +299,7 @@ generate_add_instr(
|
|||||||
&& type1->tt_type != VAR_UNKNOWN
|
&& type1->tt_type != VAR_UNKNOWN
|
||||||
&& type2->tt_type != VAR_ANY
|
&& type2->tt_type != VAR_ANY
|
||||||
&& type2->tt_type != VAR_UNKNOWN
|
&& type2->tt_type != VAR_UNKNOWN
|
||||||
&& check_number_or_float(
|
&& check_number_or_float(type1, type2, (char_u *)"+") == FAIL)
|
||||||
type1->tt_type, type2->tt_type, (char_u *)"+") == FAIL)
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
if (isn != NULL)
|
if (isn != NULL)
|
||||||
@ -362,8 +366,7 @@ generate_two_op(cctx_T *cctx, char_u *op)
|
|||||||
|
|
||||||
case '-':
|
case '-':
|
||||||
case '*':
|
case '*':
|
||||||
case '/': if (check_number_or_float(type1->tt_type, type2->tt_type,
|
case '/': if (check_number_or_float(type1, type2, op) == FAIL)
|
||||||
op) == FAIL)
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
if (vartype == VAR_NUMBER)
|
if (vartype == VAR_NUMBER)
|
||||||
isn = generate_instr_drop(cctx, ISN_OPNR, 1);
|
isn = generate_instr_drop(cctx, ISN_OPNR, 1);
|
||||||
@ -408,6 +411,19 @@ generate_two_op(cctx_T *cctx, char_u *op)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Choose correct error message for the specified type information.
|
||||||
|
*/
|
||||||
|
static isntype_T
|
||||||
|
compare_isn_not_values(typval_T *tv, type_T *type)
|
||||||
|
{
|
||||||
|
if (tv != NULL)
|
||||||
|
check_typval_is_value(tv);
|
||||||
|
else
|
||||||
|
check_type_is_value(type);
|
||||||
|
return ISN_DROP;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the instruction to use for comparing two values with specified types.
|
* Get the instruction to use for comparing two values with specified types.
|
||||||
* Either "tv1" and "tv2" are passed or "type1" and "type2".
|
* Either "tv1" and "tv2" are passed or "type1" and "type2".
|
||||||
@ -425,6 +441,11 @@ get_compare_isn(
|
|||||||
vartype_T vartype1 = tv1 != NULL ? tv1->v_type : type1->tt_type;
|
vartype_T vartype1 = tv1 != NULL ? tv1->v_type : type1->tt_type;
|
||||||
vartype_T vartype2 = tv2 != NULL ? tv2->v_type : type2->tt_type;
|
vartype_T vartype2 = tv2 != NULL ? tv2->v_type : type2->tt_type;
|
||||||
|
|
||||||
|
if (vartype1 == VAR_CLASS || vartype1 == VAR_TYPEALIAS)
|
||||||
|
return compare_isn_not_values(tv1, type1);
|
||||||
|
if (vartype2 == VAR_CLASS || vartype2 == VAR_TYPEALIAS)
|
||||||
|
return compare_isn_not_values(tv2, type2);
|
||||||
|
|
||||||
if (vartype1 == vartype2)
|
if (vartype1 == vartype2)
|
||||||
{
|
{
|
||||||
switch (vartype1)
|
switch (vartype1)
|
||||||
@ -438,7 +459,6 @@ get_compare_isn(
|
|||||||
case VAR_LIST: isntype = ISN_COMPARELIST; break;
|
case VAR_LIST: isntype = ISN_COMPARELIST; break;
|
||||||
case VAR_DICT: isntype = ISN_COMPAREDICT; break;
|
case VAR_DICT: isntype = ISN_COMPAREDICT; break;
|
||||||
case VAR_FUNC: isntype = ISN_COMPAREFUNC; break;
|
case VAR_FUNC: isntype = ISN_COMPAREFUNC; break;
|
||||||
case VAR_CLASS: isntype = ISN_COMPARECLASS; break;
|
|
||||||
case VAR_OBJECT: isntype = ISN_COMPAREOBJECT; break;
|
case VAR_OBJECT: isntype = ISN_COMPAREOBJECT; break;
|
||||||
default: isntype = ISN_COMPAREANY; break;
|
default: isntype = ISN_COMPAREANY; break;
|
||||||
}
|
}
|
||||||
@ -481,7 +501,7 @@ get_compare_isn(
|
|||||||
}
|
}
|
||||||
if (!(exprtype == EXPR_IS || exprtype == EXPR_ISNOT
|
if (!(exprtype == EXPR_IS || exprtype == EXPR_ISNOT
|
||||||
|| exprtype == EXPR_EQUAL || exprtype == EXPR_NEQUAL)
|
|| exprtype == EXPR_EQUAL || exprtype == EXPR_NEQUAL)
|
||||||
&& (isntype == ISN_COMPAREOBJECT || isntype == ISN_COMPARECLASS))
|
&& (isntype == ISN_COMPAREOBJECT))
|
||||||
{
|
{
|
||||||
semsg(_(e_invalid_operation_for_str), vartype_name(vartype1));
|
semsg(_(e_invalid_operation_for_str), vartype_name(vartype1));
|
||||||
return ISN_DROP;
|
return ISN_DROP;
|
||||||
@ -2700,7 +2720,6 @@ delete_instr(isn_T *isn)
|
|||||||
case ISN_COMPAREANY:
|
case ISN_COMPAREANY:
|
||||||
case ISN_COMPAREBLOB:
|
case ISN_COMPAREBLOB:
|
||||||
case ISN_COMPAREBOOL:
|
case ISN_COMPAREBOOL:
|
||||||
case ISN_COMPARECLASS:
|
|
||||||
case ISN_COMPAREDICT:
|
case ISN_COMPAREDICT:
|
||||||
case ISN_COMPAREFLOAT:
|
case ISN_COMPAREFLOAT:
|
||||||
case ISN_COMPAREFUNC:
|
case ISN_COMPAREFUNC:
|
||||||
|
|||||||
@ -1871,7 +1871,10 @@ check_typval_is_value(typval_T *tv)
|
|||||||
return OK;
|
return OK;
|
||||||
if (tv->v_type == VAR_CLASS)
|
if (tv->v_type == VAR_CLASS)
|
||||||
{
|
{
|
||||||
semsg(_(e_using_class_as_value_str), tv->vval.v_class->class_name);
|
if (tv->vval.v_class != NULL)
|
||||||
|
semsg(_(e_using_class_as_value_str), tv->vval.v_class->class_name);
|
||||||
|
else
|
||||||
|
emsg(e_using_class_as_var_val);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
else if (tv->v_type == VAR_TYPEALIAS)
|
else if (tv->v_type == VAR_TYPEALIAS)
|
||||||
|
|||||||
Reference in New Issue
Block a user