aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorDinesh Bolkensteyn <dinesh@dinsoft.net>2011-10-25 23:34:25 +0200
committerDinesh Bolkensteyn <dinesh@dinsoft.net>2011-10-25 23:34:48 +0200
commit95dfe333644a75628ac2e47b62470a0a789f622e (patch)
tree8b42756ef039c5ac8813fd41b1acba064817efea /plugins
parentd5de5a55cb0d6959ae098c4cd6a38c55e3558c5b (diff)
downloadsonarqube-95dfe333644a75628ac2e47b62470a0a789f622e.tar.gz
sonarqube-95dfe333644a75628ac2e47b62470a0a789f622e.zip
SONAR-2934 Transitive accessor computation now supports recursive methods
Diffstat (limited to 'plugins')
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/asm/AsmMethod.java2
-rw-r--r--plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/asm/AsmMethodTest.java8
-rw-r--r--plugins/sonar-squid-java-plugin/test-resources/bytecode/bin/properties/JavaBean.classbin2009 -> 3193 bytes
-rw-r--r--plugins/sonar-squid-java-plugin/test-resources/bytecode/src/properties/JavaBean.java45
4 files changed, 54 insertions, 1 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 51e27b1d7ee..c37d54a9706 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
@@ -142,8 +142,8 @@ public class AsmMethod extends AsmResource {
private void ensureAccessorComputed() {
if (accessFieldComputed) return;
+ accessFieldComputed = true; // Set accessFieldComputed to true before calling setAccessedField() to prevent infinite recursion on recursive methods.
setAccessedField();
- accessFieldComputed = true;
}
private void setAccessedField() {
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 631f0078b0a..6a2f4abb0a5 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
@@ -73,6 +73,11 @@ public class AsmMethodTest {
assertTrue(javaBean.getMethod("accessorWithABunchOfCalls()V").isAccessor());
assertFalse(javaBean.getMethod("iShouldBeAStaticSetter()V").isAccessor());
assertTrue(javaBean.getMethod("getFirstName()Ljava/lang/String;").isAccessor());
+ assertTrue(javaBean.getMethod("getFirstNameAndOneArgument(Ljava/lang/String;)Ljava/lang/String;").isAccessor());
+ assertTrue(javaBean.getMethod("recursiveAbs(I)I").isAccessor());
+ assertFalse(javaBean.getMethod("recursiveAbsNotAccessor(I)I").isAccessor());
+ assertTrue(javaBean.getMethod("recursiveAbsSameIncrementA(I)I").isAccessor());
+ assertFalse(javaBean.getMethod("recursiveAbsDifferentIncrementA(I)I").isAccessor());
}
@Test
@@ -89,6 +94,9 @@ public class AsmMethodTest {
assertThat(javaBean.getMethod("accessorWithABunchOfCalls()V").getAccessedField().getName(), is("firstNames"));
assertNull(javaBean.getMethod("iShouldBeAStaticSetter()V").getAccessedField());
assertThat(javaBean.getMethod("getFirstName()Ljava/lang/String;").getAccessedField().getName(), is("FirstName"));
+ assertThat(javaBean.getMethod("getFirstNameAndOneArgument(Ljava/lang/String;)Ljava/lang/String;").getAccessedField().getName(), is("FirstName"));
+ assertThat(javaBean.getMethod("recursiveAbs(I)I").getAccessedField().getName(), is("myIncrement"));
+ assertNull(javaBean.getMethod("recursiveAbsNotAccessor(I)I").getAccessedField());
}
}
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 6c6d60868f0..1724b051e65 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 4750fde8e08..ca2374734ed 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
@@ -9,6 +9,8 @@ public class JavaBean {
ArrayList<String> firstNames = new ArrayList<String>();
private static String staticMember;
private String FirstName;
+ private int myIncrement = 1;
+ private int myDifferentIncrement = 2;
public String getName() {
return name;
@@ -68,4 +70,47 @@ public class JavaBean {
return FirstName;
}
+ public String getFirstNameAndOneArgument(String argument) {
+ return FirstName + " " + argument;
+ }
+
+ public int recursiveAbs(int value) {
+ if (value < 0) {
+ return recursiveAbs(value + myIncrement);
+ } else return value;
+ }
+
+ public int recursiveAbsNotAccessor(int value) {
+ if (value < 0) {
+ return recursiveAbs(value + myIncrement);
+ } else {
+ iShouldBeAStaticSetter();
+ return value;
+ }
+ }
+
+ public int recursiveAbsSameIncrementA(int value) {
+ if (value < 0) {
+ return recursiveAbsSameIncrementB(value + myIncrement);
+ } else return value;
+ }
+
+ public int recursiveAbsSameIncrementB(int value) {
+ if (value < 0) {
+ return recursiveAbsSameIncrementA(value + myIncrement);
+ } else return value;
+ }
+
+ public int recursiveAbsDifferentIncrementA(int value) {
+ if (value < 0) {
+ return recursiveAbsDifferentIncrementB(value + myIncrement);
+ } else return value;
+ }
+
+ public int recursiveAbsDifferentIncrementB(int value) {
+ if (value < 0) {
+ return recursiveAbsSameIncrementA(value + myDifferentIncrement);
+ } else return value;
+ }
+
}