private static bool CheckValiditySubroutine(string methodSignature, string argsSignature)
{
//ダイナミック要素の無いシグネチャはこれで素早く評価
if (methodSignature == argsSignature) return true;
//シンプルに先頭から調べる
if (methodSignature == "" && argsSignature != "") return false;
if (methodSignature != "" && argsSignature == "") return false;
bool success;
string msig = GetHeadToken(methodSignature, out success);
if (!success) return false;
string asig = GetHeadToken(argsSignature, out success);
if (!success) return false;
//引数側がDynamicなので無条件に引数を割り当ててしまってOK
if (msig == QiSignatures.TypeDynamic)
{
return CheckValiditySubroutine(methodSignature.Substring(1), argsSignature.Substring(asig.Length));
}
if (msig.Length == 1)
{
//組み込み型の場合
return msig == asig ?
CheckValiditySubroutine(methodSignature.Substring(1), argsSignature.Substring(1)) :
false;
}
else
{
//リスト,辞書,タプルの場合, 外側ひっぺがして内側を比較したあとで次に進む
return (
msig[0] == asig[0] &&
msig.Last() == asig.Last() &&
msig.Length > 1 &&
asig.Length > 1 &&
CheckValiditySubroutine(msig.Substring(1, msig.Length - 2), asig.Substring(1, asig.Length - 2))
) ?
CheckValiditySubroutine(methodSignature.Substring(msig.Length), argsSignature.Substring(asig.Length)) :
false;
}
}