From 743566fb8882ea922e0ff56ac83d1e6fdd9cd637 Mon Sep 17 00:00:00 2001 From: aclement Date: Tue, 7 Jun 2005 13:12:51 +0000 Subject: [PATCH] Tests and fix for pr98646: "Parser cannot parse varargs correctly". Fix is to make the tokenizer code understand '...' is an entire token rather than treating it as 3 dots. --- .../weaver/patterns/BasicTokenSource.java | 17 +++++++++- .../weaver/patterns/PatternParser.java | 32 ++----------------- .../weaver/patterns/VisitorTestCase.java | 6 ++-- 3 files changed, 22 insertions(+), 33 deletions(-) diff --git a/weaver/src/org/aspectj/weaver/patterns/BasicTokenSource.java b/weaver/src/org/aspectj/weaver/patterns/BasicTokenSource.java index dad3bccd4..a11413539 100644 --- a/weaver/src/org/aspectj/weaver/patterns/BasicTokenSource.java +++ b/weaver/src/org/aspectj/weaver/patterns/BasicTokenSource.java @@ -95,7 +95,6 @@ public class BasicTokenSource implements ITokenSource { case '\r': continue; case '*': - case '.': case '(': case ')': case '+': @@ -107,6 +106,22 @@ public class BasicTokenSource implements ITokenSource { case '@': tokens.add(BasicToken.makeOperator(makeString(ch), i-1, i-1)); continue; + case '.': + if ((i+2)<=chars.length) { + // could be '...' + char nextChar1 = chars[i]; + char nextChar2 = chars[i+1]; + if (ch==nextChar1 && ch==nextChar2) { + // '...' + tokens.add(BasicToken.makeIdentifier("...",i-1,i+1)); + i=i+2; + } else { + tokens.add(BasicToken.makeOperator(makeString(ch), i-1, i-1)); + } + } else { + tokens.add(BasicToken.makeOperator(makeString(ch), i-1, i-1)); + } + continue; case '&': case '|': if (i == chars.length) { diff --git a/weaver/src/org/aspectj/weaver/patterns/PatternParser.java b/weaver/src/org/aspectj/weaver/patterns/PatternParser.java index 211fdbb58..32ff9d1a9 100644 --- a/weaver/src/org/aspectj/weaver/patterns/PatternParser.java +++ b/weaver/src/org/aspectj/weaver/patterns/PatternParser.java @@ -639,21 +639,6 @@ public class PatternParser { dim++; } - // FIXME AV for Adrian - varargs need special handling since Token are 3x"." and not "..." - // the following works for 'call(* *(int, Integer...))' but not in the general case (see testAJDKExamples test f.e.) - // and the current code does not work for 'call(* *(int, Integer...))' -// int varargDot = 0; -// while (maybeEat(".")) { -// varargDot++; -// } -// boolean isVarArgs = false; -// if (varargDot > 0) { -// if (varargDot == 3) { -// isVarArgs = true; -// } else { -// throw new ParserException("Invalid varargs", tokenSource.peek()); -// } -// } boolean isVarArgs = maybeEat("..."); boolean includeSubtypes = maybeEat("+"); @@ -785,8 +770,10 @@ public class PatternParser { if (previous != null) { if (!isAdjacent(previous, tok)) break; } - if (tok.getString() == "*" || tok.isIdentifier()) { + if (tok.getString() == "*" || (tok.isIdentifier() && tok.getString()!="...")) { buf.append(tok.getString()); + } else if (tok.getString()=="...") { + break; } else if (tok.getLiteralKind() != null) { //System.err.println("literal kind: " + tok.getString()); String s = tok.getString(); @@ -829,19 +816,6 @@ public class PatternParser { if (afterDot == null) { buf.setLength(0); -// //FIXME AV for Adrian - the following does not works in the general case -// //varargs lookahead -// IToken next_1 = tokenSource.peek(); -// if (!IToken.EOF.equals(next_1) && next_1.getString().equals(".")) { -// IToken next_2 = tokenSource.peek(1); -// if (!IToken.EOF.equals(next_2) && next_2.getString().equals(".")) { -// IToken next_3 = tokenSource.peek(2); -// if (!IToken.EOF.equals(next_3) && next_3.getString().equals(".")) { -// // happens to be a varargs -// break; -// } -// } -// } // no elipsis or dotted name part if (!maybeEat(".")) break; // go on diff --git a/weaver/testsrc/org/aspectj/weaver/patterns/VisitorTestCase.java b/weaver/testsrc/org/aspectj/weaver/patterns/VisitorTestCase.java index 1280a6a3d..f7b90f1a5 100644 --- a/weaver/testsrc/org/aspectj/weaver/patterns/VisitorTestCase.java +++ b/weaver/testsrc/org/aspectj/weaver/patterns/VisitorTestCase.java @@ -47,9 +47,9 @@ public class VisitorTestCase extends TestCase { //empty so that JUnit does not complain about no test cases in there - this one beeing already in the suite } -// public void testTemp() { -// Pointcut.fromString("call(* *(int, Integer...))"); -// } + public void testTemp() { + Pointcut.fromString("call(* *(int, Integer...))"); + } // public void testPointcuts() { // if (pointcuts.isEmpty()) { -- 2.39.5