/// <inheritdoc/> public bool ShowInInspector([NotNull] Type containingClassType, [CanBeNull] object containingClassInstance, [CanBeNull] MemberInfo classMember) { if (evaluator == null) { evaluator = EvaluationUtility.GenerateEvaluatorForBooleanExpression(expression); } return(evaluator.Evaluate(containingClassType, containingClassInstance, classMember)); }
/// <summary> /// Only show the class member that follows this attribute if another class member /// by the name <paramref name="classMemberName"/> has the value of <paramref name="requiredValue"/>. /// </summary> /// <param name="classMemberName"> Name of another class member inside the same class as the class member with this attribute. </param> /// <param name="requiredValue"></param> public ShowIfAttribute(string classMemberName, string comparison, object requiredValue) : base() { expression = null; Is comparisonType; switch (comparison) { case "==": comparisonType = Is.Equal; break; case "!=": comparisonType = Is.Not; break; case "<": comparisonType = Is.Smaller; break; case "<=": comparisonType = Is.SmallerOrEqual; break; case ">": comparisonType = Is.Larger; break; case ">=": comparisonType = Is.LargerOrEqual; break; default: throw new Exception("Unrecognized comparison: \"" + comparison + "\". Accepted comparison values are: ==, !=, <, >, <= and >=."); } evaluator = new ValueTest(classMemberName, comparisonType, requiredValue); }
private static bool TryGenerateEvaluatorForExpressionWithoutParentheses(bool ifAny, string expression, out IShowIfEvaluator left) { left = null; var atomSeparator = ifAny ? '|' : '&'; int end = expression.IndexOf(atomSeparator); if (end == -1) { return(false); } int start = 0; do { string expressionAtom = expression.Substring(start, end - start); var leafEvaluator = GenerateEvaluatorForAtomicFormula(expressionAtom); if (left == null) { left = leafEvaluator; } else { left = new Expression(left, leafEvaluator, ifAny); } start = end + 1; end = expression.IndexOf(atomSeparator, start + 1); }while(end != -1); if (start < expression.Length - 1) { string expressionAtom = expression.Substring(start); var leafEvaluator = GenerateEvaluatorForAtomicFormula(expressionAtom); if (left == null) { left = leafEvaluator; } else { left = new Expression(left, leafEvaluator, ifAny); } } #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(left != null); #endif return(true); }
public static IShowIfEvaluator GenerateEvaluatorForBooleanExpression([NotNullOrEmpty] string expression) { #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(!string.IsNullOrEmpty(expression)); #endif IShowIfEvaluator cached; if (EvaluatorCache.TryGetValue(expression, out cached)) { return(cached); } string rawInput = expression; expression = expression.Replace(" ", "").Replace("&&", "&").Replace("||", "|"); #if DEV_MODE Debug.Log("GenerateEvaluatorFromExpression: " + expression); #endif IShowIfEvaluator left = null; bool any = false; int start = expression.LastIndexOf('('); if (start == -1) { left = GenerateEvaluatorForExpressionWithoutParentheses(expression); #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(left != null); #endif EvaluatorCache.Add(rawInput, left); return(left); } for (; start != -1; start = expression.LastIndexOf('(', start - 1)) { int end = expression.IndexOf(')', start + 1); string expressionWithoutParentheses = expression.Substring(start + 1, end - start - 1); var newEvaluator = GenerateEvaluatorForExpressionWithoutParentheses(expressionWithoutParentheses); if (left == null) { left = newEvaluator; } else { left = new Expression(left, newEvaluator, any); } if (start > 0) { var c = expression[start - 1]; if (c == '|') { any = true; } else if (c == '&') { any = false; } else { c = expression[end + 1]; if (c == '|') { any = true; } else if (c == '&') { any = false; } } } else { var c = expression[end + 1]; if (c == '|') { any = true; } else if (c == '&') { any = false; } } } int firstStart = expression.IndexOf('('); if (firstStart > 0) { #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(left != null); #endif any = expression[firstStart - 1] == '|'; string expressionWithoutParentheses = expression.Substring(0, firstStart - 1); var newEvaluator = GenerateEvaluatorForExpressionWithoutParentheses(expressionWithoutParentheses); left = new Expression(left, newEvaluator, any); } int lastEnd = expression.LastIndexOf(')'); if (lastEnd < expression.Length - 1) { #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(left != null); #endif any = expression[lastEnd + 1] == '|'; string expressionWithoutParentheses = expression.Substring(lastEnd + 2); var newEvaluator = GenerateEvaluatorForExpressionWithoutParentheses(expressionWithoutParentheses); left = new Expression(left, newEvaluator, any); } #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(left != null); #endif EvaluatorCache.Add(rawInput, left); return(left); }
/// <summary> /// Only show the class member that follows this attribute if another class member /// by the name <paramref name="classMemberName"/> has the value of <paramref name="requiredValue"/>. /// </summary> /// <param name="classMemberName"> Name of another class member inside the same class as the class member with this attribute. </param> /// <param name="requiredValue"></param> public ShowIfAttribute(string classMemberName, Is comparison, object requiredValue) : base() { evaluator = new ValueTest(classMemberName, comparison, requiredValue); expression = null; }
public bool ShowInInspector([NotNull] Type containingClassType, [CanBeNull] object containingClassInstance, [CanBeNull] MemberInfo classMember) { if (alwaysShow) { return(true); } if (evaluatorExpression != null) { if (evaluator == null) { evaluator = EvaluationUtility.GenerateEvaluatorForBooleanExpression(evaluatorExpression); } return(evaluator.Evaluate(containingClassType, containingClassInstance, classMember)); } if (!string.IsNullOrEmpty(classMemberName)) { var classMembers = containingClassType.GetMember(classMemberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); int classMembersFound = classMembers.Length; if (classMembersFound == 0) { Debug.LogError("HelpBoxAttribute class member by name \"" + classMemberName + "\" not found."); return(true); } classMember = classMembers[0]; } var field = classMember as FieldInfo; object currentValue; Type classMemberType; if (field is object) { classMemberType = field.FieldType; currentValue = field.GetValue(field.IsStatic ? null : containingClassInstance); } else { var property = classMember as PropertyInfo; if (property is object) { classMemberType = property.PropertyType; var getAccessor = property.GetGetMethod(); currentValue = getAccessor.Invoke(getAccessor.IsStatic ? null : containingClassInstance, null); } else { Debug.LogError("ShowInInspectorIfAttribute class member by name \"" + classMemberName + "\" was not a field or a property."); return(true); } } #if DEV_MODE Debug.Log("Show if \"" + classMemberName + "\" value (" + (currentValue == null ? "null" : currentValue.ToString()) + ") " + comparisonType + " " + (requiredValue == null ? "null" : requiredValue.ToString())); #endif return(EvaluationUtility.Test(currentValue, comparisonType, requiredValue)); }
public Expression(IShowIfEvaluator setLeft, IShowIfEvaluator setRight, bool setAny) { left = setLeft; right = setRight; any = setAny; }
public Negation(IShowIfEvaluator setExpressionToNegate) { expressionToNegate = setExpressionToNegate; }
/// <summary> /// Show the class member that follows this attribute as disabled (read-only) if class member /// by the name <paramref name="classMemberName"/> has the value of <paramref name="requiredValue"/>. /// </summary> /// <param name="classMemberName"> Name of another class member inside the same class as the class member with this attribute. </param> /// <param name="requiredValue"></param> public DisableIfAttribute(string classMemberName, object requiredValue) : base() { evaluator = new ValueTest(classMemberName, Is.Equal, requiredValue); expression = null; }