Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Yannis LE BARS
Source Code Analyzer
Commits
c0aa6a4a
Commit
c0aa6a4a
authored
Nov 27, 2019
by
Glenn PLOUHINEC
Committed by
Gerson SUNYE
Nov 27, 2019
Browse files
Fix #820 : EmptyStatementBlock issue
parent
9884cadf
Changes
4
Hide whitespace changes
Inline
Side-by-side
analysis.launch
View file @
c0aa6a4a
...
...
@@ -45,7 +45,7 @@
<mapEntry
key=
"OUT"
value=
"smm"
/>
</mapAttribute>
<mapAttribute
key=
"Path"
>
<mapEntry
key=
"IN"
value=
"/projet-2019/input/
avoid-using-short-type
.xmi"
/>
<mapEntry
key=
"IN"
value=
"/projet-2019/input/
empty-statement-block
.xmi"
/>
<mapEntry
key=
"OUT"
value=
"/projet-2019/output/metrics.xmi"
/>
<mapEntry
key=
"java"
value=
"uri:http://www.eclipse.org/MoDisco/Java/0.2.incubation/java"
/>
<mapEntry
key=
"smm"
value=
"uri:http://www.eclipse.org/MoDisco/SMM/1.0.Beta2/smm"
/>
...
...
input/empty-statement-block.xmi
0 → 100644
View file @
c0aa6a4a
<?xml version="1.0" encoding="ASCII"?>
<java:Model
xmi:version=
"2.0"
xmlns:xmi=
"http://www.omg.org/XMI"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:java=
"http://www.eclipse.org/MoDisco/Java/0.2.incubation/java"
name=
"EmptyStatementBlock"
>
<ownedElements
name=
"emptyStatementBlock"
>
<ownedElements
xsi:type=
"java:ClassDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"EmptyStatementBlock"
>
<modifier
visibility=
"public"
/>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"main"
>
<modifier
visibility=
"public"
static=
"true"
/>
<body
originalCompilationUnit=
"//@compilationUnits.0"
>
<statements
xsi:type=
"java:ExpressionStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<expression
xsi:type=
"java:MethodInvocation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.1/@bodyDeclarations.0"
>
<arguments
xsi:type=
"java:StringLiteral"
originalCompilationUnit=
"//@compilationUnits.0"
escapedValue=
""Hello, world !""
/>
<expression
xsi:type=
"java:SingleVariableAccess"
variable=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.3/@bodyDeclarations.0/@fragments.0"
>
<qualifier
xsi:type=
"java:TypeAccess"
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.3"
/>
</expression>
</expression>
</statements>
<statements
xsi:type=
"java:Block"
originalCompilationUnit=
"//@compilationUnits.0"
>
<statements
xsi:type=
"java:ExpressionStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<expression
xsi:type=
"java:MethodInvocation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.1/@bodyDeclarations.0"
>
<arguments
xsi:type=
"java:StringLiteral"
originalCompilationUnit=
"//@compilationUnits.0"
escapedValue=
""Hello with braces !""
/>
<expression
xsi:type=
"java:SingleVariableAccess"
variable=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.3/@bodyDeclarations.0/@fragments.0"
>
<qualifier
xsi:type=
"java:TypeAccess"
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.3"
/>
</expression>
</expression>
</statements>
</statements>
<statements
xsi:type=
"java:Block"
originalCompilationUnit=
"//@compilationUnits.0"
/>
</body>
<parameters
originalCompilationUnit=
"//@compilationUnits.0"
name=
"args"
>
<modifier/>
<type
type=
"//@orphanTypes.9"
/>
</parameters>
<returnType
type=
"//@orphanTypes.5"
/>
</bodyDeclarations>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"emptyMethodTest"
>
<modifier
visibility=
"public"
static=
"true"
/>
<body
originalCompilationUnit=
"//@compilationUnits.0"
/>
<returnType
type=
"//@orphanTypes.5"
/>
</bodyDeclarations>
</ownedElements>
</ownedElements>
<ownedElements
name=
"java"
proxy=
"true"
>
<ownedPackages
name=
"lang"
proxy=
"true"
>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"String"
proxy=
"true"
usagesInTypeAccess=
"//@orphanTypes.9/@elementType //@ownedElements.1/@ownedPackages.1/@ownedElements.1/@bodyDeclarations.0/@parameters.0/@type"
>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.0"
/>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.1"
/>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.2"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Comparable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@superInterfaces.1"
>
<typeParameters
name=
"T"
proxy=
"true"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"CharSequence"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@superInterfaces.2"
/>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"System"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.0/@expression/@expression/@qualifier //@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.1/@statements.0/@expression/@expression/@qualifier"
>
<bodyDeclarations
xsi:type=
"java:FieldDeclaration"
proxy=
"true"
>
<fragments
name=
"out"
proxy=
"true"
usageInVariableAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.0/@expression/@expression //@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.1/@statements.0/@expression/@expression"
/>
</bodyDeclarations>
</ownedElements>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"AutoCloseable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.4/@superInterfaces.0"
/>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Appendable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.1/@superInterfaces.0"
/>
</ownedPackages>
<ownedPackages
name=
"io"
proxy=
"true"
>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Serializable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@superInterfaces.0"
/>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"PrintStream"
proxy=
"true"
>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
name=
"println"
proxy=
"true"
usages=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.0/@expression //@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.1/@statements.0/@expression"
>
<parameters
name=
"arg0"
proxy=
"true"
>
<type
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
</parameters>
</bodyDeclarations>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.5"
/>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.4"
/>
<superClass
type=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.2"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"FilterOutputStream"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.1/@superClass"
>
<superClass
type=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.3"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"OutputStream"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.2/@superClass"
>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.4"
/>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.5"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Closeable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.3/@superInterfaces.0 //@ownedElements.1/@ownedPackages.1/@ownedElements.1/@superInterfaces.1"
>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.4"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Flushable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.3/@superInterfaces.1"
/>
</ownedPackages>
</ownedElements>
<orphanTypes
xsi:type=
"java:PrimitiveTypeInt"
name=
"int"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeLong"
name=
"long"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeFloat"
name=
"float"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeDouble"
name=
"double"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeBoolean"
name=
"boolean"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeVoid"
name=
"void"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@returnType //@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@returnType"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeChar"
name=
"char"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeShort"
name=
"short"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeByte"
name=
"byte"
/>
<orphanTypes
xsi:type=
"java:ArrayType"
name=
"java.lang.String[]"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@parameters.0/@type"
dimensions=
"1"
>
<elementType
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
</orphanTypes>
<compilationUnits
name=
"EmptyStatementBlock.java"
originalFilePath=
"/home/glenn/photon-workspace/projetMDE/EmptyStatementBlock/src/emptyStatementBlock/EmptyStatementBlock.java"
package=
"//@ownedElements.0"
types=
"//@ownedElements.0/@ownedElements.0"
/>
</java:Model>
src/main/atl/analysis.atl
View file @
c0aa6a4a
...
...
@@ -62,6 +62,7 @@ helper def: allMeasures(project : java!Model): Set(smm!Measure) =
thisModule.useIndexOfChar(),
thisModule.avoidPrintStackTrace(),
thisModule.avoidUsingShortType(),
thisModule.emptyStatementBlock(),
-- Documentation rules
--
...
...
@@ -553,3 +554,22 @@ rule MeasureAvoidUsingShortType(typeShort : java!VariableDeclarationStatement) {
noc;
}
}
-- A Measure instance if the class violates the rule 'EmptyStatementBlock'
rule MeasureEmptyStatementBlock(block : java!Block) {
to
om: smm!ObservedMeasure (
measure <- noc,
measurements <- measurement
),
noc: smm!DimensionalMeasure (
name <- 'Empty Statement Block',
shortDescription <- 'Empty block statements serve no purpose and should be removed.'
),
measurement: smm!DirectMeasurement (
error <- 'The class ' + block.originalCompilationUnit.name + ' has an empty statement block.'
)
do {
noc;
}
}
src/main/atl/bestPractices.atl
View file @
c0aa6a4a
...
...
@@ -39,4 +39,14 @@ helper def: avoidFieldNameMatchingMethodName() : Set(smm!Measure) =
else res
endif
)
);
\ No newline at end of file
);
--------------------------------------------- EmptyStatementBlock ---------------------------------------------
--Detects the use of empty statements blocks. These blocks serve no purpose and should be removed
helper def: emptyStatementBlock() : Set(smm!Measure) =
java!Block.allInstances()
->select(block | block.statements.isEmpty())
->collect(block | thisModule.MeasureEmptyStatementBlock(block));
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment