diff options
author | Dinesh Bolkensteyn <dinesh@dinsoft.net> | 2011-10-25 14:54:20 +0200 |
---|---|---|
committer | Dinesh Bolkensteyn <dinesh@dinsoft.net> | 2011-10-25 14:54:20 +0200 |
commit | 44535b310d471e67ce33b02668f6f09d031d15f1 (patch) | |
tree | 6525f106ae0f4f3ab98a8c61a166e6a9da1589fc | |
parent | 039f7ae976cc2128e766a94bbdda634e995c66a9 (diff) | |
download | sonarqube-44535b310d471e67ce33b02668f6f09d031d15f1.tar.gz sonarqube-44535b310d471e67ce33b02668f6f09d031d15f1.zip |
SONAR-2934 Accessors should be considered transitively
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 Binary files differindex 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 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; } |