fix bug 609 -- removing traits that arent on an actor is an error.
This commit is contained in:
@@ -21,7 +21,8 @@ namespace OpenRA.FileFormats
|
|||||||
{
|
{
|
||||||
public struct SourceLocation
|
public struct SourceLocation
|
||||||
{
|
{
|
||||||
public string Filename; public int Line;
|
public string Filename; public int Line;
|
||||||
|
public override string ToString() { return "{0}:{1}".F(Filename, Line); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public SourceLocation Location;
|
public SourceLocation Location;
|
||||||
@@ -52,7 +53,12 @@ namespace OpenRA.FileFormats
|
|||||||
public MiniYamlNode( string k, string v, List<MiniYamlNode> n, SourceLocation loc )
|
public MiniYamlNode( string k, string v, List<MiniYamlNode> n, SourceLocation loc )
|
||||||
: this( k, new MiniYaml( v, n ), loc )
|
: this( k, new MiniYaml( v, n ), loc )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "{{YamlNode: {0} @ {1}}}".F(Key, Location);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MiniYaml
|
public class MiniYaml
|
||||||
@@ -95,7 +101,7 @@ namespace OpenRA.FileFormats
|
|||||||
var level = line.Length - t.Length;
|
var level = line.Length - t.Length;
|
||||||
|
|
||||||
if (levels.Count <= level)
|
if (levels.Count <= level)
|
||||||
throw new InvalidOperationException("Bad indent in miniyaml");
|
throw new YamlException("Bad indent in miniyaml");
|
||||||
while (levels.Count > level + 1)
|
while (levels.Count > level + 1)
|
||||||
levels.RemoveAt(levels.Count - 1);
|
levels.RemoveAt(levels.Count - 1);
|
||||||
|
|
||||||
@@ -169,9 +175,10 @@ namespace OpenRA.FileFormats
|
|||||||
|
|
||||||
var aDict = a.ToDictionary( x => x.Key );
|
var aDict = a.ToDictionary( x => x.Key );
|
||||||
var bDict = b.ToDictionary( x => x.Key );
|
var bDict = b.ToDictionary( x => x.Key );
|
||||||
var keys = aDict.Keys.Union( bDict.Keys ).ToList();
|
var keys = aDict.Keys.Union( bDict.Keys ).ToList();
|
||||||
|
|
||||||
var noInherit = keys.Where( x => x.Length > 0 && x[ 0 ] == '-' ).Select( x => x.Substring( 1 ) ).ToList();
|
var noInherit = keys.Where(x => x.Length > 0 && x[0] == '-')
|
||||||
|
.ToDictionary(x => x.Substring(1), x => false);
|
||||||
|
|
||||||
foreach( var key in keys )
|
foreach( var key in keys )
|
||||||
{
|
{
|
||||||
@@ -179,10 +186,11 @@ namespace OpenRA.FileFormats
|
|||||||
aDict.TryGetValue( key, out aa );
|
aDict.TryGetValue( key, out aa );
|
||||||
bDict.TryGetValue( key, out bb );
|
bDict.TryGetValue( key, out bb );
|
||||||
|
|
||||||
if( noInherit.Contains( key ) )
|
if( noInherit.ContainsKey( key ) )
|
||||||
{
|
{
|
||||||
if( aa != null )
|
// if( aa != null )
|
||||||
ret.Add( aa );
|
// ret.Add( aa );
|
||||||
|
noInherit[key] = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -190,7 +198,11 @@ namespace OpenRA.FileFormats
|
|||||||
var merged = ( aa == null || bb == null ) ? aa ?? bb : new MiniYamlNode( key, Merge( aa.Value, bb.Value ), loc );
|
var merged = ( aa == null || bb == null ) ? aa ?? bb : new MiniYamlNode( key, Merge( aa.Value, bb.Value ), loc );
|
||||||
ret.Add( merged );
|
ret.Add( merged );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (noInherit.ContainsValue(false))
|
||||||
|
throw new YamlException("Bogus yaml removals: {0}".F(
|
||||||
|
string.Join(", ", noInherit.Where(x => !x.Value).Select(x => x.Key).ToArray())));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -236,5 +248,10 @@ namespace OpenRA.FileFormats
|
|||||||
yield return "";
|
yield return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class YamlException : Exception
|
||||||
|
{
|
||||||
|
public YamlException(string s) : base(s) { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,14 +22,30 @@ namespace OpenRA
|
|||||||
public readonly TypeDictionary Traits = new TypeDictionary();
|
public readonly TypeDictionary Traits = new TypeDictionary();
|
||||||
|
|
||||||
public ActorInfo( string name, MiniYaml node, Dictionary<string, MiniYaml> allUnits )
|
public ActorInfo( string name, MiniYaml node, Dictionary<string, MiniYaml> allUnits )
|
||||||
{
|
{
|
||||||
var mergedNode = MergeWithParent( node, allUnits ).NodesDict;
|
try
|
||||||
|
{
|
||||||
Name = name;
|
var mergedNode = MergeWithParent(node, allUnits).NodesDict;
|
||||||
foreach( var t in mergedNode )
|
|
||||||
if( t.Key != "Inherits" && !t.Key.StartsWith("-") )
|
Name = name;
|
||||||
Traits.Add( LoadTraitInfo( t.Key.Split('@')[0], t.Value ) );
|
foreach (var t in mergedNode)
|
||||||
}
|
if (t.Key != "Inherits" && !t.Key.StartsWith("-"))
|
||||||
|
Traits.Add(LoadTraitInfo(t.Key.Split('@')[0], t.Value));
|
||||||
|
}
|
||||||
|
catch (YamlException e)
|
||||||
|
{
|
||||||
|
throw new YamlException("Actor type {0}: {1}".F(name, e.Message));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static IEnumerable<MiniYaml> GetInheritanceChain(MiniYaml node, Dictionary<string, MiniYaml> allUnits)
|
||||||
|
{
|
||||||
|
while (node != null)
|
||||||
|
{
|
||||||
|
yield return node;
|
||||||
|
node = GetParent(node, allUnits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static MiniYaml GetParent( MiniYaml node, Dictionary<string, MiniYaml> allUnits )
|
static MiniYaml GetParent( MiniYaml node, Dictionary<string, MiniYaml> allUnits )
|
||||||
{
|
{
|
||||||
@@ -49,9 +65,15 @@ namespace OpenRA
|
|||||||
|
|
||||||
static MiniYaml MergeWithParent( MiniYaml node, Dictionary<string, MiniYaml> allUnits )
|
static MiniYaml MergeWithParent( MiniYaml node, Dictionary<string, MiniYaml> allUnits )
|
||||||
{
|
{
|
||||||
var parent = GetParent( node, allUnits );
|
var parent = GetParent( node, allUnits );
|
||||||
if( parent != null )
|
if (parent != null)
|
||||||
return MiniYaml.Merge( node, MergeWithParent( parent, allUnits ) );
|
{
|
||||||
|
var result = MiniYaml.Merge(node, MergeWithParent(parent, allUnits));
|
||||||
|
|
||||||
|
// strip the '-'
|
||||||
|
result.Nodes.RemoveAll(a => a.Key.StartsWith("-"));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user