the base
This commit is contained in:
92
lib/code/codemodel/utils.v
Normal file
92
lib/code/codemodel/utils.v
Normal file
@@ -0,0 +1,92 @@
|
||||
module codemodel
|
||||
|
||||
import freeflowuniverse.herolib.ui.console
|
||||
import rand
|
||||
|
||||
pub struct GetStruct {
|
||||
pub:
|
||||
code []CodeItem
|
||||
mod string
|
||||
name string
|
||||
}
|
||||
|
||||
pub fn get_struct(params GetStruct) ?Struct {
|
||||
structs_ := params.code.filter(it is Struct).map(it as Struct)
|
||||
structs := structs_.filter(it.name == params.name)
|
||||
if structs.len == 0 {
|
||||
return none
|
||||
} else if structs.len > 1 {
|
||||
panic('Multiple structs with same name found. This should never happen.')
|
||||
}
|
||||
return structs[0]
|
||||
}
|
||||
|
||||
pub fn inflate_types(mut code []CodeItem) {
|
||||
for mut item in code {
|
||||
if item is Struct {
|
||||
// TODO: handle this when refactoring types / structs
|
||||
|
||||
inflate_struct_fields(code, mut item)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn inflate_struct_fields(code []CodeItem, mut struct_ CodeItem) {
|
||||
for mut field in (struct_ as Struct).fields {
|
||||
// TODO: fix inflation for imported types
|
||||
if field.typ.symbol.starts_with_capital() {
|
||||
field.structure = get_struct(
|
||||
code: code
|
||||
name: field.typ.symbol
|
||||
) or { continue }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@[params]
|
||||
pub struct GenerateCallParams {
|
||||
pub:
|
||||
receiver string
|
||||
}
|
||||
|
||||
pub fn (func Function) generate_call(params GenerateCallParams) !string {
|
||||
mut call := ''
|
||||
if func.result.typ.symbol != '' {
|
||||
call = 'result := '
|
||||
}
|
||||
call += if params.receiver != '' {
|
||||
'${params.receiver}.${func.name}'
|
||||
} else if func.receiver.name != '' {
|
||||
'${func.receiver.name}.${func.name}'
|
||||
} else {
|
||||
func.name
|
||||
}
|
||||
|
||||
call += if func.params.len != 0 {
|
||||
'(${func.params.map(it.generate_value()!).join(',')})'
|
||||
} else {
|
||||
'()'
|
||||
}
|
||||
|
||||
if func.result.result {
|
||||
call += '!'
|
||||
}
|
||||
return call
|
||||
}
|
||||
|
||||
@[params]
|
||||
pub struct GenerateValueParams {
|
||||
}
|
||||
|
||||
pub fn (param Param) generate_value() !string {
|
||||
if param.typ.symbol == 'string' {
|
||||
return "'mock_string_${rand.string(3)}'"
|
||||
} else if param.typ.symbol == 'int' || param.typ.symbol == 'u32' {
|
||||
return '42'
|
||||
} else if param.typ.symbol[0].is_capital() {
|
||||
return '${param.typ.symbol}{}'
|
||||
} else {
|
||||
console.print_debug('mock values for types other than strings and ints are not yet supported')
|
||||
}
|
||||
return ''
|
||||
}
|
||||
Reference in New Issue
Block a user