@specs-feup/clava-misra 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitignore +117 -0
- package/README.md +70 -15
- package/dist/MISRA.d.ts +129 -0
- package/dist/MISRA.d.ts.map +1 -0
- package/dist/MISRA.js +245 -0
- package/dist/MISRA.js.map +1 -0
- package/dist/MISRAContext.d.ts +21 -0
- package/dist/MISRAContext.d.ts.map +1 -0
- package/dist/MISRAContext.js +75 -0
- package/dist/MISRAContext.js.map +1 -0
- package/dist/MISRARule.d.ts +56 -0
- package/dist/MISRARule.d.ts.map +1 -0
- package/dist/MISRARule.js +45 -0
- package/dist/MISRARule.js.map +1 -0
- package/dist/MISRATool.d.ts +12 -0
- package/dist/MISRATool.d.ts.map +1 -0
- package/dist/MISRATool.js +84 -0
- package/dist/MISRATool.js.map +1 -0
- package/dist/foo.d.ts +2 -0
- package/dist/foo.d.ts.map +1 -0
- package/{src/foo.ts → dist/foo.js} +3 -2
- package/dist/foo.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -0
- package/dist/misra/MISRAAnalyser.d.ts +14 -0
- package/dist/misra/MISRAAnalyser.d.ts.map +1 -0
- package/{src/misra/MISRAAnalyser.ts → dist/misra/MISRAAnalyser.js} +13 -23
- package/dist/misra/MISRAAnalyser.js.map +1 -0
- package/dist/misra/MISRAPass.d.ts +27 -0
- package/dist/misra/MISRAPass.d.ts.map +1 -0
- package/dist/misra/MISRAPass.js +60 -0
- package/dist/misra/MISRAPass.js.map +1 -0
- package/dist/misra/MISRAPassResult.d.ts +13 -0
- package/dist/misra/MISRAPassResult.d.ts.map +1 -0
- package/dist/misra/MISRAPassResult.js +11 -0
- package/dist/misra/MISRAPassResult.js.map +1 -0
- package/dist/misra/MISRAReporter.d.ts +20 -0
- package/dist/misra/MISRAReporter.d.ts.map +1 -0
- package/dist/misra/MISRAReporter.js +43 -0
- package/dist/misra/MISRAReporter.js.map +1 -0
- package/dist/misra/passes/S10_EssentialTypePass.d.ts +42 -0
- package/dist/misra/passes/S10_EssentialTypePass.d.ts.map +1 -0
- package/dist/misra/passes/S10_EssentialTypePass.js +370 -0
- package/dist/misra/passes/S10_EssentialTypePass.js.map +1 -0
- package/dist/misra/passes/S12_ExpressionPass.d.ts +18 -0
- package/dist/misra/passes/S12_ExpressionPass.d.ts.map +1 -0
- package/dist/misra/passes/S12_ExpressionPass.js +72 -0
- package/dist/misra/passes/S12_ExpressionPass.js.map +1 -0
- package/dist/misra/passes/S13_SideEffectPass.d.ts +18 -0
- package/dist/misra/passes/S13_SideEffectPass.d.ts.map +1 -0
- package/dist/misra/passes/S13_SideEffectPass.js +105 -0
- package/dist/misra/passes/S13_SideEffectPass.js.map +1 -0
- package/dist/misra/passes/S15_ControlFlowPass.d.ts +19 -0
- package/dist/misra/passes/S15_ControlFlowPass.d.ts.map +1 -0
- package/dist/misra/passes/S15_ControlFlowPass.js +94 -0
- package/dist/misra/passes/S15_ControlFlowPass.js.map +1 -0
- package/dist/misra/passes/S16_SwitchStatementPass.d.ts +17 -0
- package/dist/misra/passes/S16_SwitchStatementPass.d.ts.map +1 -0
- package/dist/misra/passes/S16_SwitchStatementPass.js +152 -0
- package/dist/misra/passes/S16_SwitchStatementPass.js.map +1 -0
- package/dist/misra/passes/S17_FunctionPass.d.ts +12 -0
- package/dist/misra/passes/S17_FunctionPass.d.ts.map +1 -0
- package/dist/misra/passes/S17_FunctionPass.js +38 -0
- package/dist/misra/passes/S17_FunctionPass.js.map +1 -0
- package/dist/misra/passes/S18_PointersArraysPass.d.ts +17 -0
- package/dist/misra/passes/S18_PointersArraysPass.d.ts.map +1 -0
- package/dist/misra/passes/S18_PointersArraysPass.js +115 -0
- package/dist/misra/passes/S18_PointersArraysPass.js.map +1 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.d.ts +11 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.d.ts.map +1 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.js +20 -0
- package/dist/misra/passes/S19_OverlappingStoragePass.js.map +1 -0
- package/dist/misra/passes/S21_StandardLibPass.d.ts +20 -0
- package/dist/misra/passes/S21_StandardLibPass.d.ts.map +1 -0
- package/dist/misra/passes/S21_StandardLibPass.js +77 -0
- package/dist/misra/passes/S21_StandardLibPass.js.map +1 -0
- package/dist/misra/passes/S3_CommentPass.d.ts +12 -0
- package/dist/misra/passes/S3_CommentPass.d.ts.map +1 -0
- package/dist/misra/passes/S3_CommentPass.js +27 -0
- package/dist/misra/passes/S3_CommentPass.js.map +1 -0
- package/dist/misra/passes/S5_IdentifierPass.d.ts +13 -0
- package/dist/misra/passes/S5_IdentifierPass.d.ts.map +1 -0
- package/dist/misra/passes/S5_IdentifierPass.js +60 -0
- package/dist/misra/passes/S5_IdentifierPass.js.map +1 -0
- package/dist/misra/passes/S6_TypePass.d.ts +11 -0
- package/dist/misra/passes/S6_TypePass.d.ts.map +1 -0
- package/dist/misra/passes/S6_TypePass.js +25 -0
- package/dist/misra/passes/S6_TypePass.js.map +1 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.d.ts +14 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.d.ts.map +1 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.js +71 -0
- package/dist/misra/passes/S7_LiteralsConstantsPass.js.map +1 -0
- package/dist/misra/passes/S8_DeclDefPass.d.ts +18 -0
- package/dist/misra/passes/S8_DeclDefPass.d.ts.map +1 -0
- package/dist/misra/passes/S8_DeclDefPass.js +127 -0
- package/dist/misra/passes/S8_DeclDefPass.js.map +1 -0
- package/dist/misra/sections/Section10_EssentialTypeModel.d.ts +33 -0
- package/dist/misra/sections/Section10_EssentialTypeModel.d.ts.map +1 -0
- package/{src/misra/sections/Section10_EssentialTypeModel.ts → dist/misra/sections/Section10_EssentialTypeModel.js} +58 -73
- package/dist/misra/sections/Section10_EssentialTypeModel.js.map +1 -0
- package/dist/misra/sections/Section11_PointerTypeConversions.d.ts +12 -0
- package/dist/misra/sections/Section11_PointerTypeConversions.d.ts.map +1 -0
- package/{src/misra/sections/Section11_PointerTypeConversions.ts → dist/misra/sections/Section11_PointerTypeConversions.js} +16 -27
- package/dist/misra/sections/Section11_PointerTypeConversions.js.map +1 -0
- package/dist/misra/sections/Section12_Expressions.d.ts +15 -0
- package/dist/misra/sections/Section12_Expressions.d.ts.map +1 -0
- package/dist/misra/sections/Section12_Expressions.js +70 -0
- package/dist/misra/sections/Section12_Expressions.js.map +1 -0
- package/dist/misra/sections/Section13_SideEffects.d.ts +14 -0
- package/dist/misra/sections/Section13_SideEffects.d.ts.map +1 -0
- package/dist/misra/sections/Section13_SideEffects.js +90 -0
- package/dist/misra/sections/Section13_SideEffects.js.map +1 -0
- package/dist/misra/sections/Section14_ControlStmtExprs.d.ts +8 -0
- package/dist/misra/sections/Section14_ControlStmtExprs.d.ts.map +1 -0
- package/{src/misra/sections/Section14_ControlStmtExprs.ts → dist/misra/sections/Section14_ControlStmtExprs.js} +8 -10
- package/dist/misra/sections/Section14_ControlStmtExprs.js.map +1 -0
- package/dist/misra/sections/Section15_ControlFlow.d.ts +14 -0
- package/dist/misra/sections/Section15_ControlFlow.d.ts.map +1 -0
- package/dist/misra/sections/Section15_ControlFlow.js +97 -0
- package/dist/misra/sections/Section15_ControlFlow.js.map +1 -0
- package/dist/misra/sections/Section16_SwitchStatements.d.ts +13 -0
- package/dist/misra/sections/Section16_SwitchStatements.d.ts.map +1 -0
- package/{src/misra/sections/Section16_SwitchStatements.ts → dist/misra/sections/Section16_SwitchStatements.js} +49 -74
- package/dist/misra/sections/Section16_SwitchStatements.js.map +1 -0
- package/dist/misra/sections/Section17_Functions.d.ts +9 -0
- package/dist/misra/sections/Section17_Functions.d.ts.map +1 -0
- package/{src/misra/sections/Section17_Functions.ts → dist/misra/sections/Section17_Functions.js} +10 -13
- package/dist/misra/sections/Section17_Functions.js.map +1 -0
- package/dist/misra/sections/Section18_PointersAndArrays.d.ts +13 -0
- package/dist/misra/sections/Section18_PointersAndArrays.d.ts.map +1 -0
- package/{src/misra/sections/Section18_PointersAndArrays.ts → dist/misra/sections/Section18_PointersAndArrays.js} +36 -40
- package/dist/misra/sections/Section18_PointersAndArrays.js.map +1 -0
- package/dist/misra/sections/Section19_OverlappingStorage.d.ts +8 -0
- package/dist/misra/sections/Section19_OverlappingStorage.d.ts.map +1 -0
- package/dist/misra/sections/Section19_OverlappingStorage.js +16 -0
- package/dist/misra/sections/Section19_OverlappingStorage.js.map +1 -0
- package/dist/misra/sections/Section20_PreprocessingDirectives.d.ts +8 -0
- package/dist/misra/sections/Section20_PreprocessingDirectives.d.ts.map +1 -0
- package/{src/misra/sections/Section20_PreprocessingDirectives.ts → dist/misra/sections/Section20_PreprocessingDirectives.js} +7 -9
- package/dist/misra/sections/Section20_PreprocessingDirectives.js.map +1 -0
- package/dist/misra/sections/Section21_StandardLibraries.d.ts +17 -0
- package/dist/misra/sections/Section21_StandardLibraries.d.ts.map +1 -0
- package/dist/misra/sections/Section21_StandardLibraries.js +54 -0
- package/dist/misra/sections/Section21_StandardLibraries.js.map +1 -0
- package/dist/misra/sections/Section2_UnusedCode.d.ts +9 -0
- package/dist/misra/sections/Section2_UnusedCode.d.ts.map +1 -0
- package/{src/misra/sections/Section2_UnusedCode.ts → dist/misra/sections/Section2_UnusedCode.js} +11 -16
- package/dist/misra/sections/Section2_UnusedCode.js.map +1 -0
- package/dist/misra/sections/Section3_Comments.d.ts +9 -0
- package/dist/misra/sections/Section3_Comments.d.ts.map +1 -0
- package/{src/misra/sections/Section3_Comments.ts → dist/misra/sections/Section3_Comments.js} +7 -10
- package/dist/misra/sections/Section3_Comments.js.map +1 -0
- package/dist/misra/sections/Section5_Identifiers.d.ts +12 -0
- package/dist/misra/sections/Section5_Identifiers.d.ts.map +1 -0
- package/dist/misra/sections/Section5_Identifiers.js +139 -0
- package/dist/misra/sections/Section5_Identifiers.js.map +1 -0
- package/dist/misra/sections/Section6_Types.d.ts +8 -0
- package/dist/misra/sections/Section6_Types.d.ts.map +1 -0
- package/dist/misra/sections/Section6_Types.js +23 -0
- package/dist/misra/sections/Section6_Types.js.map +1 -0
- package/dist/misra/sections/Section7_LiteralsConstants.d.ts +11 -0
- package/dist/misra/sections/Section7_LiteralsConstants.d.ts.map +1 -0
- package/{src/misra/sections/Section7_LiteralsConstants.ts → dist/misra/sections/Section7_LiteralsConstants.js} +18 -25
- package/dist/misra/sections/Section7_LiteralsConstants.js.map +1 -0
- package/dist/misra/sections/Section8_DeclarationsDefinitions.d.ts +15 -0
- package/dist/misra/sections/Section8_DeclarationsDefinitions.d.ts.map +1 -0
- package/{src/misra/sections/Section8_DeclarationsDefinitions.ts → dist/misra/sections/Section8_DeclarationsDefinitions.js} +18 -33
- package/dist/misra/sections/Section8_DeclarationsDefinitions.js.map +1 -0
- package/dist/misra/tests/utils.d.ts +10 -0
- package/dist/misra/tests/utils.d.ts.map +1 -0
- package/dist/misra/tests/utils.js +33 -0
- package/dist/misra/tests/utils.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts +15 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js +33 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts +16 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js +60 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts +19 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js +42 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts +43 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js +103 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts +26 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js +49 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts +26 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts.map +1 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js +49 -0
- package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts +31 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js +71 -0
- package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts +27 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js +58 -0
- package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts +28 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts.map +1 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js +44 -0
- package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js.map +1 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.d.ts +55 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.d.ts.map +1 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js +108 -0
- package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts +43 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js +68 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts +29 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js +53 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts +15 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js +35 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts +13 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts.map +1 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js +53 -0
- package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts +13 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js +32 -0
- package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.d.ts +10 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.d.ts.map +1 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.js +26 -0
- package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.js.map +1 -0
- package/dist/rules/index.d.ts +20 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +38 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/tests/Section17_Functions/misra_config.json +10 -0
- package/dist/tests/utils.d.ts +10 -0
- package/dist/tests/utils.d.ts.map +1 -0
- package/dist/tests/utils.js +29 -0
- package/dist/tests/utils.js.map +1 -0
- package/dist/utils/utils.d.ts +102 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +202 -0
- package/dist/utils/utils.js.map +1 -0
- package/jest.config.js +6 -6
- package/package.json +44 -8
- package/src/MISRA.ts +276 -0
- package/src/MISRAContext.ts +84 -0
- package/src/MISRARule.ts +64 -0
- package/src/MISRATool.ts +95 -0
- package/src/main.ts +4 -33
- package/src/misra-old/MISRAAnalyser.ts +60 -0
- package/src/misra-old/MISRAAnalyserResult.ts +16 -0
- package/src/misra-old/sections/Section10_EssentialTypeModel.ts +377 -0
- package/src/misra-old/sections/Section11_PointerTypeConversions.ts +104 -0
- package/src/{misra → misra-old}/sections/Section12_Expressions.ts +7 -7
- package/src/{misra → misra-old}/sections/Section13_SideEffects.ts +15 -15
- package/src/misra-old/sections/Section14_ControlStmtExprs.ts +27 -0
- package/src/{misra → misra-old}/sections/Section15_ControlFlow.ts +10 -10
- package/src/misra-old/sections/Section18_PointersAndArrays.ts +108 -0
- package/src/{misra → misra-old}/sections/Section19_OverlappingStorage.ts +4 -4
- package/src/misra-old/sections/Section20_PreprocessingDirectives.ts +22 -0
- package/src/misra-old/sections/Section21_StandardLibraries.ts +99 -0
- package/src/{misra → misra-old}/sections/Section5_Identifiers.ts +16 -15
- package/src/{misra → misra-old}/sections/Section6_Types.ts +4 -4
- package/src/misra-old/sections/Section7_LiteralsConstants.ts +76 -0
- package/src/misra-old/sections/Section8_DeclarationsDefinitions.ts +133 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts +41 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts +70 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts +41 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.ts +113 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.ts +61 -0
- package/src/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.ts +57 -0
- package/src/rules/Section17_Functions/Rule_17_3_ImplicitFunction.ts +180 -0
- package/src/rules/Section17_Functions/Rule_17_4_NonVoidReturn.ts +91 -0
- package/src/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.ts +68 -0
- package/src/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.ts +49 -0
- package/src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts +120 -0
- package/src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts +78 -0
- package/src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts +61 -0
- package/src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts +47 -0
- package/src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts +67 -0
- package/src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts +41 -0
- package/src/rules/Section3_Comments/Rule_3_2_LineSplicing.ts +36 -0
- package/src/rules/index.ts +44 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.test.ts +55 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.test.ts +70 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.test.ts +128 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.test.ts +132 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.test.ts +146 -0
- package/src/tests/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.test.ts +102 -0
- package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions.test.ts +79 -0
- package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn.test.ts +98 -0
- package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn_MissingConfig.test.ts +77 -0
- package/src/tests/Section17_Functions/Rule_17_6_StaticArraySizeParam.test.ts +36 -0
- package/src/tests/Section17_Functions/Rule_17_7_UnusedReturnValue.test.ts +44 -0
- package/src/tests/Section17_Functions/misra_config.json +19 -0
- package/src/tests/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.test.ts +175 -0
- package/src/tests/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.test.ts +219 -0
- package/src/tests/Section2_UnusedCode/Rule_2_6_UnusedLabels.test.ts +49 -0
- package/src/tests/Section2_UnusedCode/Rule_2_7_UnusedParameters.test.ts +55 -0
- package/src/tests/Section3_Comments/Rule_3_1_CommentSequences.test.ts +37 -0
- package/src/tests/utils.ts +51 -0
- package/src/utils/utils.ts +280 -0
- package/tsconfig.json +4 -3
- package/typedoc.config.js +1 -1
- package/CxxSources/lib.cpp +0 -3
- package/CxxSources/lib.h +0 -8
- package/CxxSources/main.cpp +0 -40
- package/TODO.md +0 -1
- package/consumer_order.txt +0 -2
- package/enum_integer_type.txt +0 -0
- package/is_temporary.txt +0 -0
- package/omp.txt +0 -0
- package/src/misra/passes/S16_SwitchStatementPass.ts +0 -168
- package/src/misra/passes/S3_CommentPass.ts +0 -40
- package/src/misra/sections/Section21_StandardLibraries.ts +0 -65
- package/src/misra/tests/S10_EssentialTypes.test.ts +0 -253
- package/src/misra/tests/S12_Expressions.test.ts +0 -43
- package/src/misra/tests/S13_SideEffects.test.ts +0 -77
- package/src/misra/tests/S15_ControlFlow.test.ts +0 -144
- package/src/misra/tests/S16_SwitchStatements.test.ts +0 -164
- package/src/misra/tests/S17_Functions.test.ts +0 -46
- package/src/misra/tests/S18_PointersArrays.test.ts +0 -167
- package/src/misra/tests/S19_OverlappingStorage.test.ts +0 -38
- package/src/misra/tests/S3_Comments.test.ts +0 -36
- package/src/misra/tests/S6_Types.test.ts +0 -36
- package/src/misra/tests/S7_LiteralsConstants.test.ts +0 -48
- package/src/misra/tests/utils.ts +0 -47
- package/types_with_templates.txt +0 -0
- /package/src/{misra → misra-old}/MISRAPass.ts +0 -0
- /package/src/{misra → misra-old}/MISRAPassResult.ts +0 -0
- /package/src/{misra → misra-old}/MISRAReporter.ts +0 -0
- /package/src/{misra → misra-old}/passes/S10_EssentialTypePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S12_ExpressionPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S13_SideEffectPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S15_ControlFlowPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S17_FunctionPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S18_PointersArraysPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S19_OverlappingStoragePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S21_StandardLibPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S5_IdentifierPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S6_TypePass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S7_LiteralsConstantsPass.ts +0 -0
- /package/src/{misra → misra-old}/passes/S8_DeclDefPass.ts +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Program, FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRAAnalyser from "../MISRAAnalyser.js";
|
|
3
|
+
export default class Section6_Types extends MISRAAnalyser {
|
|
4
|
+
ruleMapper: Map<number, (jp: Program | FileJp) => void>;
|
|
5
|
+
constructor(rules: number[]);
|
|
6
|
+
private r6_2_noSingleBitSignedFields;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Section6_Types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section6_Types.d.ts","sourceRoot":"","sources":["../../../src/misra/sections/Section6_Types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAA6C,MAAM,qCAAqC,CAAC;AACjH,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,aAAa;IACrD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC;gBAE5C,KAAK,EAAE,MAAM,EAAE;IAQ3B,OAAO,CAAC,4BAA4B;CAUvC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
|
2
|
+
import { Field } from "@specs-feup/clava/api/Joinpoints.js";
|
|
3
|
+
import MISRAAnalyser from "../MISRAAnalyser.js";
|
|
4
|
+
export default class Section6_Types extends MISRAAnalyser {
|
|
5
|
+
ruleMapper;
|
|
6
|
+
constructor(rules) {
|
|
7
|
+
super(rules);
|
|
8
|
+
this.ruleMapper = new Map([
|
|
9
|
+
[2, this.r6_2_noSingleBitSignedFields.bind(this)],
|
|
10
|
+
]);
|
|
11
|
+
}
|
|
12
|
+
r6_2_noSingleBitSignedFields($startNode) {
|
|
13
|
+
Query.searchFrom($startNode, Field).get().forEach(field => {
|
|
14
|
+
if (field.children.length > 0 && field.name) {
|
|
15
|
+
const width = new Number(field.children[0].children[0].value);
|
|
16
|
+
if (width == 1 && field.type.isSigned) {
|
|
17
|
+
this.logMISRAError(field, `Single-bit named bit field ${field.name} must not have a signed type.`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}, this);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=Section6_Types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section6_Types.js","sourceRoot":"","sources":["../../../src/misra/sections/Section6_Types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,sCAAsC,CAAC;AACzD,OAAO,EAA8B,KAAK,EAA2B,MAAM,qCAAqC,CAAC;AACjH,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,aAAa;IACrD,UAAU,CAA8C;IAExD,YAAY,KAAe;QACvB,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC;YACtB,CAAC,CAAC,EAAE,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAEpD,CAAC,CAAC;IACP,CAAC;IAEO,4BAA4B,CAAC,UAAqB;QACtD,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC1C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAgB,CAAC,KAAK,CAAC,CAAC;gBAC9E,IAAI,KAAK,IAAI,CAAC,IAAK,KAAK,CAAC,IAAoB,CAAC,QAAQ,EAAE,CAAC;oBACrD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,8BAA8B,KAAK,CAAC,IAAI,+BAA+B,CAAC,CAAC;gBACvG,CAAC;YACL,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,CAAC;IACb,CAAC;CACJ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Program, FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRAAnalyser from "../MISRAAnalyser.js";
|
|
3
|
+
export default class Section7_LiteralsConstants extends MISRAAnalyser {
|
|
4
|
+
ruleMapper: Map<number, (jp: Program | FileJp) => void>;
|
|
5
|
+
constructor(rules: number[]);
|
|
6
|
+
private r7_1_noOctalConstants;
|
|
7
|
+
private r7_3_noLowercaseLSuffix;
|
|
8
|
+
private static checkPointerConst;
|
|
9
|
+
private r7_4_constStringLiterals;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=Section7_LiteralsConstants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section7_LiteralsConstants.d.ts","sourceRoot":"","sources":["../../../src/misra/sections/Section7_LiteralsConstants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAA4H,MAAM,qCAAqC,CAAC;AAChM,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,aAAa;IACjE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC;gBAE5C,KAAK,EAAE,MAAM,EAAE;IAS3B,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAUhC,OAAO,CAAC,wBAAwB;CAiCnC"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
|
2
|
-
import {
|
|
2
|
+
import { IntLiteral, PointerType, QualType, Vardecl, BinaryOp, ReturnStmt, Call } from "@specs-feup/clava/api/Joinpoints.js";
|
|
3
3
|
import MISRAAnalyser from "../MISRAAnalyser.js";
|
|
4
|
-
|
|
5
4
|
export default class Section7_LiteralsConstants extends MISRAAnalyser {
|
|
6
|
-
ruleMapper
|
|
7
|
-
|
|
8
|
-
constructor(rules: number[]) {
|
|
5
|
+
ruleMapper;
|
|
6
|
+
constructor(rules) {
|
|
9
7
|
super(rules);
|
|
10
8
|
this.ruleMapper = new Map([
|
|
11
9
|
[1, this.r7_1_noOctalConstants.bind(this)],
|
|
@@ -13,64 +11,59 @@ export default class Section7_LiteralsConstants extends MISRAAnalyser {
|
|
|
13
11
|
[4, this.r7_4_constStringLiterals.bind(this)]
|
|
14
12
|
]);
|
|
15
13
|
}
|
|
16
|
-
|
|
17
|
-
private r7_1_noOctalConstants($startNode: Joinpoint) {
|
|
14
|
+
r7_1_noOctalConstants($startNode) {
|
|
18
15
|
for (const intLit of Query.searchFrom($startNode, IntLiteral)) {
|
|
19
16
|
if (intLit.code.match(/0[0-9]+/g)) {
|
|
20
17
|
this.logMISRAError(intLit, `The octal constant ${intLit.code} was used. Its decimal value is ${intLit.value}`);
|
|
21
18
|
}
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
|
-
|
|
25
|
-
private r7_3_noLowercaseLSuffix($startNode: Joinpoint) {
|
|
21
|
+
r7_3_noLowercaseLSuffix($startNode) {
|
|
26
22
|
for (const intLit of Query.searchFrom($startNode, IntLiteral)) {
|
|
27
23
|
if (intLit.code.includes('l')) {
|
|
28
24
|
this.logMISRAError(intLit, `A lowercase 'l' was used as a suffix in ${intLit.code}.`);
|
|
29
25
|
}
|
|
30
26
|
}
|
|
31
27
|
}
|
|
32
|
-
|
|
33
|
-
private static checkPointerConst(type: Type) {
|
|
28
|
+
static checkPointerConst(type) {
|
|
34
29
|
if (type instanceof PointerType) {
|
|
35
30
|
return type.pointee.constant;
|
|
36
31
|
}
|
|
37
32
|
else if (type instanceof QualType && type.unqualifiedType instanceof PointerType) {
|
|
38
33
|
return type.unqualifiedType.pointee.constant;
|
|
39
34
|
}
|
|
40
|
-
else
|
|
35
|
+
else
|
|
36
|
+
return undefined;
|
|
41
37
|
}
|
|
42
|
-
|
|
43
|
-
private r7_4_constStringLiterals($startNode: Joinpoint) {
|
|
38
|
+
r7_4_constStringLiterals($startNode) {
|
|
44
39
|
for (const varDecl of Query.searchFrom($startNode, Vardecl)) {
|
|
45
|
-
if (!varDecl.type.isPointer)
|
|
46
|
-
|
|
40
|
+
if (!varDecl.type.isPointer)
|
|
41
|
+
continue;
|
|
47
42
|
if (varDecl.children.length > 0 && varDecl.children[0].joinPointType === "literal"
|
|
48
43
|
&& !Section7_LiteralsConstants.checkPointerConst(varDecl.type)) {
|
|
49
|
-
|
|
44
|
+
this.logMISRAError(varDecl, `String literal assigned to non-const qualified variable ${varDecl.name}`);
|
|
50
45
|
}
|
|
51
46
|
}
|
|
52
|
-
|
|
53
|
-
Query.searchFrom($startNode, BinaryOp, {isAssignment: true}).get().forEach(bOp => {
|
|
47
|
+
Query.searchFrom($startNode, BinaryOp, { isAssignment: true }).get().forEach(bOp => {
|
|
54
48
|
if (bOp.right.joinPointType === "literal" && !Section7_LiteralsConstants.checkPointerConst(bOp.left.type)) {
|
|
55
|
-
this.logMISRAError(bOp, `String literal assigned to non-const qualified variable ${
|
|
49
|
+
this.logMISRAError(bOp, `String literal assigned to non-const qualified variable ${bOp.left.name}`);
|
|
56
50
|
}
|
|
57
51
|
}, this);
|
|
58
|
-
|
|
59
52
|
for (const ret of Query.searchFrom($startNode, ReturnStmt)) {
|
|
60
|
-
const ancestor = ret.getAncestor("function")
|
|
53
|
+
const ancestor = ret.getAncestor("function");
|
|
61
54
|
const retType = ancestor.functionType.returnType;
|
|
62
55
|
if (ret.returnExpr?.joinPointType === "literal" && !Section7_LiteralsConstants.checkPointerConst(retType)) {
|
|
63
56
|
this.logMISRAError(ret, `String literal returned in non-const qualified return value for function ${ancestor.name}`);
|
|
64
57
|
}
|
|
65
58
|
}
|
|
66
|
-
|
|
67
59
|
for (const call of Query.searchFrom($startNode, Call)) {
|
|
68
60
|
const paramTypes = call.function.functionType.paramTypes;
|
|
69
61
|
for (let i = 1; i < call.children.length; i++) {
|
|
70
|
-
if (call.children[i].joinPointType === "literal" && !Section7_LiteralsConstants.checkPointerConst(paramTypes[i-1])) {
|
|
62
|
+
if (call.children[i].joinPointType === "literal" && !Section7_LiteralsConstants.checkPointerConst(paramTypes[i - 1])) {
|
|
71
63
|
this.logMISRAError(call.children[i], `String literal passed as non-const qualified parameter in call of ${call.function.name}`);
|
|
72
64
|
}
|
|
73
65
|
}
|
|
74
66
|
}
|
|
75
67
|
}
|
|
76
|
-
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=Section7_LiteralsConstants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section7_LiteralsConstants.js","sourceRoot":"","sources":["../../../src/misra/sections/Section7_LiteralsConstants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Program, FileJp } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRAAnalyser from "../MISRAAnalyser.js";
|
|
3
|
+
export default class Section8_DeclarationsDefinitions extends MISRAAnalyser {
|
|
4
|
+
ruleMapper: Map<number, (jp: Program | FileJp) => void>;
|
|
5
|
+
constructor(rules: number[]);
|
|
6
|
+
private r8_2_functionPrototype;
|
|
7
|
+
private r8_3_compatibleDefinitions;
|
|
8
|
+
private static hasExternalLinkage;
|
|
9
|
+
private r8_7_noUnnecessaryExternalLinkage;
|
|
10
|
+
private r8_10_onlyStaticInline;
|
|
11
|
+
private r8_11_externArrayExplicitSize;
|
|
12
|
+
private setEnumMap;
|
|
13
|
+
private r8_12_implicitExplicitEnumMatching;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=Section8_DeclarationsDefinitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section8_DeclarationsDefinitions.d.ts","sourceRoot":"","sources":["../../../src/misra/sections/Section8_DeclarationsDefinitions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAA+F,MAAM,qCAAqC,CAAC;AACnK,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAGhD,MAAM,CAAC,OAAO,OAAO,gCAAiC,SAAQ,aAAa;IACvE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC;gBAE5C,KAAK,EAAE,MAAM,EAAE;IAY3B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,0BAA0B;IAelC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAIjC,OAAO,CAAC,iCAAiC;IAwCzC,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,kCAAkC;CAuB7C"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
|
2
|
-
import {
|
|
2
|
+
import { FileJp, Param, FunctionJp, StorageClass, Vardecl, EnumDecl, IntLiteral, DeclStmt, Varref } from "@specs-feup/clava/api/Joinpoints.js";
|
|
3
3
|
import MISRAAnalyser from "../MISRAAnalyser.js";
|
|
4
4
|
import Fix from "@specs-feup/clava/api/clava/analysis/Fix.js";
|
|
5
|
-
|
|
6
5
|
export default class Section8_DeclarationsDefinitions extends MISRAAnalyser {
|
|
7
|
-
ruleMapper
|
|
8
|
-
|
|
9
|
-
constructor(rules: number[]) {
|
|
6
|
+
ruleMapper;
|
|
7
|
+
constructor(rules) {
|
|
10
8
|
super(rules);
|
|
11
9
|
this.ruleMapper = new Map([
|
|
12
10
|
[2, this.r8_2_functionPrototype.bind(this)],
|
|
@@ -17,14 +15,12 @@ export default class Section8_DeclarationsDefinitions extends MISRAAnalyser {
|
|
|
17
15
|
[12, this.r8_12_implicitExplicitEnumMatching.bind(this)]
|
|
18
16
|
]);
|
|
19
17
|
}
|
|
20
|
-
|
|
21
|
-
private r8_2_functionPrototype($startNode: Joinpoint) { //needs to apply to function pointers, void info lost
|
|
18
|
+
r8_2_functionPrototype($startNode) {
|
|
22
19
|
Query.searchFrom($startNode, Param).get().filter(param => !param.name)
|
|
23
20
|
.forEach(param => this.logMISRAError(param, `Parameter of type ${param.type.code} lacks a name.`), this);
|
|
24
21
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Query.searchFrom($startNode, FunctionJp, {isImplementation: true}).get().forEach(fun => {
|
|
22
|
+
r8_3_compatibleDefinitions($startNode) {
|
|
23
|
+
Query.searchFrom($startNode, FunctionJp, { isImplementation: true }).get().forEach(fun => {
|
|
28
24
|
fun.declarationJps.forEach(decl => {
|
|
29
25
|
for (let i = 0; i < fun.params.length; i++) {
|
|
30
26
|
if (fun.paramNames[i] !== decl.paramNames[i]) {
|
|
@@ -37,14 +33,11 @@ export default class Section8_DeclarationsDefinitions extends MISRAAnalyser {
|
|
|
37
33
|
}, this);
|
|
38
34
|
}, this);
|
|
39
35
|
}
|
|
40
|
-
|
|
41
|
-
private static hasExternalLinkage(jp: FunctionJp | Vardecl) {
|
|
36
|
+
static hasExternalLinkage(jp) {
|
|
42
37
|
return jp.storageClass !== StorageClass.STATIC && jp.storageClass !== StorageClass.EXTERN;
|
|
43
38
|
}
|
|
44
|
-
|
|
45
|
-
private r8_7_noUnnecessaryExternalLinkage($startNode: Joinpoint) { //finish
|
|
39
|
+
r8_7_noUnnecessaryExternalLinkage($startNode) {
|
|
46
40
|
const globals = new Map();
|
|
47
|
-
|
|
48
41
|
Query.searchFrom($startNode, FileJp).get().forEach(file => {
|
|
49
42
|
file.children.forEach(jp => {
|
|
50
43
|
if (jp instanceof FunctionJp && jp.name !== "main" && Section8_DeclarationsDefinitions.hasExternalLinkage(jp)) {
|
|
@@ -58,16 +51,14 @@ export default class Section8_DeclarationsDefinitions extends MISRAAnalyser {
|
|
|
58
51
|
this.logMISRAError(jp, `Function ${jp.name} has external linkage but it is only referenced in its file.`);
|
|
59
52
|
}
|
|
60
53
|
}
|
|
61
|
-
|
|
62
54
|
if (jp instanceof DeclStmt) {
|
|
63
55
|
jp.decls.filter(decl => decl instanceof Vardecl && Section8_DeclarationsDefinitions.hasExternalLinkage(decl)).forEach(decl => {
|
|
64
56
|
//globals.push({decl: decl as Vardecl, file: decl.filename});
|
|
65
|
-
globals.set(decl.astId, {decl: decl
|
|
57
|
+
globals.set(decl.astId, { decl: decl, file: decl.filename });
|
|
66
58
|
}, this);
|
|
67
59
|
}
|
|
68
60
|
});
|
|
69
61
|
}, this);
|
|
70
|
-
|
|
71
62
|
Query.searchFrom($startNode, Varref).get().forEach(ref => {
|
|
72
63
|
if (globals.has(ref.astId)) {
|
|
73
64
|
const declFile = globals.get(ref.astId).file;
|
|
@@ -76,41 +67,34 @@ export default class Section8_DeclarationsDefinitions extends MISRAAnalyser {
|
|
|
76
67
|
}
|
|
77
68
|
}
|
|
78
69
|
}, this);
|
|
79
|
-
|
|
80
70
|
globals.forEach((v, k, m) => {
|
|
81
71
|
this.logMISRAError(v.decl, `Variable ${v.decl.name} is declared with external linkage but is not referenced outside its file.`);
|
|
82
72
|
}, this);
|
|
83
73
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
Query.searchFrom($startNode, FunctionJp, {isInline: true}).get().forEach(fun => {
|
|
74
|
+
r8_10_onlyStaticInline($startNode) {
|
|
75
|
+
Query.searchFrom($startNode, FunctionJp, { isInline: true }).get().forEach(fun => {
|
|
87
76
|
if (fun.storageClass !== StorageClass.STATIC) {
|
|
88
77
|
this.logMISRAError(fun, "Inline functions must always be declared static.");
|
|
89
78
|
}
|
|
90
79
|
});
|
|
91
80
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
for (const varDecl of Query.searchFrom($startNode, Vardecl, {storageClass: StorageClass.EXTERN})) {
|
|
81
|
+
r8_11_externArrayExplicitSize($startNode) {
|
|
82
|
+
for (const varDecl of Query.searchFrom($startNode, Vardecl, { storageClass: StorageClass.EXTERN })) {
|
|
95
83
|
if (varDecl.type.isArray && varDecl.type.arraySize === -1) {
|
|
96
|
-
this.logMISRAError(varDecl, `Size of external array ${varDecl.name} is not explicit.`)
|
|
84
|
+
this.logMISRAError(varDecl, `Size of external array ${varDecl.name} is not explicit.`);
|
|
97
85
|
}
|
|
98
86
|
}
|
|
99
87
|
}
|
|
100
|
-
|
|
101
|
-
private setEnumMap(map: Map<number, boolean>, newValue: number, isExplicit: boolean, jp: EnumDecl) {
|
|
88
|
+
setEnumMap(map, newValue, isExplicit, jp) {
|
|
102
89
|
if (map.has(newValue) && !(isExplicit && map.get(newValue))) {
|
|
103
90
|
this.logMISRAError(jp, `An implicitly numbered identifier in enum ${jp.name} shares a value with another identifier.`, new Fix(jp, jp => {
|
|
104
|
-
|
|
105
91
|
}));
|
|
106
92
|
}
|
|
107
93
|
map.set(newValue, isExplicit);
|
|
108
94
|
}
|
|
109
|
-
|
|
110
|
-
private r8_12_implicitExplicitEnumMatching($startNode: Joinpoint) {
|
|
95
|
+
r8_12_implicitExplicitEnumMatching($startNode) {
|
|
111
96
|
for (const enumDecl of Query.searchFrom($startNode, EnumDecl)) {
|
|
112
97
|
const map = new Map();
|
|
113
|
-
|
|
114
98
|
let index = 0;
|
|
115
99
|
for (const enumerator of enumDecl.enumerators) {
|
|
116
100
|
if (enumerator.children.length > 0) {
|
|
@@ -130,4 +114,5 @@ export default class Section8_DeclarationsDefinitions extends MISRAAnalyser {
|
|
|
130
114
|
}
|
|
131
115
|
}
|
|
132
116
|
}
|
|
133
|
-
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=Section8_DeclarationsDefinitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section8_DeclarationsDefinitions.js","sourceRoot":"","sources":["../../../src/misra/sections/Section8_DeclarationsDefinitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,sCAAsC,CAAC;AACzD,OAAO,EAAW,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAa,QAAQ,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AACnK,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,GAAG,MAAM,6CAA6C,CAAC;AAE9D,MAAM,CAAC,OAAO,OAAO,gCAAiC,SAAQ,aAAa;IACvE,UAAU,CAA8C;IAExD,YAAY,KAAe;QACvB,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC;YACtB,CAAC,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC,CAAC,EAAE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC,EAAE,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC,EAAE,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC,EAAE,EAAE,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,CAAC,EAAE,EAAE,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3D,CAAC,CAAC;IACP,CAAC;IAEO,sBAAsB,CAAC,UAAqB;QAChD,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;aACjE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,KAAK,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;IACjH,CAAC;IAEO,0BAA0B,CAAC,UAAqB;QACpD,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,EAAC,gBAAgB,EAAE,IAAI,EAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACnF,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC3C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,sDAAsD,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;oBAChI,CAAC;oBACD,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBACvD,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,mDAAmD,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC5H,CAAC;gBACL,CAAC;YACL,CAAC,EAAE,IAAI,CAAC,CAAC;QACb,CAAC,EAAE,IAAI,CAAC,CAAC;IACb,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,EAAwB;QACtD,OAAO,EAAE,CAAC,YAAY,KAAK,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC,YAAY,KAAK,YAAY,CAAC,MAAM,CAAC;IAC9F,CAAC;IAEO,iCAAiC,CAAC,UAAqB;QAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAE1B,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACtD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;gBACvB,IAAI,EAAE,YAAY,UAAU,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,gCAAgC,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC5G,IAAI,YAAY,GAAG,KAAK,CAAC;oBACzB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;wBACpB,IAAI,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;4BAChC,YAAY,GAAG,IAAI,CAAC;wBACxB,CAAC;oBACL,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,IAAI,CAAC,YAAY,EAAE,CAAC;wBAChB,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,IAAI,8DAA8D,CAAC,CAAC;oBAC9G,CAAC;gBACL,CAAC;gBAED,IAAI,EAAE,YAAY,QAAQ,EAAE,CAAC;oBACzB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,YAAY,OAAO,IAAI,gCAAgC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;wBACzH,6DAA6D;wBAC7D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAC,IAAI,EAAE,IAAe,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC,CAAC;oBAC1E,CAAC,EAAE,IAAI,CAAC,CAAC;gBACb,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACrD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;gBAC7C,IAAI,QAAQ,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;oBAC5B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACL,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,4EAA4E,CAAC,CAAC;QACpI,CAAC,EAAE,IAAI,CAAC,CAAC;IACb,CAAC;IAEO,sBAAsB,CAAC,UAAqB;QAChD,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC3E,IAAI,GAAG,CAAC,YAAY,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC3C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,kDAAkD,CAAC,CAAC;YAChF,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,6BAA6B,CAAC,UAAqB;QACvD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,EAAC,YAAY,EAAE,YAAY,CAAC,MAAM,EAAC,CAAC,EAAE,CAAC;YAC/F,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,0BAA0B,OAAO,CAAC,IAAI,mBAAmB,CAAC,CAAA;YAC1F,CAAC;QACL,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,GAAyB,EAAE,QAAgB,EAAE,UAAmB,EAAE,EAAY;QAC7F,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,6CAA6C,EAAE,CAAC,IAAI,0CAA0C,EAAE,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;YAExI,CAAC,CAAC,CAAC,CAAC;QACR,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClC,CAAC;IAEO,kCAAkC,CAAC,UAAqB;QAC5D,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAEtB,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,UAAU,EAAE,CAAC;wBAC3D,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBACzD,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAChD,CAAC;yBACI,CAAC;wBACF,OAAO,CAAC,GAAG,CAAC,mDAAmD,QAAQ,CAAC,IAAI,kCAAkC,CAAC,CAAC;wBAChH,OAAO;oBACX,CAAC;gBACL,CAAC;qBACI,CAAC;oBACF,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACjD,CAAC;gBACD,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import MISRAReporter from "../MISRAReporter.js";
|
|
2
|
+
import MISRAPass from "../MISRAPass.js";
|
|
3
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
|
4
|
+
export declare function expectNumberOfErrors($reporter: MISRAReporter, $pass: MISRAPass, $errors: number, $jp: Joinpoint): void;
|
|
5
|
+
export interface TestFile {
|
|
6
|
+
name: string;
|
|
7
|
+
code: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function registerSourceCode(files: TestFile[]): void;
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/misra/tests/utils.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAchE,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,QAO/G;AAED,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAcxD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import Clava from "@specs-feup/clava/api/clava/Clava.js";
|
|
2
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
|
3
|
+
function countErrors($passResult) {
|
|
4
|
+
let count = 0;
|
|
5
|
+
$passResult.results.forEach(res => {
|
|
6
|
+
const misraRes = res;
|
|
7
|
+
count += misraRes.reports.length;
|
|
8
|
+
});
|
|
9
|
+
return count;
|
|
10
|
+
}
|
|
11
|
+
export function expectNumberOfErrors($reporter, $pass, $errors, $jp) {
|
|
12
|
+
const result = $reporter.applyPass($pass, $jp);
|
|
13
|
+
if (!result) {
|
|
14
|
+
expect($errors).toBe(0);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
expect(countErrors(result)).toBe($errors);
|
|
18
|
+
}
|
|
19
|
+
export function registerSourceCode(files) {
|
|
20
|
+
beforeAll(() => {
|
|
21
|
+
Clava.getProgram().push();
|
|
22
|
+
const program = Clava.getProgram();
|
|
23
|
+
files.forEach(file => {
|
|
24
|
+
const sourceFile = ClavaJoinPoints.fileWithSource(file.name, file.code);
|
|
25
|
+
program.addFile(sourceFile);
|
|
26
|
+
});
|
|
27
|
+
program.rebuild();
|
|
28
|
+
});
|
|
29
|
+
afterAll(() => {
|
|
30
|
+
Clava.getProgram().pop();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/misra/tests/utils.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,sCAAsC,CAAC;AACzD,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAE7E,SAAS,WAAW,CAAC,WAAgC;IACjD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC9B,MAAM,QAAQ,GAAG,GAAsB,CAAC;QACxC,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAwB,EAAE,KAAgB,EAAE,OAAe,EAAE,GAAc;IAC5G,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO;IACX,CAAC;IACD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAOD,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IAChD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QACnC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,MAAM,UAAU,GAAG,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
|
5
|
+
/**
|
|
6
|
+
* MISRA Rule 16.2: A switch label shall only be used when the most closely-enclos ing
|
|
7
|
+
compound statement is the body of a switch statement
|
|
8
|
+
*/
|
|
9
|
+
export default class Rule_16_2_TopLevelSwitch extends MISRARule {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(context: MISRAContext);
|
|
12
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
|
13
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=Rule_16_2_TopLevelSwitch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rule_16_2_TopLevelSwitch.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,SAAS,EAAU,MAAM,qCAAqC,CAAC;AAC9E,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;;gBAG/C,OAAO,EAAE,YAAY;IAIjC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAc1D,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAQvD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Case, Switch } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
|
3
|
+
import Query from "@specs-feup/lara/api/weaver/Query.js";
|
|
4
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
5
|
+
/**
|
|
6
|
+
* MISRA Rule 16.2: A switch label shall only be used when the most closely-enclos ing
|
|
7
|
+
compound statement is the body of a switch statement
|
|
8
|
+
*/
|
|
9
|
+
export default class Rule_16_2_TopLevelSwitch extends MISRARule {
|
|
10
|
+
#misplacedCases = [];
|
|
11
|
+
constructor(context) {
|
|
12
|
+
super("16.2", context);
|
|
13
|
+
}
|
|
14
|
+
match($jp, logErrors = false) {
|
|
15
|
+
if (!($jp instanceof Switch))
|
|
16
|
+
return false;
|
|
17
|
+
this.#misplacedCases = Query.searchFrom($jp, Case).get()
|
|
18
|
+
.filter(caseLabel => !(caseLabel.currentRegion instanceof Switch));
|
|
19
|
+
if (logErrors) {
|
|
20
|
+
this.#misplacedCases.forEach(caseLabel => this.logMISRAError(caseLabel, "A switch label can only be used if its enclosing compound statement is the switch statement itself."));
|
|
21
|
+
}
|
|
22
|
+
return this.#misplacedCases.length > 0;
|
|
23
|
+
}
|
|
24
|
+
transform($jp) {
|
|
25
|
+
if (!this.match($jp))
|
|
26
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
27
|
+
for (const caseLabel of this.#misplacedCases) {
|
|
28
|
+
caseLabel.detach();
|
|
29
|
+
}
|
|
30
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=Rule_16_2_TopLevelSwitch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rule_16_2_TopLevelSwitch.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,KAAK,MAAM,sCAAsC,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;IAC3D,eAAe,GAAW,EAAE,CAAC;IAE7B,YAAY,OAAqB;QAC7B,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE;aACnD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,YAAY,MAAM,CAAC,CAAC,CAAC;QAEvE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CACrC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,qGAAqG,CAAC,CACvI,CAAC;QACN,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE7F,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,SAAS,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
|
5
|
+
/**
|
|
6
|
+
* MISRA Rule 16.3: An unconditional break statement shall terminate every switch-clause
|
|
7
|
+
*/
|
|
8
|
+
export default class Rule_16_3_UnconditionalBreak extends MISRARule {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(context: MISRAContext);
|
|
11
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
|
12
|
+
private getNextStatementsToExecute;
|
|
13
|
+
private insertNextStatementsToExecute;
|
|
14
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=Rule_16_3_UnconditionalBreak.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rule_16_3_UnconditionalBreak.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAA2B,MAAM,qCAAqC,CAAC;AAChG,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAIpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,SAAS;;gBAGnD,OAAO,EAAE,YAAY;IAIjC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAc1D,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,6BAA6B;IAWrC,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAavD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Break, Switch, Case } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
|
3
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
4
|
+
import { getLastStmtOfCase } from "../../utils/utils.js";
|
|
5
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
|
6
|
+
/**
|
|
7
|
+
* MISRA Rule 16.3: An unconditional break statement shall terminate every switch-clause
|
|
8
|
+
*/
|
|
9
|
+
export default class Rule_16_3_UnconditionalBreak extends MISRARule {
|
|
10
|
+
#statementsNeedingBreakAfter = [];
|
|
11
|
+
constructor(context) {
|
|
12
|
+
super("16.3", context);
|
|
13
|
+
}
|
|
14
|
+
match($jp, logErrors = false) {
|
|
15
|
+
if (!($jp instanceof Switch))
|
|
16
|
+
return false;
|
|
17
|
+
this.#statementsNeedingBreakAfter = $jp.cases.map(caseLabel => getLastStmtOfCase(caseLabel))
|
|
18
|
+
.filter(lastStmt => lastStmt && !(lastStmt instanceof Break));
|
|
19
|
+
if (logErrors) {
|
|
20
|
+
this.#statementsNeedingBreakAfter.forEach(stmt => {
|
|
21
|
+
this.logMISRAError(stmt, `Missing unconditional break after statement '${stmt.code}'`);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return this.#statementsNeedingBreakAfter.length > 0;
|
|
25
|
+
}
|
|
26
|
+
getNextStatementsToExecute(jp) {
|
|
27
|
+
let stmts = [];
|
|
28
|
+
for (const sibling of jp.siblingsRight) {
|
|
29
|
+
if (sibling instanceof Break)
|
|
30
|
+
break;
|
|
31
|
+
if (sibling instanceof Case)
|
|
32
|
+
continue;
|
|
33
|
+
stmts.push(sibling.deepCopy());
|
|
34
|
+
}
|
|
35
|
+
return stmts;
|
|
36
|
+
}
|
|
37
|
+
insertNextStatementsToExecute(jp) {
|
|
38
|
+
const nextStmts = this.getNextStatementsToExecute(jp);
|
|
39
|
+
let lastStmt = jp;
|
|
40
|
+
for (const stmt of nextStmts) {
|
|
41
|
+
lastStmt.insertAfter(stmt);
|
|
42
|
+
lastStmt = stmt;
|
|
43
|
+
}
|
|
44
|
+
lastStmt.insertAfter(ClavaJoinPoints.breakStmt());
|
|
45
|
+
}
|
|
46
|
+
transform($jp) {
|
|
47
|
+
if (!this.match($jp))
|
|
48
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
49
|
+
for (const stmt of this.#statementsNeedingBreakAfter) {
|
|
50
|
+
if (stmt.rightJp === undefined) { // last statement of the switch
|
|
51
|
+
stmt.insertAfter(ClavaJoinPoints.breakStmt());
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this.insertNextStatementsToExecute(stmt);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=Rule_16_3_UnconditionalBreak.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rule_16_3_UnconditionalBreak.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAwB,MAAM,EAAE,IAAI,EAAE,MAAM,qCAAqC,CAAC;AAChG,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAE7E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,SAAS;IAC/D,4BAA4B,GAAgB,EAAE,CAAC;IAE/C,YAAY,OAAqB;QAC7B,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,IAAI,CAAC,4BAA4B,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;aACvF,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,YAAY,KAAK,CAAC,CAAgB,CAAC;QAEjF,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,gDAAgD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAC3F,CAAC,CAAC,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,4BAA4B,CAAC,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;IAEO,0BAA0B,CAAC,EAAa;QAC5C,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,YAAY,KAAK;gBACxB,MAAM;YACV,IAAI,OAAO,YAAY,IAAI;gBACvB,SAAS;YACb,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,6BAA6B,CAAC,EAAa;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC3B,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE3E,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC,CAAC,+BAA+B;gBAC7D,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
|
3
|
+
import MISRAContext from "../../MISRAContext.js";
|
|
4
|
+
import { MISRATransformationReport } from "../../MISRA.js";
|
|
5
|
+
/**
|
|
6
|
+
* MISRA Rule 16.4: Every switch statement shall have a default label
|
|
7
|
+
*/
|
|
8
|
+
export default class Rule_16_4_SwitchHasDefault extends MISRARule {
|
|
9
|
+
constructor(context: MISRAContext);
|
|
10
|
+
/**
|
|
11
|
+
* Checks if the given joinpoint is a switch statement with a default case
|
|
12
|
+
* @param $jp - Joinpoint to analyze
|
|
13
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
|
14
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
|
15
|
+
*/
|
|
16
|
+
match($jp: Joinpoint, logErrors?: boolean): boolean;
|
|
17
|
+
transform($jp: Joinpoint): MISRATransformationReport;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=Rule_16_4_SwitchHasDefault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rule_16_4_SwitchHasDefault.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAIpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;gBACjD,OAAO,EAAE,YAAY;IAIjC;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAU1D,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAcvD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Switch } from "@specs-feup/clava/api/Joinpoints.js";
|
|
2
|
+
import MISRARule from "../../MISRARule.js";
|
|
3
|
+
import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
|
|
4
|
+
import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
|
|
5
|
+
import { getNumOfSwitchClauses, switchHasBooleanCondition, switchHasConditionalBreak } from "../../utils/utils.js";
|
|
6
|
+
/**
|
|
7
|
+
* MISRA Rule 16.4: Every switch statement shall have a default label
|
|
8
|
+
*/
|
|
9
|
+
export default class Rule_16_4_SwitchHasDefault extends MISRARule {
|
|
10
|
+
constructor(context) {
|
|
11
|
+
super("16.4", context);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Checks if the given joinpoint is a switch statement with a default case
|
|
15
|
+
* @param $jp - Joinpoint to analyze
|
|
16
|
+
* @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
|
|
17
|
+
* @returns Returns true if the joinpoint violates the rule, false otherwise
|
|
18
|
+
*/
|
|
19
|
+
match($jp, logErrors = false) {
|
|
20
|
+
if (!($jp instanceof Switch))
|
|
21
|
+
return false;
|
|
22
|
+
const noDefaultCase = !$jp.hasDefaultCase;
|
|
23
|
+
if (noDefaultCase && logErrors) {
|
|
24
|
+
this.logMISRAError($jp, "Switch statement is missing a default case.");
|
|
25
|
+
}
|
|
26
|
+
return noDefaultCase;
|
|
27
|
+
}
|
|
28
|
+
transform($jp) {
|
|
29
|
+
if (!this.match($jp))
|
|
30
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
31
|
+
if ((getNumOfSwitchClauses($jp) < 2 || switchHasBooleanCondition($jp)) &&
|
|
32
|
+
!switchHasConditionalBreak($jp)) { // Will be handled by rules 16.6 or 16.7
|
|
33
|
+
return new MISRATransformationReport(MISRATransformationType.NoChange);
|
|
34
|
+
}
|
|
35
|
+
$jp.children[1].lastChild
|
|
36
|
+
.insertAfter(ClavaJoinPoints.defaultStmt())
|
|
37
|
+
.insertAfter(ClavaJoinPoints.emptyStmt())
|
|
38
|
+
.insertAfter(ClavaJoinPoints.breakStmt());
|
|
39
|
+
return new MISRATransformationReport(MISRATransformationType.DescendantChange);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=Rule_16_4_SwitchHasDefault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rule_16_4_SwitchHasDefault.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEnH;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;IAC7D,YAAY,OAAqB;QAC7B,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAA;QAC1E,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE7F,IAAI,CAAC,qBAAqB,CAAC,GAAa,CAAC,GAAG,CAAC,IAAI,yBAAyB,CAAC,GAAa,CAAC,CAAC;YACtF,CAAC,yBAAyB,CAAC,GAAa,CAAC,EAAE,CAAC,CAAC,wCAAwC;YACrF,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAC3E,CAAC;QAED,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aACpB,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;aAC1C,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;aACxC,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}
|