Compile time declarations (warning and error) do not accept string concatenation (with +)tags/for_ajdt1_1_12
@@ -0,0 +1,49 @@ | |||
class WarningSample { | |||
public void method() {} | |||
public void anotherMethod() { | |||
this.method(); | |||
} | |||
} | |||
aspect WarningAspect { | |||
pointcut illegalCall(): call(* WarningSample.method()) | |||
&& within(WarningSample); | |||
// the same thing happens with declare error | |||
declare warning: illegalCall() : "Hey, don't " + | |||
"do that, that is not nice. You should do something else"; | |||
public void e1() {} | |||
declare warning: execution(* e1(..)): "hello " + /* comment */ "world"; | |||
public void e2() {} | |||
declare warning: execution(* e2(..)): "hello " /* comment */ + "world"; | |||
public void e3() {} | |||
declare warning: execution(* e3(..)): "hello " + // commenthere | |||
// comment here too | |||
"world"; | |||
public void e4() {} | |||
declare warning: execution(* e4()): "hello " //xxx | |||
+ "world"; | |||
public void e5() {} | |||
declare warning: execution(* e5()): "hello " //xxx | |||
/* here */ | |||
+ "world"; | |||
public void e6() {} | |||
declare warning: execution(* e6()): "abc" + | |||
"def" + // def was here | |||
"ghijklmnopqrstuv" /* silly | |||
place | |||
for a | |||
comment */ + | |||
/* oops */ | |||
"wxyz"; | |||
} | |||
@@ -0,0 +1,29 @@ | |||
class WarningSample { | |||
public void method() {} | |||
public void anotherMethod() { | |||
this.method(); | |||
} | |||
} | |||
aspect WarningAspect { | |||
pointcut illegalCall(): call(* WarningSample.method()) | |||
&& within(WarningSample); | |||
// the same thing happens with declare error | |||
declare warning: illegalCall() : "Hey, don't " + | |||
"do that, that is not nice. You should do something else"; | |||
public void e1() {} | |||
declare warning: execution(* e1(..)): "hello " + /* comment */ "world" | |||
public void e2() {} | |||
declare warning: execution(* e2(..)): "hello " /* comment + "world"; | |||
public void e3() {} | |||
declare warning: execution(* e3(..)): "hello " + // commenthere | |||
} | |||
@@ -139,7 +139,8 @@ public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase { | |||
public void test025_proceedInAround3() { | |||
runTest("proceed used as method name in around advice (3)"); | |||
} | |||
public void test026_bindingThisAndTargetToTheSameFormal() { | |||
public void test026_bindingThisAndTargetToTheSameFormal() { | |||
runTest("ajc crashes when compiling the following program (binding this() and target())"); | |||
} | |||
@@ -155,7 +156,7 @@ public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase { | |||
runTest("Valid but inaccessible type names should not be flagged by XLint:invalidAbsoluteTypeName"); | |||
} | |||
public void test030_privateITDinitialisersBeingMatched() { | |||
public void test030_privateITDinitialisersBeingMatched() { | |||
runTest("intertype initialisers should match field set pointcuts"); | |||
} | |||
@@ -166,6 +167,13 @@ public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase { | |||
assertTrue("Expected output '"+exp+"' but got "+getLastRunResult().getStdErr(), | |||
getLastRunResult().getStdErr().equals(exp)); | |||
} | |||
public void test032_stringConcatForDEOW() { | |||
runTest("Compile time declarations (warning and error) do not accept string concatenation (with +)"); | |||
} | |||
public void test033_stringConcatForDEOWErrorCase() { | |||
runTest("Compile time declarations (warning and error) do not accept string concatenation (with +) (2)"); | |||
} | |||
} | |||
@@ -203,7 +203,6 @@ | |||
<run class="Proceeding3"/> | |||
</ajc-test> | |||
<ajc-test dir="bugs" pr="61572" | |||
title="ITDs on inner classes should be static context"> | |||
<compile files="PR61572.aj"> | |||
@@ -254,4 +253,25 @@ | |||
title="intertype initialisers should match field set pointcuts (oxford testcase)"> | |||
<compile files="Oxford.java"/> | |||
<run class="Oxford"/> | |||
</ajc-test> | |||
</ajc-test> | |||
<ajc-test dir="bugs" pr="54421" | |||
title="Compile time declarations (warning and error) do not accept string concatenation (with +)"> | |||
<compile files="decwStrings.java"> | |||
<message kind="warning" line="5"/> | |||
<message kind="warning" line="19" text="hello world"/> | |||
<message kind="warning" line="22" text="hello world"/> | |||
<message kind="warning" line="25" text="hello world"/> | |||
<message kind="warning" line="30" text="hello world"/> | |||
<message kind="warning" line="34" text="hello world"/> | |||
<message kind="warning" line="39" text="abcdefghijklmnopqrstuvwxyz"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs" pr="54421" | |||
title="Compile time declarations (warning and error) do not accept string concatenation (with +) (2)"> | |||
<compile files="decwStringsErroneous.java"> | |||
<message kind="error" line="22"/> | |||
</compile> | |||
</ajc-test> | |||
@@ -150,7 +150,7 @@ public class PatternParser { | |||
private Declare parseErrorOrWarning(boolean isError) { | |||
Pointcut pointcut = parsePointcut(); | |||
eat(":"); | |||
String message = parseStringLiteral(); | |||
String message = parsePossibleStringSequence(true); | |||
return new DeclareErrorOrWarning(isError, pointcut, message); | |||
} | |||
@@ -736,6 +736,32 @@ public class PatternParser { | |||
} | |||
} | |||
public String parsePossibleStringSequence(boolean shouldEnd) { | |||
StringBuffer result = new StringBuffer(); | |||
IToken token = tokenSource.next(); | |||
if (token.getLiteralKind()==null) { | |||
throw new ParserException("string",token); | |||
} | |||
while (token.getLiteralKind().equals("string")) { | |||
result.append(token.getString()); | |||
boolean plus = maybeEat("+"); | |||
if (!plus) break; | |||
token = tokenSource.next(); | |||
if (token.getLiteralKind()==null) { | |||
throw new ParserException("string",token); | |||
} | |||
} | |||
eatIdentifier(";"); | |||
IToken t = tokenSource.next(); | |||
if (shouldEnd && t!=IToken.EOF) { | |||
throw new ParserException("<string>;",token); | |||
} | |||
return result.toString(); | |||
} | |||
public String parseStringLiteral() { | |||
IToken token = tokenSource.next(); | |||
String literalKind = token.getLiteralKind(); |