parser: differentiate recursive alias & existing type err + rune fix
parent
7c8fa62cc2
commit
a7879ce77e
|
@ -2,7 +2,10 @@
|
||||||
// Use of this source code is governed by an MIT license that can be found in the LICENSE file.
|
// Use of this source code is governed by an MIT license that can be found in the LICENSE file.
|
||||||
module builtin
|
module builtin
|
||||||
|
|
||||||
type rune = int
|
// This was never working correctly, the issue is now
|
||||||
|
// fixed however the type checks in checker need to be
|
||||||
|
// updated. if you uncomment it you will see the issue
|
||||||
|
// type rune = int
|
||||||
|
|
||||||
pub fn (c rune) str() string {
|
pub fn (c rune) str() string {
|
||||||
return utf32_to_str(u32(c))
|
return utf32_to_str(u32(c))
|
||||||
|
|
|
@ -2064,34 +2064,31 @@ fn (mut p Parser) type_decl() ast.TypeDecl {
|
||||||
}
|
}
|
||||||
// type MyType = int
|
// type MyType = int
|
||||||
parent_type := first_type
|
parent_type := first_type
|
||||||
parent_name := p.table.get_type_symbol(parent_type).name
|
parent_sym := p.table.get_type_symbol(parent_type)
|
||||||
pid := parent_type.idx()
|
pidx := parent_type.idx()
|
||||||
mut language := table.Language.v
|
p.check_for_impure_v(parent_sym.language, decl_pos)
|
||||||
if parent_name.len > 2 && parent_name.starts_with('C.') {
|
|
||||||
language = table.Language.c
|
|
||||||
p.check_for_impure_v(language, decl_pos)
|
|
||||||
} else if parent_name.len > 2 && parent_name.starts_with('JS.') {
|
|
||||||
language = table.Language.js
|
|
||||||
p.check_for_impure_v(language, decl_pos)
|
|
||||||
}
|
|
||||||
prepend_mod_name := p.prepend_mod(name)
|
prepend_mod_name := p.prepend_mod(name)
|
||||||
p.table.register_type_symbol(table.TypeSymbol{
|
idx := p.table.register_type_symbol(table.TypeSymbol{
|
||||||
kind: .alias
|
kind: .alias
|
||||||
name: prepend_mod_name
|
name: prepend_mod_name
|
||||||
cname: util.no_dots(prepend_mod_name)
|
cname: util.no_dots(prepend_mod_name)
|
||||||
mod: p.mod
|
mod: p.mod
|
||||||
parent_idx: pid
|
parent_idx: pidx
|
||||||
info: table.Alias{
|
info: table.Alias{
|
||||||
parent_type: parent_type
|
parent_type: parent_type
|
||||||
language: language
|
language: parent_sym.language
|
||||||
}
|
}
|
||||||
is_public: is_pub
|
is_public: is_pub
|
||||||
})
|
})
|
||||||
comments = p.eat_line_end_comments()
|
if idx == -1 {
|
||||||
if prepend_mod_name == parent_name {
|
p.error_with_pos('cannot register alias `$name`, another type with this name exists', decl_pos.extend(type_alias_pos))
|
||||||
|
return ast.AliasTypeDecl{}
|
||||||
|
}
|
||||||
|
if idx == pidx {
|
||||||
p.error_with_pos('a type alias can not refer to itself: $name', decl_pos.extend(type_alias_pos))
|
p.error_with_pos('a type alias can not refer to itself: $name', decl_pos.extend(type_alias_pos))
|
||||||
return ast.AliasTypeDecl{}
|
return ast.AliasTypeDecl{}
|
||||||
}
|
}
|
||||||
|
comments = p.eat_line_end_comments()
|
||||||
return ast.AliasTypeDecl{
|
return ast.AliasTypeDecl{
|
||||||
name: name
|
name: name
|
||||||
is_pub: is_pub
|
is_pub: is_pub
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
vlib/v/parser/tests/type_alias_existing_type_err.vv:3:1: error: cannot register alias `Foo`, another type with this name exists
|
||||||
|
1 | struct Foo{}
|
||||||
|
2 |
|
||||||
|
3 | type Foo = Foo
|
||||||
|
| ~~~~~~~~~~~~~~
|
||||||
|
4 |
|
||||||
|
5 | fn main() {
|
|
@ -0,0 +1,7 @@
|
||||||
|
struct Foo{}
|
||||||
|
|
||||||
|
type Foo = Foo
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
|
||||||
|
}
|
|
@ -1,7 +1,5 @@
|
||||||
vlib/v/parser/tests/type_alias_same_type_err.vv:3:1: error: a type alias can not refer to itself: Foo
|
vlib/v/parser/tests/type_alias_same_type_err.vv:1:1: error: a type alias can not refer to itself: Foo
|
||||||
1 | struct Foo{}
|
1 | type Foo = Foo
|
||||||
2 |
|
|
||||||
3 | type Foo = Foo
|
|
||||||
| ~~~~~~~~~~~~~~
|
| ~~~~~~~~~~~~~~
|
||||||
4 |
|
2 |
|
||||||
5 | fn main() {
|
3 | fn main() {
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
struct Foo{}
|
|
||||||
|
|
||||||
type Foo = Foo
|
type Foo = Foo
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -309,11 +309,11 @@ pub const (
|
||||||
none_type_idx = 17
|
none_type_idx = 17
|
||||||
string_type_idx = 18
|
string_type_idx = 18
|
||||||
ustring_type_idx = 19
|
ustring_type_idx = 19
|
||||||
array_type_idx = 20
|
rune_type_idx = 20
|
||||||
map_type_idx = 21
|
array_type_idx = 21
|
||||||
chan_type_idx = 22
|
map_type_idx = 22
|
||||||
sizet_type_idx = 23
|
chan_type_idx = 23
|
||||||
rune_type_idx = 24
|
sizet_type_idx = 24
|
||||||
any_type_idx = 25
|
any_type_idx = 25
|
||||||
any_flt_type_idx = 26
|
any_flt_type_idx = 26
|
||||||
any_int_type_idx = 27
|
any_int_type_idx = 27
|
||||||
|
@ -353,10 +353,10 @@ pub const (
|
||||||
none_type = new_type(none_type_idx)
|
none_type = new_type(none_type_idx)
|
||||||
string_type = new_type(string_type_idx)
|
string_type = new_type(string_type_idx)
|
||||||
ustring_type = new_type(ustring_type_idx)
|
ustring_type = new_type(ustring_type_idx)
|
||||||
|
rune_type = new_type(rune_type_idx)
|
||||||
array_type = new_type(array_type_idx)
|
array_type = new_type(array_type_idx)
|
||||||
map_type = new_type(map_type_idx)
|
map_type = new_type(map_type_idx)
|
||||||
chan_type = new_type(chan_type_idx)
|
chan_type = new_type(chan_type_idx)
|
||||||
rune_type = new_type(rune_type_idx)
|
|
||||||
any_type = new_type(any_type_idx)
|
any_type = new_type(any_type_idx)
|
||||||
any_flt_type = new_type(any_flt_type_idx)
|
any_flt_type = new_type(any_flt_type_idx)
|
||||||
any_int_type = new_type(any_int_type_idx)
|
any_int_type = new_type(any_int_type_idx)
|
||||||
|
@ -517,11 +517,11 @@ pub fn (mut t Table) register_builtin_type_symbols() {
|
||||||
t.register_type_symbol(kind: .none_, name: 'none', cname: 'none', mod: 'builtin')
|
t.register_type_symbol(kind: .none_, name: 'none', cname: 'none', mod: 'builtin')
|
||||||
t.register_type_symbol(kind: .string, name: 'string', cname: 'string', mod: 'builtin')
|
t.register_type_symbol(kind: .string, name: 'string', cname: 'string', mod: 'builtin')
|
||||||
t.register_type_symbol(kind: .ustring, name: 'ustring', cname: 'ustring', mod: 'builtin')
|
t.register_type_symbol(kind: .ustring, name: 'ustring', cname: 'ustring', mod: 'builtin')
|
||||||
|
t.register_type_symbol(kind: .rune, name: 'rune', cname: 'rune', mod: 'builtin')
|
||||||
t.register_type_symbol(kind: .array, name: 'array', cname: 'array', mod: 'builtin')
|
t.register_type_symbol(kind: .array, name: 'array', cname: 'array', mod: 'builtin')
|
||||||
t.register_type_symbol(kind: .map, name: 'map', cname: 'map', mod: 'builtin')
|
t.register_type_symbol(kind: .map, name: 'map', cname: 'map', mod: 'builtin')
|
||||||
t.register_type_symbol(kind: .chan, name: 'chan', cname: 'chan', mod: 'builtin')
|
t.register_type_symbol(kind: .chan, name: 'chan', cname: 'chan', mod: 'builtin')
|
||||||
t.register_type_symbol(kind: .size_t, name: 'size_t', cname: 'size_t', mod: 'builtin')
|
t.register_type_symbol(kind: .size_t, name: 'size_t', cname: 'size_t', mod: 'builtin')
|
||||||
t.register_type_symbol(kind: .rune, name: 'rune', cname: 'rune', mod: 'builtin')
|
|
||||||
t.register_type_symbol(kind: .any, name: 'any', cname: 'any', mod: 'builtin')
|
t.register_type_symbol(kind: .any, name: 'any', cname: 'any', mod: 'builtin')
|
||||||
t.register_type_symbol(
|
t.register_type_symbol(
|
||||||
kind: .any_float
|
kind: .any_float
|
||||||
|
|
Loading…
Reference in New Issue