private IEnumerable <CompletionItem> GetSymbolCompletions(SemanticModel model, BicepCompletionContext context) { if (!context.Kind.HasFlag(BicepCompletionContextKind.Expression) && !context.Kind.HasFlag(BicepCompletionContextKind.DecoratorName)) { return(Enumerable.Empty <CompletionItem>()); } if (context.Kind.HasFlag(BicepCompletionContextKind.DecoratorName | BicepCompletionContextKind.MemberAccess)) { // This is already handled by GetMemberAccessCompletions. return(Enumerable.Empty <CompletionItem>()); } if (context.Property != null && model.GetDeclaredTypeAssignment(context.Property)?.Flags == DeclaredTypeFlags.Constant) { // the enclosing property's declared type is supposed to be a constant value // the constant flag comes from TypeProperty constant flag, so nothing else can really alter it except for another property // (in other words constant flag inherits down into the expression tree of the property value) return(Enumerable.Empty <CompletionItem>()); } // when we're inside an expression that is inside a property that expects a compile-time constant value, // we should not be emitting accessible symbol completions return(GetAccessibleSymbolCompletions(model, context)); }
private static DeclaredTypeAssignment?GetDeclaredTypeAssignment(SemanticModel model, SyntaxBase?syntax) => syntax == null ? null : model.GetDeclaredTypeAssignment(syntax);