MCPcopy Create free account
hub / github.com/Effect-TS/tsgo / ParseAccessedExpressionForCompletion

Function ParseAccessedExpressionForCompletion

internal/completion/position.go:32–85  ·  view source on GitHub ↗

ParseAccessedExpressionForCompletion finds the accessed expression at the given cursor position. It handles three cases: - extends Schema.Tag| — cursor after a property name in a PropertyAccessExpression - extends Schema.| — cursor right after the dot - extends Schema| — cursor after a standalone id

(sf *ast.SourceFile, position int)

Source from the content-addressed store, hash-verified

30// - extends Schema.| — cursor right after the dot
31// - extends Schema| — cursor after a standalone identifier
32func ParseAccessedExpressionForCompletion(sf *ast.SourceFile, position int) *AccessedExpressionResult {
33 precedingToken := astnav.FindPrecedingToken(sf, position)
34 if precedingToken == nil {
35 return nil
36 }
37
38 var accessedObject *ast.Node
39 var outerNode *ast.Node
40 var replacementStart int
41 replacementLength := 0
42
43 switch {
44 case ast.IsIdentifier(precedingToken) && precedingToken.Parent != nil &&
45 ast.IsPropertyAccessExpression(precedingToken.Parent):
46 // extends Schema.Tag|
47 spanStart := astnav.GetStartOfNode(precedingToken.Parent, sf, false)
48 replacementStart = spanStart
49 replacementLength = precedingToken.End() - spanStart
50 prop := precedingToken.Parent.AsPropertyAccessExpression()
51 accessedObject = prop.Expression
52 outerNode = precedingToken.Parent
53 case ast.IsTokenKind(precedingToken.Kind) && precedingToken.Kind == ast.KindDotToken &&
54 precedingToken.Parent != nil && ast.IsPropertyAccessExpression(precedingToken.Parent):
55 // extends Schema.|
56 spanStart := astnav.GetStartOfNode(precedingToken.Parent, sf, false)
57 replacementStart = spanStart
58 replacementLength = precedingToken.End() - spanStart
59 prop := precedingToken.Parent.AsPropertyAccessExpression()
60 accessedObject = prop.Expression
61 outerNode = precedingToken.Parent
62 case ast.IsIdentifier(precedingToken) && precedingToken.Parent != nil:
63 // extends Schema|
64 spanStart := astnav.GetStartOfNode(precedingToken, sf, false)
65 replacementStart = spanStart
66 replacementLength = precedingToken.End() - spanStart
67 accessedObject = precedingToken
68 outerNode = precedingToken
69 default:
70 return nil
71 }
72
73 // Skip if accessed object is inside an import declaration
74 importDecl := ast.FindAncestor(accessedObject, ast.IsImportDeclaration)
75 if importDecl != nil {
76 return nil
77 }
78
79 return &AccessedExpressionResult{
80 AccessedObject: accessedObject,
81 OuterNode: outerNode,
82 ReplacementStart: replacementStart,
83 ReplacementLength: replacementLength,
84 }
85}
86
87// ParseDataForExtendsClassCompletion parses position context for a completion in the
88// extends clause of a class declaration. It calls ParseAccessedExpressionForCompletion

Callers 4

runSchemaBrandFunction · 0.92
runGenFunctionStarFunction · 0.92
runFnFunctionStarFunction · 0.92

Calls

no outgoing calls

Tested by

no test coverage detected