static Rule CreateRuleFromContext(DeltinScriptParser.Ow_ruleContext ruleContext) { string ruleName = ruleContext.STRINGLITERAL().GetText(); ruleName = ruleName.Substring(1, ruleName.Length - 2); RuleEvent ruleEvent = RuleEvent.Ongoing_Global; TeamSelector team = TeamSelector.All; PlayerSelector player = PlayerSelector.All; { var additionalArgs = ruleContext.expr(); foreach (var arg in additionalArgs) { string type = arg.GetText().Split('.').ElementAtOrDefault(0); string name = arg.GetText().Split('.').ElementAtOrDefault(1); if (type == "Event") { if (Enum.TryParse(name, out RuleEvent setEvent)) { ruleEvent = setEvent; } else { throw new SyntaxErrorException($"Unknown event type \"{arg.GetText()}\".", arg.start); } } else if (type == "Team") { if (Enum.TryParse(name, out TeamSelector setTeam)) { team = setTeam; } else { throw new SyntaxErrorException($"Unknown team type \"{arg.GetText()}\".", arg.start); } } else if (type == "Player") { if (Enum.TryParse(name, out PlayerSelector setPlayer)) { player = setPlayer; } else { throw new SyntaxErrorException($"Unknown player type \"{arg.GetText()}\".", arg.start); } } else { throw new SyntaxErrorException($"Unknown rule argument \"{arg.GetText()}\".", arg.start); } } } return(new Rule(ruleName, ruleEvent, team, player)); }
private void GetRuleSettings(ParseInfo parseInfo, Scope scope, DeltinScriptParser.Ow_ruleContext ruleContext) { DeltinScriptParser.ExprContext eventContext = null; DeltinScriptParser.ExprContext teamContext = null; DeltinScriptParser.ExprContext playerContext = null; foreach (var exprContext in ruleContext.expr()) { missingBlockRange = DocRange.GetRange(exprContext); EnumValuePair enumSetting = (ExpressionTree.ResultingExpression(parseInfo.GetExpression(scope, exprContext)) as CallVariableAction)?.Calling as EnumValuePair; EnumData enumData = enumSetting?.Member.Enum; if (enumData == null || !ValidRuleEnums.Contains(enumData)) { parseInfo.Script.Diagnostics.Error("Expected enum of type " + string.Join(", ", ValidRuleEnums.Select(vre => vre.CodeName)) + ".", DocRange.GetRange(exprContext)); } else { var alreadySet = new Diagnostic("The " + enumData.CodeName + " rule setting was already set.", DocRange.GetRange(exprContext), Diagnostic.Error); // Get the Event option. if (enumData == EnumData.GetEnum <RuleEvent>()) { if (_setEventType) { parseInfo.Script.Diagnostics.AddDiagnostic(alreadySet); } EventType = (RuleEvent)enumSetting.Member.Value; _setEventType = true; eventContext = exprContext; } // Get the Team option. if (enumData == EnumData.GetEnum <Team>()) { if (_setTeam) { parseInfo.Script.Diagnostics.AddDiagnostic(alreadySet); } Team = (Team)enumSetting.Member.Value; _setTeam = true; teamContext = exprContext; } // Get the Player option. if (enumData == EnumData.GetEnum <PlayerSelector>()) { if (_setPlayer) { parseInfo.Script.Diagnostics.AddDiagnostic(alreadySet); } Player = (PlayerSelector)enumSetting.Member.Value; _setPlayer = true; playerContext = exprContext; } } } // Syntax error if changing the Team type when the Event type is set to Global. if (_setEventType && EventType == RuleEvent.OngoingGlobal) { if (Team != Team.All) { parseInfo.Script.Diagnostics.Error("Can't change rule Team type with an event type of Ongoing Global.", DocRange.GetRange(teamContext)); } if (Player != PlayerSelector.All) { parseInfo.Script.Diagnostics.Error("Can't change rule Player type with an event type of Ongoing Global.", DocRange.GetRange(playerContext)); } } }