in hydra/core/override_parser/overrides_visitor.py [0:0]
def visitOverride(self, ctx: OverrideParser.OverrideContext) -> Override:
override_type = OverrideType.CHANGE
children = ctx.getChildren()
first_node = next(children)
if isinstance(first_node, TerminalNodeImpl):
symbol_text = first_node.symbol.text
if symbol_text == "+":
override_type = OverrideType.ADD
key_node = next(children)
if self.is_matching_terminal(key_node, OverrideLexer.PLUS):
override_type = OverrideType.FORCE_ADD
key_node = next(children)
elif symbol_text == "~":
override_type = OverrideType.DEL
key_node = next(children)
else:
assert False
else:
key_node = first_node
key = self.visitKey(key_node)
value: Union[ChoiceSweep, RangeSweep, IntervalSweep, ParsedElementType]
eq_node = next(children)
if (
override_type == OverrideType.DEL
and isinstance(eq_node, TerminalNode)
and eq_node.symbol.type == Token.EOF
):
value = None
value_type = None
else:
assert self.is_matching_terminal(eq_node, OverrideLexer.EQUAL)
if ctx.value() is None:
value = ""
value_type = ValueType.ELEMENT
else:
value = self.visitValue(ctx.value())
if isinstance(value, ChoiceSweep):
if value.simple_form:
value_type = ValueType.SIMPLE_CHOICE_SWEEP
else:
value_type = ValueType.CHOICE_SWEEP
elif isinstance(value, Glob):
value_type = ValueType.GLOB_CHOICE_SWEEP
elif isinstance(value, IntervalSweep):
value_type = ValueType.INTERVAL_SWEEP
elif isinstance(value, RangeSweep):
value_type = ValueType.RANGE_SWEEP
else:
value_type = ValueType.ELEMENT
return Override(
type=override_type,
key_or_group=key.key_or_group,
_value=value,
value_type=value_type,
package=key.package,
)