<compile files="PrimitiveCoercionInExactTypePatternMatching.java"/>
</ajc-test>
+ <ajc-test dir="bugs"
+ pr="61536" title="Front-end bug, shouldn't allow patterns of the form foo.., should be foo..*">
+ <compile files="EllipsesStar.java">
+ <message kind="error" line="3" text="Syntax error on token"/>
+ <message kind="error" line="4" text="Syntax error on token"/>
+ <message kind="error" line="5" text="Syntax error on token"/>
+ <message kind="error" line="6" text="Syntax error on token"/>
+ <message kind="error" line="8" text="Syntax error on token"/>
+ <message kind="error" line="10" text="Syntax error on token"/>
+ <message kind="error" line="12" text="Syntax error on token"/>
+ </compile>
+ </ajc-test>
+
</suite>
--- /dev/null
+// Name patterns can't end with '..'
+aspect A {
+ pointcut endsDot(): call(* java.(..));
+ pointcut p1(): call(* java.lang..(..));
+ pointcut p2(): call((Integer || java.lang..) m(..));
+ pointcut p3(): call(* m() throws java.lang..);
+
+ pointcut p4(): call(* a..b..c..d..(..));
+
+ pointcut p5(): call(* a....(..));
+
+ pointcut p6(): call(java. m());
+}
\ No newline at end of file
List names = new ArrayList();
StringBuffer buf = new StringBuffer();
IToken previous = null;
+ boolean justProcessedEllipsis = false; // Remember if we just dealt with an ellipsis (PR61536)
+ boolean justProcessedDot = false;
+ boolean onADot = false;
while (true) {
- IToken tok;
+ IToken tok = null;
int startPos = tokenSource.peek().getStart();
String afterDot = null;
while (true) {
+ if (previous !=null && previous.getString().equals(".")) justProcessedDot = true;
tok = tokenSource.peek();
+ onADot = (tok.getString().equals("."));
if (previous != null) {
if (!isAdjacent(previous, tok)) break;
}
throw new ParserException("expected name pattern", tok);
}
+ if (buf.length() == 0 && justProcessedEllipsis) {
+ throw new ParserException("name pattern cannot finish with ..", tok);
+ }
+ if (buf.length() == 0 && justProcessedDot && !onADot) {
+ throw new ParserException("name pattern cannot finish with .", tok);
+ }
+
if (buf.length() == 0) {
names.add(NamePattern.ELLIPSIS);
+ justProcessedEllipsis = true;
} else {
checkLegalName(buf.toString(), previous);
NamePattern ret = new NamePattern(buf.toString());
ret.setLocation(sourceContext, startPos, endPos);
names.add(ret);
+ justProcessedEllipsis = false;
}
if (afterDot == null) {