in src/Bicep.LangServer/Completions/BicepCompletionContext.cs [1060:1115]
private static bool IsOuterExpressionContext(List<SyntaxBase> matchingNodes, int offset)
{
switch (matchingNodes[^1])
{
case ParameterDefaultValueSyntax paramDefault:
return !paramDefault.AssignmentToken.Span.ContainsInclusive(offset) &&
paramDefault.DefaultValue is SkippedTriviaSyntax && offset == paramDefault.DefaultValue.Span.Position;
case VariableDeclarationSyntax variable:
// is the cursor after the equals sign in the variable?
return !variable.Name.Span.ContainsInclusive(offset) &&
variable.Type?.Span.ContainsInclusive(offset) != true &&
!variable.Assignment.Span.ContainsInclusive(offset) &&
variable.Value is SkippedTriviaSyntax && offset == variable.Value.Span.Position;
case ParameterAssignmentSyntax paramAssignment:
// is the cursor after the equals sign in the param assignment?
return !paramAssignment.Name.Span.ContainsInclusive(offset) &&
!paramAssignment.Assignment.Span.ContainsInclusive(offset) &&
paramAssignment.Value is SkippedTriviaSyntax && offset == paramAssignment.Value.Span.Position;
case OutputDeclarationSyntax output:
// is the cursor after the equals sign in the output?
return !output.Name.Span.ContainsInclusive(offset) &&
!output.Type.Span.ContainsInclusive(offset) &&
!output.Assignment.Span.ContainsInclusive(offset) &&
output.Value is SkippedTriviaSyntax && offset == output.Value.Span.Position;
case Token token when token.Type == TokenType.Identifier && matchingNodes.Count >= 4 && matchingNodes[^3] is VariableAccessSyntax variableAccess:
switch (matchingNodes[^4])
{
case VariableDeclarationSyntax variableDeclaration:
return ReferenceEquals(variableDeclaration.Value, variableAccess);
case OutputDeclarationSyntax outputDeclaration:
return ReferenceEquals(outputDeclaration.Value, variableAccess);
case ParameterAssignmentSyntax paramAssignment:
return ReferenceEquals(paramAssignment.Value, variableAccess);
}
break;
case Token token when token.Type == TokenType.Assignment && matchingNodes.Count >= 2 && offset == token.GetEndPosition():
// cursor is after the = token
// check if parent is of the right type
var parent = matchingNodes[^2];
return parent is ParameterDefaultValueSyntax ||
parent is VariableDeclarationSyntax ||
parent is OutputDeclarationSyntax ||
parent is ParameterDeclarationSyntax ||
parent is ParameterAssignmentSyntax;
}
return false;
}