From 45bce91f642a86ca3db7238d9e4cfb81d85e4f5b Mon Sep 17 00:00:00 2001 From: aclement Date: Thu, 29 Jul 2004 12:39:42 +0000 Subject: [PATCH] Fix for Bugzilla Bug 61536 Front-end bug, shouldn't allow patterns of the form foo.., should be foo..* --- tests/ajcTests.xml | 13 +++++++++++++ tests/bugs/EllipsesStar.java | 13 +++++++++++++ .../aspectj/weaver/patterns/PatternParser.java | 16 +++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/bugs/EllipsesStar.java diff --git a/tests/ajcTests.xml b/tests/ajcTests.xml index 024bc1d1e..8b42152d3 100644 --- a/tests/ajcTests.xml +++ b/tests/ajcTests.xml @@ -7819,4 +7819,17 @@ + + + + + + + + + + + + diff --git a/tests/bugs/EllipsesStar.java b/tests/bugs/EllipsesStar.java new file mode 100644 index 000000000..940db8a86 --- /dev/null +++ b/tests/bugs/EllipsesStar.java @@ -0,0 +1,13 @@ +// 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 diff --git a/weaver/src/org/aspectj/weaver/patterns/PatternParser.java b/weaver/src/org/aspectj/weaver/patterns/PatternParser.java index 0f0bd3e57..89a168fef 100644 --- a/weaver/src/org/aspectj/weaver/patterns/PatternParser.java +++ b/weaver/src/org/aspectj/weaver/patterns/PatternParser.java @@ -448,12 +448,17 @@ public class PatternParser { 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; } @@ -481,13 +486,22 @@ public class PatternParser { 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) { -- 2.39.5