private void AddSuggestionsForLeftNodeScope(IntellisenseData.IntellisenseData intellisenseData, TexlNode leftNode, bool isOneColumnTable, DType leftType) { Contracts.AssertValue(intellisenseData); Contracts.AssertValue(leftNode); Contracts.AssertValue(leftType); if (!intellisenseData.TryAddSuggestionsForLeftNodeScope(leftNode)) { if (TryGetEnumInfo(intellisenseData, leftNode, intellisenseData.Binding, out EnumSymbol enumInfo)) { IntellisenseHelper.AddSuggestionsForEnum(intellisenseData, enumInfo); } else if (TryGetNamespaceFunctions(leftNode, intellisenseData.Binding, out IEnumerable <TexlFunction> namespaceFunctions)) { AddSuggestionsForNamespace(intellisenseData, namespaceFunctions); } else if (TryGetLocalScopeInfo(leftNode, intellisenseData.Binding, out ScopedNameLookupInfo info)) { IntellisenseHelper.AddTopLevelSuggestions(intellisenseData, info.Type); } else if (!isOneColumnTable) { AddSuggestionsForDottedName(intellisenseData, leftType); } } intellisenseData.OnAddedSuggestionsForLeftNodeScope(leftNode); }
public static void AddSuggestionsForEnums(IntellisenseData.IntellisenseData intellisenseData) { Contracts.AssertValue(intellisenseData); var suggestions = intellisenseData.Suggestions; var substringSuggestions = intellisenseData.SubstringSuggestions; int countSuggBefore = suggestions.Count; int countSubSuggBefore = substringSuggestions.Count; foreach (var enumInfo in intellisenseData.EnumSymbols) { var enumType = enumInfo.EnumType; var enumName = enumInfo.Name; // TASK: 76039: Intellisense: Update intellisense to filter suggestions based on the expected type of the text being typed in UI IntellisenseHelper.AddSuggestion(intellisenseData, enumName, SuggestionKind.Enum, SuggestionIconKind.Other, enumType, requiresSuggestionEscaping: true); IntellisenseHelper.AddSuggestionsForEnum(intellisenseData, enumInfo, prefix: enumName + TexlLexer.PunctuatorDot); } if (suggestions.Count + substringSuggestions.Count == countSuggBefore + countSubSuggBefore + 1 && intellisenseData.SuggestUnqualifiedEnums) { string enumSuggestion = suggestions.Count > countSuggBefore ? suggestions[countSuggBefore].Text : substringSuggestions[countSubSuggBefore].Text; int dotIndex = enumSuggestion.LastIndexOf(TexlLexer.PunctuatorDot); // Assert '.' is not present or not at the beginning or the end of the EnumSuggestion Contracts.Assert(dotIndex == -1 || (0 < dotIndex && dotIndex < enumSuggestion.Length - 1)); var unqualifiedEnum = enumSuggestion.Substring(dotIndex + 1); // If the Enum we are about suggest unqualified (i.e. just 'Blue' instead of Color!Blue) // has a name collision with some Item already in the suggestionlist we should not continue // and suggest it. if (suggestions.Any(x => x.Text == unqualifiedEnum) || substringSuggestions.Any(x => x.Text == unqualifiedEnum)) { return; } DType enumType; if (suggestions.Count > countSuggBefore) { enumType = suggestions[countSuggBefore].Type; suggestions.RemoveAt(suggestions.Count - 1); } else { Contracts.Assert(substringSuggestions.Count > countSubSuggBefore); enumType = substringSuggestions[countSubSuggBefore].Type; substringSuggestions.RemoveAt(substringSuggestions.Count - 1); } // Add the unqualified Enum. // Note: The suggestion has already been escaped when it was previously added IntellisenseHelper.AddSuggestion(intellisenseData, unqualifiedEnum, SuggestionKind.Enum, SuggestionIconKind.Other, enumType, requiresSuggestionEscaping: false); } }