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