aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDinesh Bolkensteyn <dinesh@dinsoft.net>2011-10-25 14:54:20 +0200
committerDinesh Bolkensteyn <dinesh@dinsoft.net>2011-10-25 14:54:20 +0200
commit44535b310d471e67ce33b02668f6f09d031d15f1 (patch)
tree6525f106ae0f4f3ab98a8c61a166e6a9da1589fc
parent039f7ae976cc2128e766a94bbdda634e995c66a9 (diff)
downloadsonarqube-44535b310d471e67ce33b02668f6f09d031d15f1.tar.gz
sonarqube-44535b310d471e67ce33b02668f6f09d031d15f1.zip
SONAR-2934 Accessors should be considered transitively
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java18
-rw-r--r--plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java4
-rw-r--r--plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.classbin1824 -> 2009 bytes
-rw-r--r--plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java10
4 files changed, 28 insertions, 4 deletions
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java
index e68caf6e8a4..51e27b1d7ee 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java
@@ -150,18 +150,30 @@ public class AsmMethod extends AsmResource {
if (!isConstructor()) {
for (AsmEdge edge: getOutgoingEdges()) {
if (isCallToNonStaticInternalField(edge)) {
- if (accessedField != null && accessedField != edge.getTo()) {
+ if (isFieldAccesingDifferentField((AsmField)edge.getTo())) {
accessedField = null;
break;
}
accessedField = (AsmField)edge.getTo();
} else if (isCallToNonStaticInternalMethod(edge)) {
- accessedField = null;
- break;
+ AsmMethod method = (AsmMethod)edge.getTo();
+ if (isMethodNotAccessorOrAccessingDifferentField(method)) {
+ accessedField = null;
+ break;
+ }
+ accessedField = method.getAccessedField();
}
}
}
}
+
+ private boolean isMethodNotAccessorOrAccessingDifferentField(AsmMethod method) {
+ return !method.isAccessor() || (accessedField != null && accessedField != method.getAccessedField());
+ }
+
+ private boolean isFieldAccesingDifferentField(AsmField field) {
+ return accessedField != null && accessedField != field;
+ }
private boolean isCallToNonStaticInternalField(AsmEdge edge) {
return edge.getTargetAsmClass() == (AsmClass)getParent() && edge.getUsage() == SourceCodeEdgeUsage.CALLS_FIELD && !((AsmField)edge.getTo()).isStatic();
diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java
index 69b37bb94f4..631f0078b0a 100644
--- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java
+++ b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java
@@ -62,6 +62,8 @@ public class AsmMethodTest {
@Test
public void testIsAccessor() {
assertTrue(javaBean.getMethod("getName()Ljava/lang/String;").isAccessor());
+ assertTrue(javaBean.getMethod("getNameIndirect()Ljava/lang/String;").isAccessor());
+ assertTrue(javaBean.getMethod("getNameOrEmpty()Ljava/lang/String;").isAccessor());
assertTrue(javaBean.getMethod("setName(Ljava/lang/String;)V").isAccessor());
assertTrue(javaBean.getMethod("setFrench(Z)V").isAccessor());
assertTrue(javaBean.getMethod("isFrench()Z").isAccessor());
@@ -76,6 +78,8 @@ public class AsmMethodTest {
@Test
public void testGetAccessedField() {
assertThat(javaBean.getMethod("getName()Ljava/lang/String;").getAccessedField().getName(), is("name"));
+ assertThat(javaBean.getMethod("getNameIndirect()Ljava/lang/String;").getAccessedField().getName(), is("name"));
+ assertThat(javaBean.getMethod("getNameOrEmpty()Ljava/lang/String;").getAccessedField().getName(), is("name"));
assertThat(javaBean.getMethod("setName(Ljava/lang/String;)V").getAccessedField().getName(), is("name"));
assertThat(javaBean.getMethod("setFrench(Z)V").getAccessedField().getName(), is("french"));
assertThat(javaBean.getMethod("isFrench()Z").getAccessedField().getName(), is("french"));
diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.class b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.class
index 5fbd5f8656f..6c6d60868f0 100644
--- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.class
+++ b/plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.class
Binary files differ
diff --git a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java
index 6e858627c24..4750fde8e08 100644
--- a/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java
+++ b/plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java
@@ -10,10 +10,18 @@ public class JavaBean {
private static String staticMember;
private String FirstName;
- public String getName(){
+ public String getName() {
return name;
}
+ public String getNameIndirect() {
+ return getName();
+ }
+
+ public String getNameOrEmpty() {
+ return (getName() == null) ? "" : name;
+ }
+
public void setName(String name){
this.name = name;
}