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)
| 30 | // - extends Schema.| — cursor right after the dot |
| 31 | // - extends Schema| — cursor after a standalone identifier |
| 32 | func 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 |
no outgoing calls
no test coverage detected