in resharper/resharper-unity/src/Unity/Odin/Feature/Services/CodeCompletion/GroupingAttributes/OdinTabGroupAttributeCodeCompletionProvider.cs [54:123]
protected override bool AddLookupItems(CSharpCodeCompletionContext context, IItemsCollector collector)
{
var stringLiteral = context.StringLiteral();
if (stringLiteral == null)
return false;
var nodeInFile = context.NodeInFile;
var argument = nodeInFile.GetContainingNode<ICSharpArgument>();
var attribute = AttributeNavigator.GetByArgument(argument);
if (attribute == null)
return false;
var declaration = attribute.GetContainingNode<IClassLikeDeclaration>();
var classLikeDeclaredElement = declaration?.DeclaredElement;
if (classLikeDeclaredElement == null)
return false;
var type = attribute.TypeReference?.Resolve().Result.DeclaredElement as ITypeElement;
if (type == null)
return false;
if (!type.GetClrName().Equals(OdinKnownAttributes.TabGroupAttribute))
return false;
var name = argument.MatchingParameter?.Element.ShortName;
if (name == null)
return false;
if (!"tab".Equals(name))
return false;
var groups = OdinAttributeUtil.CollectGroupInfo(classLikeDeclaredElement).Where(t =>
Equals(t.AttributeInstance.GetClrName(), OdinKnownAttributes.TabGroupAttribute) && t.IsMajorGroup).ToList();
var currentMembers = CSharpTypeMemberDeclarationNavigator.GetByAttribute(attribute).Select(t => t.DeclaredElement).ToHashSet();
if (currentMembers.Count == 0)
return false;
var currentGroup = groups.First(t => Equals(t.Member, currentMembers.First())).GroupPath;
var sectionCount = currentGroup.Count(t => t == '/');
var resultTabs = new HashSet<string>(groups.Count);
foreach (var group in groups)
{
if (currentMembers.Contains(group.Member))
continue;
if (!group.GroupPath.StartsWith(currentGroup))
continue;
var paths = group.GroupPath.Split('/');
if (paths.Length <= sectionCount)
continue;
resultTabs.Add(paths[sectionCount]);
}
var hasResult = false;
foreach (var layoutName in resultTabs)
{
var item = new StringLiteralItem(layoutName, context.CompletionRanges);
collector.Add(item);
hasResult = true;
}
return hasResult;
}