line numbers in yaml

This commit is contained in:
Bob
2010-08-27 14:02:51 +12:00
committed by Chris Forbes
parent 2f92b873e8
commit 2a7857570a

View File

@@ -19,6 +19,12 @@ namespace OpenRA.FileFormats
public class MiniYamlNode public class MiniYamlNode
{ {
public struct SourceLocation
{
public string Filename; public int Line;
}
public SourceLocation Location;
public string Key; public string Key;
public MiniYaml Value; public MiniYaml Value;
@@ -28,14 +34,25 @@ namespace OpenRA.FileFormats
Value = v; Value = v;
} }
public MiniYamlNode( string k, MiniYaml v, SourceLocation loc )
: this( k, v )
{
Location = loc;
}
public MiniYamlNode( string k, string v ) public MiniYamlNode( string k, string v )
: this( k, new MiniYaml( v, null ) ) : this( k, v, null )
{ {
} }
public MiniYamlNode( string k, string v, List<MiniYamlNode> n ) public MiniYamlNode( string k, string v, List<MiniYamlNode> n )
: this( k, new MiniYaml( v, n ) ) : this( k, new MiniYaml( v, n ) )
{ {
} }
public MiniYamlNode( string k, string v, List<MiniYamlNode> n, SourceLocation loc )
: this( k, new MiniYaml( v, n ), loc )
{
}
} }
public class MiniYaml public class MiniYaml
@@ -63,13 +80,15 @@ namespace OpenRA.FileFormats
return new MiniYaml( null, list.Select( x => new MiniYamlNode( x.ToString(), new MiniYaml( null ) ) ).ToList() ); return new MiniYaml( null, list.Select( x => new MiniYamlNode( x.ToString(), new MiniYaml( null ) ) ).ToList() );
} }
static List<MiniYamlNode> FromLines(string[] lines) static List<MiniYamlNode> FromLines(string[] lines, string filename)
{ {
var levels = new List<List<MiniYamlNode>>(); var levels = new List<List<MiniYamlNode>>();
levels.Add(new List<MiniYamlNode>()); levels.Add(new List<MiniYamlNode>());
var lineNo = 0;
foreach (var line in lines) foreach (var line in lines)
{ {
++lineNo;
var t = line.TrimStart(' ', '\t'); var t = line.TrimStart(' ', '\t');
if (t.Length == 0 || t[0] == '#') if (t.Length == 0 || t[0] == '#')
continue; continue;
@@ -80,27 +99,27 @@ namespace OpenRA.FileFormats
while (levels.Count > level + 1) while (levels.Count > level + 1)
levels.RemoveAt(levels.Count - 1); levels.RemoveAt(levels.Count - 1);
var colon = t.IndexOf(':');
var d = new List<MiniYamlNode>(); var d = new List<MiniYamlNode>();
try var rhs = SplitAtColon( ref t );
{ levels[ level ].Add( new MiniYamlNode( t, rhs, d, new MiniYamlNode.SourceLocation { Filename = filename, Line = lineNo } ) );
if( colon == -1 )
levels[ level ].Add( new MiniYamlNode( t.Trim(), new MiniYaml( null, d ) ) );
else
{
var value = t.Substring( colon + 1 ).Trim();
if( value.Length == 0 )
value = null;
levels[ level ].Add( new MiniYamlNode( t.Substring( 0, colon ).Trim(), new MiniYaml( value, d ) ) );
}
}
catch (ArgumentException) { throw new InvalidDataException("Duplicate Identifier:`{0}`".F(t)); }
levels.Add(d); levels.Add(d);
} }
return levels[ 0 ]; return levels[ 0 ];
} }
static string SplitAtColon( ref string t )
{
var colon = t.IndexOf(':');
if( colon == -1 )
return null;
var ret = t.Substring( colon + 1 ).Trim();
if( ret.Length == 0 )
ret = null;
t = t.Substring( 0, colon ).Trim();
return ret;
}
public static List<MiniYamlNode> FromFileInPackage( string path ) public static List<MiniYamlNode> FromFileInPackage( string path )
{ {
StreamReader reader = new StreamReader( FileSystem.Open(path) ); StreamReader reader = new StreamReader( FileSystem.Open(path) );
@@ -110,7 +129,7 @@ namespace OpenRA.FileFormats
lines.Add(reader.ReadLine()); lines.Add(reader.ReadLine());
reader.Close(); reader.Close();
return FromLines(lines.ToArray()); return FromLines(lines.ToArray(), path);
} }
public static Dictionary<string, MiniYaml> DictFromFile( string path ) public static Dictionary<string, MiniYaml> DictFromFile( string path )
@@ -125,7 +144,7 @@ namespace OpenRA.FileFormats
public static List<MiniYamlNode> FromFile( string path ) public static List<MiniYamlNode> FromFile( string path )
{ {
return FromLines(File.ReadAllLines( path )); return FromLines(File.ReadAllLines( path ), path);
} }
public static List<MiniYamlNode> FromStream(Stream s) public static List<MiniYamlNode> FromStream(Stream s)
@@ -136,7 +155,7 @@ namespace OpenRA.FileFormats
public static List<MiniYamlNode> FromString(string text) public static List<MiniYamlNode> FromString(string text)
{ {
return FromLines(text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries)); return FromLines(text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries), "<no filename available>");
} }
public static List<MiniYamlNode> Merge( List<MiniYamlNode> a, List<MiniYamlNode> b ) public static List<MiniYamlNode> Merge( List<MiniYamlNode> a, List<MiniYamlNode> b )