コード例 #1
0
        /// <summary>
        /// Caseの代わりにifを出力
        /// </summary>
        /// <param name="caseItem">対象インスタンス</param>
        /// <param name="indent">インデント数</param>
        /// <returns>if構文</returns>
        private string CreateCaseIf(IItemSwitchCase caseItem, int indent)
        {
            var result = new StringBuilder();

            // 親(switch)を取得
            var parent = caseItem.Parent as IItemSwitch;

            // 対象は1行のみ
            var spaceLabelIndex = caseItem.Labels.First().FindIndex(label => label.Name == " ");
            var targetLabels    = caseItem.Labels.First().GetRange(0, spaceLabelIndex);

            // 条件を作成
            var conditions = new List <IExpression>();

            // 左辺値
            conditions.AddRange(parent.Conditions);
            // is
            conditions.Add(null);
            // 右辺値
            conditions.AddRange(targetLabels);

            result.Append($"{GetIndentSpace(indent)}if (");

            result.Append(ConvertConditions(conditions));

            result.AppendLine($") {{");

            // ローカルフィールドを作成
            result.AppendLine($"{GetIndentSpace(indent + 1)}let {caseItem.Name}: {ExpressionsToString(targetLabels)} = {ExpressionsToString(parent.Conditions)};");

            return(result.ToString());
        }
コード例 #2
0
ファイル: SwitchTest.cs プロジェクト: kazenetu/CSharpAnalyze
        /// <summary>
        /// SwitchCaseテートメントの確認
        /// </summary>
        /// <param name="target">対象インスタンス</param>
        /// <param name="labels">条件式</param>
        private bool checkSwitchCase(IItemSwitchCase target, List <string> labels)
        {
            Assert.NotNull(target);
            var actualLables = target.Labels.Select(item => GetExpressionsToString(item));

            Assert.Equal(labels, actualLables);
            Assert.Equal(labels.Count, actualLables.Count());

            return(true);
        }
コード例 #3
0
        /// <summary>
        /// caseがtypeチェックならびにローカルフィールド設定を行っているか
        /// </summary>
        /// <param name="caseItem">対象インスタンス</param>
        /// <returns>typeチェックとローカルフィールド設定か否か</returns>
        private bool ExistsTypeCase(IItemSwitchCase caseItem)
        {
            if (caseItem is null)
            {
                return(false);
            }

            var types = caseItem.Labels.Where(label => label.Exists(exp => exp.Name == " "));

            return(types.Any());
        }
コード例 #4
0
        /// <summary>
        /// 変換メソッド:case
        /// </summary>
        /// <param name="item">C#解析結果</param>
        /// <param name="config">設定情報</param>
        /// <param name="indent">インデント数</param>
        /// <param name="otherScripts">その他のスクリプト(内部クラスなど)</param>
        /// <returns>TypeScript変換結果</returns>
        private string Convert(IItemSwitchCase item, Config config, int indent, List <string> otherScripts)
        {
            var result      = new StringBuilder();
            var indentSpace = GetIndentSpace(indent);

            // コメント
            result.Append(GetTypeScriptComments(item, indentSpace));

            // typeチェックとローカルフィールド設定か否か
            var existsTypes = ExistsTypeCase(item);

            // 定義 case か if の出力分岐
            if (existsTypes)
            {
                result.Append(CreateCaseIf(item, indent));
            }
            else
            {
                // case
                foreach (var label in item.Labels)
                {
                    result.Append($"{indentSpace}");
                    if (label.First().TypeName != "Default")
                    {
                        result.Append("case ");
                    }
                    result.AppendLine($"{ExpressionsToString(label)}:");
                }
            }

            // メンバー追加
            foreach (var member in item.Members)
            {
                // if構文に変化した場合はbreakを除外
                if (existsTypes && member is IItemBreak)
                {
                    continue;
                }

                result.Append(ConvertUtility.Convert(member, config, indent + 1, otherScripts));
            }

            if (existsTypes)
            {
                // if : ブロック終了
                result.AppendLine($"{indentSpace}}}");
            }

            return(result.ToString());
        }