protected override bool AddLookupItems()

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;
    }