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));
+