public ReferenceCollection GetReferences()

in resharper/resharper-unity/src/Unity/Odin/Feature/Services/References/Members/OdinMemberReferenceFactory.cs [22:81]


    public ReferenceCollection GetReferences(ITreeNode element, ReferenceCollection oldReferences)
    {
        if (!OdinAttributeUtil.HasOdinSupport(myCollector))
            return ReferenceCollection.Empty;
        
        if (element is not ICSharpLiteralExpression expression)
            return ReferenceCollection.Empty;

        var argument = CSharpArgumentNavigator.GetByValue(expression);
        if (argument == null)
            return ReferenceCollection.Empty;
        
        if (!expression.IsConstantValue())
            return ReferenceCollection.Empty;

        if (!expression.ConstantValue.IsString())
            return ReferenceCollection.Empty;

        var attribute = AttributeNavigator.GetByArgument(argument);
        if (attribute == null)
            return ReferenceCollection.Empty;

        var typeElement = attribute.GetContainingTypeElement();
        if (typeElement == null)
            return ReferenceCollection.Empty;

        var clrName = (attribute.TypeReference?.Resolve().DeclaredElement as ITypeElement)?.GetClrName();
        if (clrName == null)
            return ReferenceCollection.Empty;
        
        if (!clrName.FullName.StartsWith(OdinKnownAttributes.OdinNamespace))
            return ReferenceCollection.Empty;

        var stringValue = expression.ConstantValue.AsString() ?? "";
        if (stringValue.IsNullOrEmpty())
            return ReferenceCollection.Empty;

        var subLiterals = ExtractReferences(stringValue);

        var references = new LocalList<IReference>();
        foreach (var (name, startOffset, endOffset) in subLiterals)
        {
            references.Add(new OdinMemberReference(attribute.GetContainingTypeElement(), expression, name, startOffset, endOffset));
        }

        if (stringValue.Length == 0 || stringValue[0] != '@' && stringValue[0] != '$')
        {
            if (OdinKnownAttributes.AttributesWithMemberCompletion.TryGetValue(clrName, out var possibleNames))
            {
                if (possibleNames.Contains(argument.MatchingParameter?.Element.ShortName))
                {
                    references.Add(new OdinRegularMemberReference(attribute.GetContainingTypeElement(), expression,
                    stringValue, 1, 1 + stringValue.Length));
                }
            }
        }

        var collection = new ReferenceCollection(references.ReadOnlyList());
        return ResolveUtil.ReferenceSetsAreEqual(collection, oldReferences) ? oldReferences : collection;
    }