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