/// <summary> /// Wraps this <see cref="HoconValue" /> into a new <see cref="HoconObject" /> at the specified key. /// </summary> /// <param name="key">The key designated to be the new root element.</param> /// <returns>A new HOCON root.</returns> /// <remarks> /// Immutable. Performs a deep copy on this <see cref="HoconValue" /> first. /// </remarks> public HoconRoot AtKey(string key) { var value = new HoconValue(null); var obj = new HoconObject(value); var field = new HoconField(key, obj); field.SetValue(Clone(field) as HoconValue); obj.Add(key, field); value.Add(obj); return(new HoconRoot(value)); }
private HoconField ParseField(HoconObject owner) { // sanity check if (_tokens.Current.Type != TokenType.LiteralValue) { throw HoconParserException.Create(_tokens.Current, Path, $"Failed to parse Hocon field. Expected start of field {TokenType.LiteralValue}, " + $"found {_tokens.Current.Type} instead."); } var pathDelta = ParseKey(); if (_tokens.Current.IsNonSignificant()) { ConsumeWhitelines(); } // sanity check if (_tokens.Current.Type != TokenType.Assign && _tokens.Current.Type != TokenType.StartOfObject && _tokens.Current.Type != TokenType.PlusEqualAssign) { throw HoconParserException.Create(_tokens.Current, Path, $"Failed to parse Hocon field. Expected {TokenType.Assign}, {TokenType.StartOfObject} " + $"or {TokenType.PlusEqualAssign}, found {{_tokens.Current.Type}} instead."); } // sanity check if (pathDelta == null || pathDelta.Count == 0) { throw HoconParserException.Create(_tokens.Current, Path, "Failed to parse Hocon field. ParseField() was called with null or empty path"); } List <HoconField> childInPath = owner.TraversePath(pathDelta); Path.AddRange(pathDelta); HoconField currentField = childInPath[childInPath.Count - 1]; var parsedValue = ParseValue(currentField); foreach (var removedSub in currentField.SetValue(parsedValue)) { _substitutions.Remove(removedSub); } Path.RemoveRange(Path.Count - pathDelta.Count, pathDelta.Count); return(childInPath[0]); }