(ast, retArr)
| 926 | } |
| 927 | |
| 928 | astSwitchStatement(ast, retArr) { |
| 929 | if (ast.type !== 'SwitchStatement') { |
| 930 | throw this.astErrorOutput('Invalid switch statement', ast); |
| 931 | } |
| 932 | const { discriminant, cases } = ast; |
| 933 | const type = this.getType(discriminant); |
| 934 | const varName = `switchDiscriminant${this.astKey(ast, '_')}`; |
| 935 | switch (type) { |
| 936 | case 'Float': |
| 937 | case 'Number': |
| 938 | retArr.push(`float ${varName} = `); |
| 939 | this.astGeneric(discriminant, retArr); |
| 940 | retArr.push(';\n'); |
| 941 | break; |
| 942 | case 'Integer': |
| 943 | retArr.push(`int ${varName} = `); |
| 944 | this.astGeneric(discriminant, retArr); |
| 945 | retArr.push(';\n'); |
| 946 | break; |
| 947 | } |
| 948 | // switch with just a default: |
| 949 | if (cases.length === 1 && !cases[0].test) { |
| 950 | this.astGeneric(cases[0].consequent, retArr); |
| 951 | return retArr; |
| 952 | } |
| 953 | |
| 954 | // regular switches: |
| 955 | let fallingThrough = false; |
| 956 | let defaultResult = []; |
| 957 | let movingDefaultToEnd = false; |
| 958 | let pastFirstIf = false; |
| 959 | for (let i = 0; i < cases.length; i++) { |
| 960 | // default |
| 961 | if (!cases[i].test) { |
| 962 | if (cases.length > i + 1) { |
| 963 | movingDefaultToEnd = true; |
| 964 | this.astGeneric(cases[i].consequent, defaultResult); |
| 965 | continue; |
| 966 | } else { |
| 967 | retArr.push(' else {\n'); |
| 968 | } |
| 969 | } else { |
| 970 | // all others |
| 971 | if (i === 0 || !pastFirstIf) { |
| 972 | pastFirstIf = true; |
| 973 | retArr.push(`if (${varName} == `); |
| 974 | } else { |
| 975 | if (fallingThrough) { |
| 976 | retArr.push(`${varName} == `); |
| 977 | fallingThrough = false; |
| 978 | } else { |
| 979 | retArr.push(` else if (${varName} == `); |
| 980 | } |
| 981 | } |
| 982 | if (type === 'Integer') { |
| 983 | const testType = this.getType(cases[i].test); |
| 984 | switch (testType) { |
| 985 | case 'Number': |
nothing calls this directly
no test coverage detected