Introduce MapKeyNode interface to limit node types for map key #312
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This pull request introduces
ast.MapKeyNode
interface for the following reasons.MappingValueNode
never allowed as a map key. But current AST allows to create such unexpected maps. This PR changes the argumentkey
ofast.MappingValue
toast.MapKeyNode
to prohibit creating unexpected maps.ast
package,stringWithoutComment() string
is implemented for all node types, but this method is only required for map key types.CommentNode
havingstringWithoutComment
looks very weird. So I removed all the unnecessarystringWithoutComment
implementations.For
ast
package users, following is the complete list of the changes.ast.MapKeyNode
is introduced. All the node types implementingast.ScalarNode
andast.MergeKeyNode
,ast.MappingKeyNode
satisfyast.MapKeyNode
. Note thatast.LiteralNode
never appears as map key but is a scalar node thus satisfiesast.MapKeyNode
.ast.Null
,ast.Bool
,ast.Integer
,ast.Float
now return the concrete types instead ofast.Node
(Ref: The implementing package should return concrete (usually pointer or struct) types).ast.MappingValue
now acceptskey ast.MapKeyNode
instead ofast.Node
. Also,func (*MapNodeIter) Key()
now returnsast.MapKeyNode
instead ofast.Node
.