parser: allow embedding interfaces from other modules (#13385)
parent
1dc239227d
commit
10dcb2e0d9
|
@ -519,6 +519,32 @@ fn (mut p Parser) interface_decl() ast.InterfaceDecl {
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check embedded interface from external module
|
||||||
|
if p.tok.kind == .name && p.peek_tok.kind == .dot {
|
||||||
|
if p.tok.lit !in p.imports {
|
||||||
|
p.error_with_pos('mod `$p.tok.lit` not imported', p.tok.pos())
|
||||||
|
break
|
||||||
|
}
|
||||||
|
mod_name := p.tok.lit
|
||||||
|
from_mod_typ := p.parse_type()
|
||||||
|
from_mod_name := '${mod_name}.$p.prev_tok.lit'
|
||||||
|
if from_mod_name.is_lower() {
|
||||||
|
p.error_with_pos('The interface name need to have the pascal case', p.prev_tok.pos())
|
||||||
|
break
|
||||||
|
}
|
||||||
|
comments := p.eat_comments()
|
||||||
|
ifaces << ast.InterfaceEmbedding{
|
||||||
|
name: from_mod_name
|
||||||
|
typ: from_mod_typ
|
||||||
|
pos: p.prev_tok.pos()
|
||||||
|
comments: comments
|
||||||
|
}
|
||||||
|
if p.tok.kind == .rcbr {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if p.tok.kind == .key_mut {
|
if p.tok.kind == .key_mut {
|
||||||
if is_mut {
|
if is_mut {
|
||||||
p.error_with_pos('redefinition of `mut` section', p.tok.pos())
|
p.error_with_pos('redefinition of `mut` section', p.tok.pos())
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
module main
|
||||||
|
|
||||||
|
import interface_from_another_module.mod
|
||||||
|
|
||||||
|
interface IBar {
|
||||||
|
mod.IFoo
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Abc {}
|
||||||
|
|
||||||
|
fn test_interface() {
|
||||||
|
a := IBar(Abc{})
|
||||||
|
dump(a)
|
||||||
|
assert true
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
module mod
|
||||||
|
|
||||||
|
pub interface IFoo {}
|
Loading…
Reference in New Issue