public Result ResolveVarFunction(ref int index) { m_ResolvedVarStack.Clear(); m_ValidationExpression = null; if (!m_Property.isCustomProperty) { string syntax; if (!StylePropertyCache.TryGetSyntax(m_Property.name, out syntax)) { Debug.LogAssertion($"Unknown style property {m_Property.name}"); return(Result.Invalid); } m_ValidationExpression = s_SyntaxParser.Parse(syntax); } int argc; string varName; ParseVarFunction(m_Sheet, m_Handles, ref index, out argc, out varName); var result = ResolveVariable(varName); if (result != Result.Valid) { // var() fallback if (result == Result.NotFound && argc > 1 && !m_Property.isCustomProperty) { var h = m_Handles[++index]; Debug.Assert(h.valueType == StyleValueType.FunctionSeparator, $"Unexpected value type {h.valueType} in var function"); if (h.valueType == StyleValueType.FunctionSeparator && index + 1 < m_Handles.Length) { ++index; result = ResolveFallback(ref index); } } else { m_ResolvedValues.Clear(); } } return(result); }
public bool ValidateResolvedValues() { // Cannot validate custom property before it's assigned so it's always true in this case if (m_Property.isCustomProperty) { return(true); } if (!StylePropertyCache.TryGetSyntax(m_Property.name, out var syntax)) { Debug.LogAssertion($"Unknown style property {m_Property.name}"); return(false); } var validationExpression = s_SyntaxParser.Parse(syntax); var result = m_Matcher.Match(validationExpression, m_ResolvedValues); return(result.success); }
public static List <string> GetStyleKeywords(string binding) { if (string.IsNullOrEmpty(binding)) { return(StyleFieldConstants.KLDefault); } var syntaxParser = new StyleSyntaxParser(); #if UNITY_2019_3_OR_NEWER var syntaxFound = StylePropertyCache.TryGetSyntax(binding, out var syntax); #else var syntaxFound = StyleFieldConstants.StylePropertySyntaxCache.TryGetValue(binding, out var syntax); #endif if (!syntaxFound) { return(StyleFieldConstants.KLDefault); } var expression = syntaxParser.Parse(syntax); if (expression == null) { return(StyleFieldConstants.KLDefault); } var hasAuto = FindKeywordInExpression(expression, StyleFieldConstants.KeywordAuto); var hasNone = FindKeywordInExpression(expression, StyleFieldConstants.KeywordNone); if (hasAuto) { return(StyleFieldConstants.KLAuto); } else if (hasNone) { return(StyleFieldConstants.KLNone); } return(StyleFieldConstants.KLDefault); }
public StyleValidationResult ValidateProperty(string name, string value) { var result = new StyleValidationResult() { status = StyleValidationStatus.Ok }; // Bypass custom styles if (name.StartsWith("--")) { return(result); } string syntax; if (!StylePropertyCache.TryGetSyntax(name, out syntax)) { string closestName = StylePropertyCache.FindClosestPropertyName(name); result.status = StyleValidationStatus.Error; result.message = $"Unknown property '{name}'"; if (!string.IsNullOrEmpty(closestName)) { result.message = $"{result.message} (did you mean '{closestName}'?)"; } return(result); } var syntaxTree = m_SyntaxParser.Parse(syntax); if (syntaxTree == null) { result.status = StyleValidationStatus.Error; result.message = $"Invalid '{name}' property syntax '{syntax}'"; return(result); } var matchResult = m_StyleMatcher.Match(syntaxTree, value); if (!matchResult.success) { result.errorValue = matchResult.errorValue; switch (matchResult.errorCode) { case MatchResultErrorCode.Syntax: result.status = StyleValidationStatus.Error; if (IsUnitMissing(syntax, value)) { result.hint = "Property expects a unit. Did you forget to add px or %?"; } else if (IsUnsupportedColor(syntax)) { result.hint = $"Unsupported color '{value}'."; } result.message = $"Expected ({syntax}) but found '{matchResult.errorValue}'"; break; case MatchResultErrorCode.EmptyValue: result.status = StyleValidationStatus.Error; result.message = $"Expected ({syntax}) but found empty value"; break; case MatchResultErrorCode.ExpectedEndOfValue: result.status = StyleValidationStatus.Warning; result.message = $"Expected end of value but found '{matchResult.errorValue}'"; break; default: Debug.LogAssertion($"Unexpected error code '{matchResult.errorCode}'"); break; } } return(result); }