public IColorReference? GetColorReference()

in resharper/resharper-unity/src/Unity/Odin/Feature/Services/Daemon/Colors/OdinColorReferenceProvider.cs [37:121]


    public IColorReference? GetColorReference(ITreeNode element)
    {
        if (!OdinAttributeUtil.HasOdinSupport(myDescriptionCollector))
            return null;
           
        if (element is not ICSharpArgument argument)
            return null;

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

        var value = argument.Value;
        if (value == null)
            return null;
        if (!value.IsConstantValue())
            return null;

        var arguments = attribute.Arguments;

        if (arguments.IndexOf(argument) != 0)
            return null;
        
        var type = attribute.TypeReference?.Resolve().Result.DeclaredElement as ITypeElement;
        if (type == null)
            return null;

        if (!type.GetClrName().Equals(OdinKnownAttributes.GUIColorAttribute))
            return null;

        var constructor = attribute.ConstructorReference.Resolve().DeclaredElement as IConstructor;
        if (constructor == null)
            return null;


        // string
        if (constructor.Parameters.Count == 1)
        {
            var parameter = constructor.Parameters.First();
            if (!parameter.Type().IsString())
                return null;

            var stringValue = value.ConstantValue.AsString();
            if (stringValue == null)
                return null;

            // support hex only
            if (!stringValue.StartsWith("#"))
                return null;

            // TODO replace?
            var color = ColorSpace.HexToColor(stringValue.ToUpper());

            return new OdinHexColorReference(argument, argument.GetDocumentRange(), new ColorElement(color));
        }

        if (constructor.Parameters.Count == 4)
        {
            for (int i = 0; i < constructor.Parameters.Count; i++)
            {
                if (!constructor.Parameters[i].Type().IsFloat())
                    return null;
            }

            if (arguments.Count < 3)
                return null;

            var rArgument = arguments[0];
            var gArgument = arguments[1];
            var bArgument = arguments[2];

            var aArgument = arguments.Count == 4 ? arguments[3] : null;

            var color = JetRgbaColor.FromArgb(
                (byte)(255.0 * (UnityColorHighlighterProcess.ArgumentAsFloatConstant(0f, 1f, aArgument?.Value) ?? 1)),
                (byte)(255.0 * (UnityColorHighlighterProcess.ArgumentAsFloatConstant(0f, 1f, rArgument?.Value) ?? 0)),
                (byte)(255.0 * (UnityColorHighlighterProcess.ArgumentAsFloatConstant(0f, 1f, gArgument?.Value) ?? 0)),
                (byte)(255.0 * (UnityColorHighlighterProcess.ArgumentAsFloatConstant(0f, 1f, bArgument?.Value) ?? 0)));

            return new OdinColorReference(attribute, type, aArgument ?? bArgument, (aArgument ?? bArgument).GetDocumentRange(),
                new ColorElement(color), rArgument, gArgument, bArgument, aArgument);
        }

        return null;
    }