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