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
Roxane MARECHAL
Source Code Analyzer
Commits
3a60e478
Commit
3a60e478
authored
Dec 19, 2019
by
Marion HUNAULT
Committed by
Gerson SUNYE
Dec 19, 2019
Browse files
Fix #904
parent
c6d75ed4
Changes
3
Hide whitespace changes
Inline
Side-by-side
input/string-to-string.xmi
0 → 100644
View file @
3a60e478
<?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=
"stringtostring"
>
<ownedElements
name=
"stringtostring"
>
<ownedElements
xsi:type=
"java:ClassDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"ToString"
>
<modifier
visibility=
"public"
/>
<bodyDeclarations
xsi:type=
"java:FieldDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
>
<modifier
visibility=
"public"
/>
<type
type=
"//@ownedElements.0/@ownedElements.1"
/>
<fragments
originalCompilationUnit=
"//@compilationUnits.0"
name=
"thing"
usageInVariableAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.2/@body/@statements.0/@expression/@expression"
>
<initializer
xsi:type=
"java:ClassInstanceCreation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.0/@ownedElements.1/@bodyDeclarations.1"
>
<type
type=
"//@ownedElements.0/@ownedElements.1"
/>
</initializer>
</fragments>
</bodyDeclarations>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"stringbar"
>
<modifier
visibility=
"private"
/>
<body
originalCompilationUnit=
"//@compilationUnits.0"
>
<statements
xsi:type=
"java:VariableDeclarationStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<type
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
<fragments
originalCompilationUnit=
"//@compilationUnits.0"
name=
"bar"
usageInVariableAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.1/@fragments.0/@initializer/@expression"
>
<initializer
xsi:type=
"java:StringLiteral"
originalCompilationUnit=
"//@compilationUnits.0"
escapedValue=
""howdy""
/>
</fragments>
<modifier/>
</statements>
<statements
xsi:type=
"java:VariableDeclarationStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<type
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
<fragments
originalCompilationUnit=
"//@compilationUnits.0"
name=
"b"
>
<initializer
xsi:type=
"java:MethodInvocation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@bodyDeclarations.0"
>
<expression
xsi:type=
"java:SingleVariableAccess"
variable=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.0/@fragments.0"
/>
</initializer>
</fragments>
<modifier/>
</statements>
</body>
<returnType
type=
"//@orphanTypes.5"
/>
</bodyDeclarations>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"something"
>
<modifier
visibility=
"private"
/>
<body
originalCompilationUnit=
"//@compilationUnits.0"
>
<statements
xsi:type=
"java:ReturnStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<expression
xsi:type=
"java:MethodInvocation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.0/@ownedElements.1/@bodyDeclarations.0"
>
<expression
xsi:type=
"java:SingleVariableAccess"
variable=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@fragments.0"
/>
</expression>
</statements>
</body>
<returnType
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
</bodyDeclarations>
</ownedElements>
<ownedElements
xsi:type=
"java:ClassDeclaration"
originalCompilationUnit=
"//@compilationUnits.1"
name=
"Something"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@type //@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@fragments.0/@initializer/@type"
>
<modifier
visibility=
"public"
/>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.1"
name=
"toString"
usages=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.2/@body/@statements.0/@expression"
>
<annotations
originalCompilationUnit=
"//@compilationUnits.1"
>
<type
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.3"
/>
</annotations>
<modifier
visibility=
"public"
/>
<body
originalCompilationUnit=
"//@compilationUnits.1"
>
<statements
xsi:type=
"java:ReturnStatement"
originalCompilationUnit=
"//@compilationUnits.1"
>
<expression
xsi:type=
"java:StringLiteral"
originalCompilationUnit=
"//@compilationUnits.1"
escapedValue=
""Something""
/>
</statements>
</body>
<returnType
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
</bodyDeclarations>
<bodyDeclarations
xsi:type=
"java:ConstructorDeclaration"
name=
"Something"
proxy=
"true"
usages=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@fragments.0/@initializer"
/>
</ownedElements>
</ownedElements>
<ownedElements
name=
"java"
proxy=
"true"
>
<ownedPackages
name=
"lang"
proxy=
"true"
>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"String"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.0/@type //@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.1/@type //@ownedElements.0/@ownedElements.0/@bodyDeclarations.2/@returnType //@ownedElements.0/@ownedElements.1/@bodyDeclarations.0/@returnType"
>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
name=
"toString"
proxy=
"true"
usages=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.1/@fragments.0/@initializer"
/>
<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:AnnotationTypeDeclaration"
name=
"Override"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.1/@bodyDeclarations.0/@annotations.0/@type"
/>
</ownedPackages>
<ownedPackages
name=
"io"
proxy=
"true"
>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Serializable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@superInterfaces.0"
/>
</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.1/@returnType"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeChar"
name=
"char"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeShort"
name=
"short"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeByte"
name=
"byte"
/>
<compilationUnits
name=
"ToString.java"
originalFilePath=
"C:\Users\Marion\_FACULTE\_M2\Model_photon\stringtostring\src\stringtostring\ToString.java"
package=
"//@ownedElements.0"
types=
"//@ownedElements.0/@ownedElements.0"
/>
<compilationUnits
name=
"Something.java"
originalFilePath=
"C:\Users\Marion\_FACULTE\_M2\Model_photon\stringtostring\src\stringtostring\Something.java"
package=
"//@ownedElements.0"
types=
"//@ownedElements.0/@ownedElements.1"
/>
</java:Model>
src/main/atl/analysis.atl
View file @
3a60e478
...
...
@@ -72,6 +72,7 @@ helper def: allMeasures(project : java!Model): Set(smm!Measure) =
thisModule.emptyStatementBlock(),
thisModule.avoidRethrowingException(),
thisModule.integerInstantiation(),
thisModule.stringToString(),
-- Documentation rules
--
...
...
@@ -225,7 +226,24 @@ rule MesureShortVariableName(variable : java!VariableDeclaration) {
}
}
-- A Measure instance if the method violates the rule 'StringToString'.
rule MeasureStringToString(method : java!MethodInvocation) {
to
om: smm!ObservedMeasure (
measure <- noc,
measurements <- measurement
),
noc: smm!DimensionalMeasure (
name <- 'StringToString',
shortDescription <- 'Avoid calling toString() on objects already known to be string instances; this is unnecessary.'
),
measurement: smm!DirectMeasurement (
error <- 'The Object ' + method.expression.variable.name + ' is already a String in ' + method.originalCompilationUnit.name
)
do {
noc;
}
}
-- creates a new Measure when Thread.run() is used instead of Thread.start()
rule MeasureDontCallThreadRun(method : java!MethodInvocation) {
...
...
src/main/atl/performance.atl
View file @
3a60e478
...
...
@@ -123,3 +123,12 @@ helper def: integerInstantiation() : Set(smm!Measure) =
->select(p|p.name='util')->collect(i|i.package)
->select(p|p.name='java')
->collect(i |thisModule.RuleUseArrayListInsteadOfVector(i));
--------------------------------------------- StringToString ---------------------------------------------
-- Rule for metrics stringToString : returns the set of class Measures that violates the rule.
helper def: stringToString() : Set(smm!Measure) =
java!MethodInvocation.allInstances()
-> select( i | i.method.name = 'toString' and i.expression.variable.variablesContainer.type.type.name = 'String')
-> collect ( i | thisModule.MeasureStringToString(i) )
;
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