public override AstNode?VisitPragmaDefinition(PragmaDefinitionContext context)
        {
            var pragmaName = context.name?.token?.Text;

            if (string.IsNullOrEmpty(pragmaName))
            {
                _contracts.AddError(context, "Missing pragma name");
                return(null);
            }

            var optionDescriptor = _contracts.Options.GetOptionDescriptor(pragmaName);

            if (optionDescriptor != null)
            {
                if (!_definedContractOptions.Add(pragmaName))
                {
                    _contracts.AddError(context.name, "Duplicate file-level pragma: {0}", pragmaName);
                    return(null);
                }

                if (_hasDefinitions)
                {
                    _contracts.AddError(context, "File-level pragma {0} should be set at the top of the file", pragmaName);
                }
            }
            else
            {
                _currentMemberOptions = _currentMemberOptions.Clone();
                optionDescriptor      = _currentMemberOptions.GetOptionDescriptor(pragmaName);

                if (optionDescriptor == null)
                {
                    _contracts.AddError(context.name, "Unknown pragma: '{0}'", pragmaName);
                    return(null);
                }
            }

            pragmaName = optionDescriptor.Name;

            var value = context._valueTokens.Count > 0
                ? context._valueTokens.First().token.GetFullTextUntil(context._valueTokens.Last().token)
                : null;

            if (value == null)
            {
                if (optionDescriptor.IsBoolean)
                {
                    value = context.not == null ? "true" : "false";
                }
                else
                {
                    _contracts.AddError(context, "Pragma {0} expects a value", pragmaName);
                    return(null);
                }
            }

            if (!optionDescriptor.SetValue(value))
            {
                _contracts.AddError(context, "Invalid option value: '{0}' for {1}", value, pragmaName);
            }

            return(null);
        }