private static ControlInfoJson.RuleEntry GetPropertyEntry(ControlState state, ErrorContainer errors, string propName, string expression)
        {
            var property = new ControlInfoJson.RuleEntry();

            property.Property        = propName;
            property.InvariantScript = expression;

            PropertyState propState = null;

            if (state.Properties != null && state.Properties.ToDictionary(prop => prop.PropertyName).TryGetValue(propName, out propState))
            {
                property.ExtensionData    = propState.ExtensionData;
                property.NameMap          = propState.NameMap;
                property.RuleProviderType = propState.RuleProviderType;
            }
            else
            {
                if (state.IsComponentDefinition ?? false)
                {
                    errors.UnsupportedOperationError("This tool currently does not support adding new custom properties to components. Please use Power Apps Studio to edit component definitions");
                    throw new DocumentException();
                }

                property.RuleProviderType = "Unknown";
            }

            return(property);
        }
        private static (PropertyNode prop, PropertyState state) SplitProperty(ControlInfoJson.RuleEntry rule)
        {
            var script = rule.InvariantScript;
            var prop   = new PropertyNode()
            {
                Expression = new ExpressionNode()
                {
                    Expression = script
                }, Identifier = rule.Property
            };
            var state = new PropertyState()
            {
                PropertyName = rule.Property, ExtensionData = rule.ExtensionData, NameMap = rule.NameMap, RuleProviderType = rule.RuleProviderType
            };

            return(prop, state);
        }
        private static ControlInfoJson.RuleEntry CombinePropertyIRAndState(PropertyNode node, ErrorContainer errors, ControlState state = null)
        {
            var propName   = node.Identifier;
            var expression = node.Expression.Expression;

            if (state == null)
            {
                var property = new ControlInfoJson.RuleEntry();
                property.Property         = propName;
                property.InvariantScript  = expression;
                property.RuleProviderType = "Unknown";
                return(property);
            }
            else
            {
                var property = GetPropertyEntry(state, errors, propName, expression);
                return(property);
            }
        }
        private static ControlInfoJson.DynamicPropertyJson CombineDynamicPropertyIRAndState(PropertyNode node, ControlState state = null)
        {
            var propName   = node.Identifier;
            var expression = node.Expression.Expression;

            if (state == null)
            {
                var property = new ControlInfoJson.RuleEntry();
                property.Property         = propName;
                property.InvariantScript  = expression;
                property.RuleProviderType = "Unknown";
                return(new ControlInfoJson.DynamicPropertyJson()
                {
                    PropertyName = propName, Rule = property
                });
            }
            else
            {
                var property = GetDynamicPropertyEntry(state, propName, expression);
                return(property);
            }
        }