using System;
using System.Collections.Generic;
namespace NTERA.EmuEra.Game.EraEmu.Sub
{
[Serializable]
internal abstract class EmueraException : ApplicationException
{
protected EmueraException(string errormes, ScriptPosition position)
: base(errormes)
{
Position = position;
}
protected EmueraException(string errormes)
: base(errormes)
{
Position = null;
}
public ScriptPosition Position;
}
///
/// emuera本体に起因すると思われるエラー
///
[Serializable]
internal sealed class ExeEE : EmueraException
{
public ExeEE(string errormes)
: base(errormes)
{
}
public ExeEE(string errormes, ScriptPosition position)
: base(errormes, position)
{
}
}
///
/// スクリプト側に起因すると思われるエラー
///
[Serializable]
internal class CodeEE : EmueraException
{
public CodeEE(string errormes, ScriptPosition position)
: base(errormes, position)
{
}
public CodeEE(string errormes)
: base(errormes)
{
}
}
///
/// 未実装エラー
///
[Serializable]
internal sealed class NotImplCodeEE : CodeEE
{
public NotImplCodeEE(ScriptPosition position)
: base("This function cannot be used in the current version", position)
{
}
public NotImplCodeEE()
: base("This function cannot be used in the current version")
{
}
}
///
/// Save, Load中のエラー
///
[Serializable]
internal sealed class FileEE : EmueraException
{
public FileEE(string errormes)
: base(errormes)
{ }
}
///
/// エラー箇所を表示するための位置データ。整形前のデータなのでエラー表示以外の理由で参照するべきではない。
///
public class ScriptPosition : IEquatable, IEqualityComparer
{
public ScriptPosition(string srcLine)
{
LineNo = -1;
RowLine = srcLine != null ? string.Intern(srcLine) : srcLine;
Filename = "";
}
public ScriptPosition(string srcFile, int srcLineNo, string srcLine)
{
LineNo = srcLineNo;
RowLine = srcLine != null ? string.Intern(srcLine) : srcLine;
Filename = srcFile ?? "";
}
public readonly int LineNo;
public readonly string RowLine;
public readonly string Filename;
public override string ToString()
{
if(LineNo == -1)
return base.ToString();
return Filename + ":" + LineNo;
}
#region IEqualityComparer メンバ
public bool Equals(ScriptPosition x, ScriptPosition y)
{
if((x == null)||(y == null))
return false;
return ((x.Filename == y.Filename) && (x.LineNo == y.LineNo));
}
public int GetHashCode(ScriptPosition obj)
{
return Filename.GetHashCode() ^ LineNo.GetHashCode();
}
#endregion
#region IEquatable メンバ
public bool Equals(ScriptPosition other)
{
return Equals(this, other);
}
#endregion
}
}