aboutsummaryrefslogtreecommitdiff
path: root/src/server/position_context.odin
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/position_context.odin')
-rw-r--r--src/server/position_context.odin35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/server/position_context.odin b/src/server/position_context.odin
index 33de8f3..7687d01 100644
--- a/src/server/position_context.odin
+++ b/src/server/position_context.odin
@@ -1,10 +1,11 @@
+#+feature using-stmt
package server
-import "core:strings"
import "core:log"
import "core:odin/ast"
import "core:odin/parser"
import "core:odin/tokenizer"
+import "core:strings"
import "core:unicode/utf8"
import "src:common"
@@ -61,11 +62,36 @@ DocumentPositionContext :: struct {
import_stmt: ^ast.Import_Decl,
type_cast: ^ast.Type_Cast,
call_commas: []int,
+ directive: ^ast.Basic_Directive,
+}
+
+
+get_stmt_attrs :: proc(decl: ^ast.Stmt) -> []^ast.Attribute {
+ if decl == nil {
+ return nil
+ }
+ #partial switch v in decl.derived {
+ case ^ast.Value_Decl:
+ return v.attributes[:]
+ case ^ast.Import_Decl:
+ return v.attributes[:]
+ case ^ast.Foreign_Block_Decl:
+ return v.attributes[:]
+ case ^ast.Foreign_Import_Decl:
+ return v.attributes[:]
+ }
+ return nil
}
get_document_position_decls :: proc(decls: []^ast.Stmt, position_context: ^DocumentPositionContext) -> bool {
exists_in_decl := false
for decl in decls {
+ for attr in get_stmt_attrs(decl) {
+ if position_in_node(attr, position_context.position) {
+ get_document_position(attr, position_context)
+ return true
+ }
+ }
if position_in_node(decl, position_context.position) {
get_document_position(decl, position_context)
exists_in_decl = true
@@ -820,6 +846,11 @@ get_document_position_node :: proc(node: ^ast.Node, position_context: ^DocumentP
position_context.struct_type = n
get_document_position(n.poly_params, position_context)
get_document_position(n.align, position_context)
+ for clause in n.where_clauses {
+ if position_in_node(clause, position_context.position) {
+ get_document_position(clause, position_context)
+ }
+ }
get_document_position(n.fields, position_context)
case ^Union_Type:
position_context.union_type = n
@@ -857,6 +888,8 @@ get_document_position_node :: proc(node: ^ast.Node, position_context: ^DocumentP
get_document_position(n.name, position_context)
get_document_position(n.type, position_context)
get_document_position(n.bit_size, position_context)
+ case ^Basic_Directive:
+ position_context.directive = n
case:
}
}