diff --git a/build-tools/analysis.launch b/build-tools/analysis.launch index e706c2d416d7505b3c31cf8ff14bcfcfa772f5a2..71c6f927f658eee21079072da959923bd21fe2ef 100644 --- a/build-tools/analysis.launch +++ b/build-tools/analysis.launch @@ -45,7 +45,7 @@ - + diff --git a/input/while-loops-must-use-braces.xmi b/input/while-loops-must-use-braces.xmi new file mode 100644 index 0000000000000000000000000000000000000000..5804dd3b60ebb1c510988d5ea46d679141465e41 --- /dev/null +++ b/input/while-loops-must-use-braces.xmi @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/atl/analysis.atl b/src/main/atl/analysis.atl index 54b2f46fe58d705198561a370db786fac843f3db..72b913ab8d4fd4fb45afb841928294b999cef68a 100644 --- a/src/main/atl/analysis.atl +++ b/src/main/atl/analysis.atl @@ -63,6 +63,7 @@ helper def: allMeasures(project : java!Model): Set(smm!Measure) = thisModule.extendsObject(), thisModule.unnecessaryReturn(), thisModule.useShortArrayInitializer(), + thisModule.whileBraces(), -- Design rules -- @@ -145,7 +146,7 @@ helper def: allMeasures(project : java!Model): Set(smm!Measure) = thisModule.nonCaseLabelInSwitchStatement(), thisModule.nonStaticInitializer(), thisModule.nullAssignment(), - thisModule.simpleDateFormatNeedsLocale(), + --thisModule.simpleDateFormatNeedsLocale(), thisModule.suspiciousEqualsMethodName(), thisModule.suspiciousHashcodeMethodName(), thisModule.testClassWithoutTest(), @@ -162,7 +163,7 @@ helper def: allMeasures(project : java!Model): Set(smm!Measure) = thisModule.switchDensity(), -- #FIXME: thisModule.unusedLocalVariable(), thisModule.useAssertSameInsteadOfAssertTrue(), - thisModule.useAssertTrueInsteadOfAssertEquals() + thisModule.useAssertTrueInsteadOfAssertEquals(), -- Bugged rules: -- @@ -2421,7 +2422,25 @@ rule MesureUseAssertTrueInsteadOfAssertEquals(class : java!MethodInvocation) { } - +--------------------------------------------- WhileLoopsMustUseBraces --------------------------------------------- +--- creates a new Measure when a class that contains a while statement without braces.. +rule MeasureWhileLoopsMustUseBraces(condition : java!WhileStatement) { + to + om: smm!ObservedMeasure ( + measure <- noc, + measurements <- measurement + ), + noc: smm!DimensionalMeasure ( + name <- 'While Statement must use braces', + shortDescription <- 'Avoid using While statements without using surrounding braces.' + ), + measurement: smm!DirectMeasurement ( + error <- 'The class ' + condition.originalCompilationUnit.name + ' has a While statement without braces ' + ) + do { + noc; + } +} ------------------------------------------------------------------------------------------ diff --git a/src/main/atl/codestyle.atl b/src/main/atl/codestyle.atl index 8ac892d744b3e8ed46c2b26eff0e9e64124308b9..be52d9fe21bc89c1f96a423ac672fb9000b88648 100644 --- a/src/main/atl/codestyle.atl +++ b/src/main/atl/codestyle.atl @@ -218,3 +218,12 @@ helper def: useShortArrayInitializer() : Set(smm!Measure) = java!VariableDeclarationFragment.allInstances() -> select(i | i.initializer.oclIsTypeOf(java!ArrayCreation) = true) -> collect (i | thisModule.MeasureUseShortArrayInitializer(i)); + + +-- ------------------------------------------- WhileLoopsMustUseBraces --------------------------------------------- +--- Helper for issue WhileLoopsMustUseBraces : return a Measure for each class that contains a while statement without braces. +helper def: whileBraces() : Set(smm!Measure) = + java!WhileStatement.allInstances() + -> select(i | i.body <> OclUndefined) + -> select(i | not i.body.oclIsTypeOf(java!Block)) + -> collect(i | thisModule.MeasureWhileLoopsMustUseBraces(i)); diff --git a/src/main/atl/errorProne.atl b/src/main/atl/errorProne.atl index 4f9dd41f353300e2dc5b940a9ecaaf468c1e7357..4a27f2611346b30054e5f6a93882891cc3341f7b 100644 --- a/src/main/atl/errorProne.atl +++ b/src/main/atl/errorProne.atl @@ -626,3 +626,4 @@ helper def: nonCaseLabelInSwitchStatement() : Set(smm!Measure) = -> select(i | i.name <> OclUndefined) -> select(i | i.name <> 'case :' and i.name <> 'default:') -> collect (i | thisModule.MeasureNonCaseLabelInSwitchStatement(i)); +