aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2024-05-17 22:30:22 +0200
committerDanielGavin <danielgavin5@hotmail.com>2024-05-17 22:30:22 +0200
commit0d81b688bf9afe805371353077d74fdedee5d648 (patch)
tree2ea3befb2e452ed553697519cabce53a786fd941 /src/server
parente5fa6ba019f5bde0846f096a3523d5fb2664f4ca (diff)
move resolve entire file to seperate file.
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin290
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,