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 } }