all: `!is` operator
parent
4e51867612
commit
fb3e52ca63
|
@ -546,7 +546,7 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
.right_shift {
|
||||
return c.check_shift(left_type, right_type, left_pos, right_pos)
|
||||
}
|
||||
.key_is {
|
||||
.key_is, .not_is {
|
||||
type_expr := infix_expr.right as ast.Type
|
||||
typ_sym := c.table.get_type_symbol(type_expr.typ)
|
||||
if typ_sym.kind == .placeholder {
|
||||
|
|
|
@ -180,10 +180,10 @@ pub fn (mut d Doc) generate() ?bool {
|
|||
// parse files
|
||||
mut file_asts := []ast.File{}
|
||||
// TODO: remove later for vlib
|
||||
comments_mode := if d.with_comments {
|
||||
scanner.CommentsMode.parse_comments
|
||||
} else {
|
||||
scanner.CommentsMode.skip_comments
|
||||
comments_mode := if d.with_comments {
|
||||
scanner.CommentsMode.parse_comments
|
||||
} else {
|
||||
scanner.CommentsMode.skip_comments
|
||||
}
|
||||
for file in v_files {
|
||||
file_ast := parser.parse_file(
|
||||
|
@ -222,13 +222,14 @@ pub fn (mut d Doc) generate() ?bool {
|
|||
for si, stmt in stmts {
|
||||
if stmt is ast.Comment { continue }
|
||||
|
||||
if !(stmt is ast.Module) {
|
||||
//if !(stmt is ast.Module) {
|
||||
if stmt !is ast.Module {
|
||||
// todo: accumulate consts
|
||||
mut name := d.get_name(stmt)
|
||||
signature := d.get_signature(stmt)
|
||||
pos := d.get_pos(stmt)
|
||||
|
||||
if !signature.starts_with('pub') && d.pub_only {
|
||||
if !signature.starts_with('pub') && d.pub_only {
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -268,7 +269,7 @@ pub fn (mut d Doc) generate() ?bool {
|
|||
last_comment := d.contents[d.contents.len-1].comment
|
||||
d.contents[d.contents.len-1].comment = last_comment + '\n' + write_comment_bw(stmts, si-1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -286,4 +287,4 @@ pub fn generate(input_path string, pub_only bool, with_comments bool) ?Doc {
|
|||
}
|
||||
|
||||
return doc
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1744,7 +1744,7 @@ fn (mut g Gen) infix_expr(node ast.InfixExpr) {
|
|||
// g.infix_op = node.op
|
||||
left_type := if node.left_type == table.t_type { g.cur_generic_type } else { node.left_type }
|
||||
left_sym := g.table.get_type_symbol(left_type)
|
||||
if node.op == .key_is {
|
||||
if node.op in [.key_is, .not_is] {
|
||||
g.is_expr(node)
|
||||
return
|
||||
}
|
||||
|
@ -3767,6 +3767,7 @@ fn (mut g Gen) as_cast(node ast.AsCast) {
|
|||
}
|
||||
|
||||
fn (mut g Gen) is_expr(node ast.InfixExpr) {
|
||||
eq := if node.op == .key_is { '==' } else { '!=' }
|
||||
g.expr(node.left)
|
||||
if node.left_type.is_ptr() {
|
||||
g.write('->')
|
||||
|
@ -3775,14 +3776,14 @@ fn (mut g Gen) is_expr(node ast.InfixExpr) {
|
|||
}
|
||||
sym := g.table.get_type_symbol(node.left_type)
|
||||
if sym.kind == .interface_ {
|
||||
g.write('_interface_idx == ')
|
||||
g.write('_interface_idx $eq ')
|
||||
// `_Animal_Dog_index`
|
||||
sub_type := node.right as ast.Type
|
||||
sub_sym := g.table.get_type_symbol(sub_type.typ)
|
||||
g.write('_${sym.name}_${sub_sym.name}_index')
|
||||
return
|
||||
} else if sym.kind == .sum_type {
|
||||
g.write('typ == ')
|
||||
g.write('typ $eq ')
|
||||
}
|
||||
g.expr(node.right)
|
||||
}
|
||||
|
|
|
@ -198,7 +198,7 @@ fn (mut p Parser) infix_expr(left ast.Expr) ast.Expr {
|
|||
pos := p.tok.position()
|
||||
p.next()
|
||||
mut right := ast.Expr{}
|
||||
if op == .key_is {
|
||||
if op in [.key_is, .not_is] {
|
||||
p.expecting_type = true
|
||||
}
|
||||
right = p.expr(precedence)
|
||||
|
|
|
@ -946,6 +946,11 @@ pub fn (mut s Scanner) scan() token.Token {
|
|||
s.pos += 2
|
||||
return s.new_token(.not_in, '', 3)
|
||||
}
|
||||
else if nextc == `i` && s.text[s.pos+2] == `s` && s.text[s.pos+3].is_space() {
|
||||
s.pos += 2
|
||||
return s.new_token(.not_is, '', 3)
|
||||
}
|
||||
//
|
||||
else {
|
||||
return s.new_token(.not, '', 1)
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ struct IntegerLiteral {
|
|||
fn handle(e Expr) string {
|
||||
is_literal := e is IntegerLiteral
|
||||
assert is_literal
|
||||
assert !(e !is IntegerLiteral)
|
||||
if e is IntegerLiteral {
|
||||
println('int')
|
||||
}
|
||||
|
@ -39,8 +40,8 @@ fn test_assignment_and_push() {
|
|||
mut expr1 := Expr{}
|
||||
mut arr1 := []Expr{}
|
||||
expr := IntegerLiteral{
|
||||
val: '111'
|
||||
}
|
||||
val: '111'
|
||||
}
|
||||
arr1 << expr
|
||||
match arr1[0] {
|
||||
IntegerLiteral {
|
||||
|
@ -54,24 +55,33 @@ fn test_assignment_and_push() {
|
|||
}
|
||||
|
||||
// Test moving structs between master/sub arrays
|
||||
|
||||
type Master = Sub1 | Sub2
|
||||
|
||||
struct Sub1 {
|
||||
mut:
|
||||
val int
|
||||
val int
|
||||
name string
|
||||
}
|
||||
|
||||
struct Sub2 {
|
||||
name string
|
||||
val int
|
||||
val int
|
||||
}
|
||||
|
||||
fn test_converting_down() {
|
||||
mut out := []Master{}
|
||||
out << Sub1 { val: 1, name: 'one' }
|
||||
out << Sub2 { val: 2, name: 'two'}
|
||||
out << Sub2 { val: 3, name: 'three'}
|
||||
|
||||
out << Sub1{
|
||||
val: 1
|
||||
name: 'one'
|
||||
}
|
||||
out << Sub2{
|
||||
val: 2
|
||||
name: 'two'
|
||||
}
|
||||
out << Sub2{
|
||||
val: 3
|
||||
name: 'three'
|
||||
}
|
||||
mut res := []Sub2{cap: out.len}
|
||||
for d in out {
|
||||
match d {
|
||||
|
@ -79,10 +89,8 @@ fn test_converting_down() {
|
|||
else {}
|
||||
}
|
||||
}
|
||||
|
||||
assert res[0].val == 2
|
||||
assert res[0].name == 'two'
|
||||
assert res[1].val == 3
|
||||
assert res[1].name == 'three'
|
||||
}
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@ pub enum Kind {
|
|||
left_shift
|
||||
right_shift
|
||||
not_in // !in
|
||||
not_is // !is
|
||||
// at // @
|
||||
assign // =
|
||||
decl_assign // :=
|
||||
|
@ -169,6 +170,7 @@ fn build_token_str() []string {
|
|||
s[Kind.ellipsis] = '...'
|
||||
s[Kind.comma] = ','
|
||||
s[Kind.not_in] = '!in'
|
||||
s[Kind.not_is] = '!is'
|
||||
// s[Kind.at] = '@'
|
||||
s[Kind.semicolon] = ';'
|
||||
s[Kind.colon] = ':'
|
||||
|
@ -382,7 +384,7 @@ pub fn (tok Token) precedence() int {
|
|||
.left_shift_assign, .right_shift_assign, .mult_assign, .xor_assign {
|
||||
return int(Precedence.assign)
|
||||
}
|
||||
.key_in, .not_in, .key_as, .key_is {
|
||||
.key_in, .not_in, .key_as, .key_is, .not_is {
|
||||
return int(Precedence.in_as)
|
||||
}
|
||||
.logical_or, .and {
|
||||
|
@ -422,7 +424,7 @@ pub fn (k Kind) is_start_of_type() bool {
|
|||
pub fn (kind Kind) is_infix() bool {
|
||||
return kind in [.plus, .minus, .mod, .mul, .div, .eq, .ne, .gt, .lt, .key_in,
|
||||
//
|
||||
.key_as, .ge, .le, .logical_or, .xor, .not_in, .key_is,
|
||||
.key_as, .ge, .le, .logical_or, .xor, .not_in, .key_is, .not_is,
|
||||
//
|
||||
.and, .dot, .pipe, .amp, .left_shift, .right_shift]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue