Browse Source

fix for Bugzilla Bug 72531

 	declare warning warns at wrong points
tags/V1_2_1
acolyer 20 years ago
parent
commit
82eae55131

+ 11
- 0
tests/bugs/pr72531/de/rohith/HelloWorld.java View File

@@ -0,0 +1,11 @@
package de.rohith;
public class HelloWorld {

public static void main(String[] args) {
PrinterWorld p = new PrinterWorld();
p.print();
Integer i = p.returnInt();
Integer[] intArray = p.returnArrayWithCloning();
Integer[] array2 = p.returnArrayWithoutCloning();
}
}

+ 31
- 0
tests/bugs/pr72531/de/rohith/HelloWorldAspect.java View File

@@ -0,0 +1,31 @@
package de.rohith;
import java.lang.Object;

public aspect HelloWorldAspect {
private int callDepth = -1;

public HelloWorldAspect() {
}
pointcut hello(): !within(HelloWorldAspect);
pointcut method(): execution(public (*[]) de..*(..));
pointcut cloning(): call(* java.lang.Object.clone());

declare warning: method() && hello(): "*[] returning method called" ;
Object[] around(): cflow(method()) && cloning() && hello() {
print("", thisEnclosingJoinPointStaticPart);
Object[] ret = proceed();
return (Object[])ret.clone();
}

private void print(String prefix, Object message) {
for (int i = 0, spaces = callDepth * 2; i < spaces; i++) {
System.out.print(" ");
}
System.out.println(prefix + message);
}
}

+ 25
- 0
tests/bugs/pr72531/de/rohith/PrinterWorld.java View File

@@ -0,0 +1,25 @@
package de.rohith;
public class PrinterWorld {
private Integer[] intArray = new Integer[2];
public PrinterWorld() {
}
public void print() {
System.out.println("Hello World!");
}
public Integer returnInt() {
return new Integer(3);
}
public Integer[] returnArrayWithCloning() {
for (int i = 0; i < intArray.length; i++) {
intArray[i] = new Integer(i++);
}
return (Integer[])intArray.clone();
}
public Integer[] returnArrayWithoutCloning() {
return intArray;
}
}

+ 3
- 0
tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java View File

@@ -264,5 +264,8 @@ public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
runTest("The introduction on interface causes the interface implementation class error (4)");
}
public void test050_typePatternMatchingWithArrays() {
runTest("declare warning warns at wrong points");
}
}


+ 9
- 0
tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml View File

@@ -404,3 +404,12 @@
</compile>
</ajc-test>
<ajc-test dir="bugs/pr72531" pr="72531"
title="declare warning warns at wrong points">
<compile files="de/rohith/HelloWorld.java,de/rohith/HelloWorldAspect.java,de/rohith/PrinterWorld.java">
<message kind="warning" line="15" text="*[] returning method called"/>
<message kind="warning" line="22" text="*[] returning method called"/>
</compile>
</ajc-test>

+ 20
- 1
weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java View File

@@ -96,6 +96,23 @@ public class WildTypePattern extends TypePattern {
return innerMatchesExactly(targetTypeName);
}
if (isStar()) {
// we match if the dimensions match
int numDimensionsInTargetType = 0;
if (dim > 0) {
int index;
while((index = targetTypeName.indexOf('[')) != -1) {
numDimensionsInTargetType++;
targetTypeName = targetTypeName.substring(index+1);
}
if (numDimensionsInTargetType == dim) {
return true;
} else {
return false;
}
}
}
// if our pattern is length 1, then known matches are exact matches
// if it's longer than that, then known matches are prefixes of a sort
if (namePatterns.length == 1) {
@@ -308,7 +325,9 @@ public class WildTypePattern extends TypePattern {
boolean allowBinding, boolean requireExactType)
{
if (isStar()) {
return TypePattern.ANY; //??? loses source location
if (dim == 0) { // pr72531
return TypePattern.ANY; //??? loses source location
}
}

String simpleName = maybeGetSimpleName();

+ 14
- 0
weaver/testsrc/org/aspectj/weaver/patterns/TypePatternTestCase.java View File

@@ -201,6 +201,20 @@ public class TypePatternTestCase extends TestCase {
}
public void testArrayMatch() {
world = new BcelWorld();
checkMatch("*[][]","java.lang.Object",false);
checkMatch("*[]","java.lang.Object[]",true);
checkMatch("*[][]","java.lang.Object[][]",true);
checkMatch("java.lang.Object[]","java.lang.Object",false);
checkMatch("java.lang.Object[]","java.lang.Object[]",true);
checkMatch("java.lang.Object[][]","java.lang.Object[][]",true);
checkMatch("java.lang.String[]","java.lang.Object",false);
checkMatch("java.lang.String[]","java.lang.Object[]",false);
checkMatch("java.lang.String[][]","java.lang.Object[][]",false);
checkMatch("java.lang.Object+[]","java.lang.String[]",true);
}

private void checkIllegalInstanceofMatch(String pattern, String name) {
try {

Loading…
Cancel
Save