diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2024-05-17 22:30:22 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2024-05-17 22:30:22 +0200 |
| commit | 0d81b688bf9afe805371353077d74fdedee5d648 (patch) | |
| tree | 2ea3befb2e452ed553697519cabce53a786fd941 /src/server | |
| parent | e5fa6ba019f5bde0846f096a3523d5fb2664f4ca (diff) | |
move resolve entire file to seperate file.
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 290 |
1 files changed, 0 insertions, 290 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 8562d66..7841140 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -3809,296 +3809,6 @@ clear_locals :: proc(ast_context: ^AstContext) { clear(&ast_context.usings) } -ResolveReferenceFlag :: enum { - None, - Variable, - Constant, - StructElement, - EnumElement, -} - -resolve_entire_file :: proc( - document: ^Document, - reference := "", - flag := ResolveReferenceFlag.None, - save_unresolved := false, - allocator := context.allocator, -) -> map[uintptr]SymbolAndNode { - ast_context := make_ast_context( - document.ast, - document.imports, - document.package_name, - document.uri.uri, - document.fullpath, - allocator, - ) - - get_globals(document.ast, &ast_context) - - set_ast_package_set_scoped(&ast_context, ast_context.document_package) - - symbols := make(map[uintptr]SymbolAndNode, 10000, allocator) - - for decl in document.ast.decls { - if _, is_value := decl.derived.(^ast.Value_Decl); !is_value { - continue - } - - resolve_entire_decl( - &ast_context, - document, - decl, - &symbols, - reference, - flag, - save_unresolved, - allocator, - ) - clear(&ast_context.locals) - } - - return symbols -} - -resolve_entire_decl :: proc( - ast_context: ^AstContext, - document: ^Document, - decl: ^ast.Node, - symbols: ^map[uintptr]SymbolAndNode, - reference := "", - flag := ResolveReferenceFlag.None, - save_unresolved := false, - allocator := context.allocator, -) { - Scope :: struct { - offset: int, - id: int, - } - - Visit_Data :: struct { - ast_context: ^AstContext, - symbols: ^map[uintptr]SymbolAndNode, - scopes: [dynamic]Scope, - id_counter: int, - last_visit: ^ast.Node, - resolve_flag: ResolveReferenceFlag, - reference: string, - save_unresolved: bool, - document: ^Document, - } - - data := Visit_Data { - ast_context = ast_context, - symbols = symbols, - scopes = make([dynamic]Scope, allocator), - resolve_flag = flag, - reference = reference, - document = document, - save_unresolved = save_unresolved, - } - - visit :: proc(visitor: ^ast.Visitor, node: ^ast.Node) -> ^ast.Visitor { - if node == nil || visitor == nil { - return nil - } - data := cast(^Visit_Data)visitor.data - ast_context := data.ast_context - - reset_ast_context(ast_context) - - data.last_visit = node - - //It's somewhat silly to check the scope everytime, but the alternative is to implement my own walker function. - if len(data.scopes) > 0 { - current_scope := data.scopes[len(data.scopes) - 1] - - if current_scope.offset < node.end.offset { - clear_local_group(ast_context, current_scope.id) - - pop(&data.scopes) - - if len(data.scopes) > 0 { - current_scope = data.scopes[len(data.scopes) - 1] - ast_context.local_id = current_scope.id - } else { - ast_context.local_id = 0 - } - } - } - - #partial switch v in node.derived { - case ^ast.Proc_Lit: - if v.body == nil { - break - } - - scope: Scope - scope.id = data.id_counter - scope.offset = node.end.offset - data.id_counter += 1 - ast_context.local_id = scope.id - - append(&data.scopes, scope) - add_local_group(ast_context, scope.id) - - position_context: DocumentPositionContext - position_context.position = node.end.offset - - get_locals_proc_param_and_results( - ast_context.file, - v^, - ast_context, - &position_context, - ) - get_locals_stmt( - ast_context.file, - cast(^ast.Stmt)node, - ast_context, - &position_context, - ) - case ^ast.If_Stmt, - ^ast.For_Stmt, - ^ast.Range_Stmt, - ^ast.Inline_Range_Stmt: - scope: Scope - scope.id = data.id_counter - scope.offset = node.end.offset - data.id_counter += 1 - ast_context.local_id = scope.id - - append(&data.scopes, scope) - add_local_group(ast_context, scope.id) - - position_context: DocumentPositionContext - position_context.position = node.end.offset - get_locals_stmt( - ast_context.file, - cast(^ast.Stmt)node, - ast_context, - &position_context, - ) - } - - if data.resolve_flag == .None { - #partial switch v in node.derived { - case ^ast.Ident: - if symbol, ok := resolve_type_identifier(ast_context, v^); ok { - data.symbols[cast(uintptr)node] = SymbolAndNode { - node = v, - symbol = symbol, - is_resolved = true, - } - } else if data.save_unresolved { - data.symbols[cast(uintptr)node] = SymbolAndNode { - node = v, - } - } - case ^ast.Selector_Expr: - if symbol, ok := resolve_type_expression(ast_context, &v.node); - ok { - data.symbols[cast(uintptr)node] = SymbolAndNode { - node = v, - symbol = symbol, - is_resolved = true, - } - } else if data.save_unresolved { - data.symbols[cast(uintptr)node] = SymbolAndNode { - node = v, - } - } - case ^ast.Call_Expr: - if symbol, ok := resolve_type_expression(ast_context, &v.node); - ok { - data.symbols[cast(uintptr)node] = SymbolAndNode { - node = v, - symbol = symbol, - is_resolved = true, - } - } else if data.save_unresolved { - data.symbols[cast(uintptr)node] = SymbolAndNode { - node = v, - } - } - } - } else { - #partial done: switch v in node.derived { - case ^ast.Selector_Expr: - document: ^Document = data.document - - position_context := DocumentPositionContext { - position = v.pos.offset, - } - - get_document_position_decls( - document.ast.decls[:], - &position_context, - ) - - if symbol, ok := resolve_location_selector(ast_context, v); - ok { - data.symbols[cast(uintptr)node] = SymbolAndNode { - node = v.field, - symbol = symbol, - } - } - - if _, is_ident := v.field.derived.(^ast.Ident); is_ident { - if data.resolve_flag == .Constant || - data.resolve_flag == .Variable { - return nil - } - } - case ^ast.Ident: - if data.resolve_flag == .Variable && v.name != data.reference { - break done - } - - document: ^Document = data.document - - position_context := DocumentPositionContext { - position = v.pos.offset, - } - - get_document_position_decls( - document.ast.decls[:], - &position_context, - ) - - if position_context.field_value != nil && - position_in_node( - position_context.field_value.field, - v.pos.offset, - ) { - break done - } else if position_context.struct_type != nil && - data.resolve_flag != .StructElement { - break done - } else if position_context.enum_type != nil && - data.resolve_flag != .EnumElement { - break done - } - - if symbol, ok := resolve_location_identifier(ast_context, v^); - ok { - data.symbols[cast(uintptr)node] = SymbolAndNode { - node = v, - symbol = symbol, - } - } - } - } - - return visitor - } - - visitor := ast.Visitor { - data = &data, - visit = visit, - } - - ast.walk(&visitor, decl) -} - concatenate_symbol_information :: proc { concatenate_raw_symbol_information, concatenate_raw_string_information, |