You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PseudoTokens.java 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.ajdt.internal.compiler.ast;
  13. import org.aspectj.weaver.IHasPosition;
  14. import org.aspectj.weaver.ISourceContext;
  15. import org.aspectj.weaver.patterns.BasicTokenSource;
  16. import org.aspectj.weaver.patterns.Declare;
  17. import org.aspectj.weaver.patterns.IToken;
  18. import org.aspectj.weaver.patterns.ParserException;
  19. import org.aspectj.weaver.patterns.PatternParser;
  20. import org.aspectj.weaver.patterns.PerClause;
  21. import org.aspectj.weaver.patterns.PerSingleton;
  22. import org.aspectj.weaver.patterns.Pointcut;
  23. import org.aspectj.weaver.patterns.TypePattern;
  24. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
  25. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
  26. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
  27. import org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser;
  28. import org.aspectj.org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
  29. public class PseudoTokens extends ASTNode {
  30. BasicTokenSource tokenSource;
  31. PseudoToken[] tokens; //XXX this is redundant with the field above
  32. String endToken;
  33. public PseudoTokens(PseudoToken[] tokens, ISourceContext sourceContext) {
  34. super();
  35. this.tokens = tokens;
  36. this.tokenSource = new BasicTokenSource(tokens, sourceContext);
  37. endToken = tokens[tokens.length-1].getString();
  38. sourceStart = tokens[0].sourceStart;
  39. sourceEnd = tokens[tokens.length-2].sourceEnd;
  40. }
  41. public Pointcut parsePointcut(Parser parser) {
  42. PatternParser patternParser = new PatternParser(tokenSource);
  43. try {
  44. Pointcut ret = patternParser.parsePointcut();
  45. checkEof(parser);
  46. return ret;
  47. } catch (ParserException pe) {
  48. reportError(parser, pe);
  49. return Pointcut.makeMatchesNothing(Pointcut.SYMBOLIC);
  50. }
  51. }
  52. private void checkEof(Parser parser) {
  53. IToken last = tokenSource.next();
  54. if (tokenSource.next() != IToken.EOF) {
  55. parser.problemReporter().parseError(last.getStart(), last.getEnd(),
  56. TerminalTokens.TokenNameIdentifier,
  57. last.getString().toCharArray(),
  58. last.getString(),
  59. new String[] {endToken});
  60. }
  61. }
  62. private void reportError(Parser parser, ParserException pe) {
  63. IHasPosition tok = pe.getLocation();
  64. int start, end;
  65. if (tok == IToken.EOF) {
  66. start = sourceEnd+1;
  67. end = sourceEnd+1;
  68. } else {
  69. start = tok.getStart();
  70. end = tok.getEnd();
  71. }
  72. String found = "<unknown>";
  73. if (tok instanceof IToken) {
  74. found = ((IToken)tok).getString();
  75. }
  76. parser.problemReporter().parseError(start, end,
  77. TerminalTokens.TokenNameIdentifier,
  78. found.toCharArray(),
  79. found,
  80. new String[] {pe.getMessage()});
  81. }
  82. public TypePattern maybeParseDominatesPattern(Parser parser) {
  83. PatternParser patternParser = new PatternParser(tokenSource);
  84. try {
  85. if (patternParser.maybeEatIdentifier("dominates")) {
  86. // there is no eof check here
  87. return patternParser.parseTypePattern();
  88. } else {
  89. return null;
  90. }
  91. } catch (ParserException pe) {
  92. reportError(parser, pe);
  93. return null;
  94. }
  95. }
  96. public PerClause parsePerClause(Parser parser) {
  97. PatternParser patternParser = new PatternParser(tokenSource);
  98. try {
  99. PerClause ret = patternParser.maybeParsePerClause();
  100. checkEof(parser);
  101. if (ret == null) return new PerSingleton();
  102. else return ret;
  103. } catch (ParserException pe) {
  104. reportError(parser, pe);
  105. return new PerSingleton();
  106. }
  107. }
  108. // public TypePattern parseTypePattern(Parser parser) {
  109. // }
  110. //
  111. public Declare parseDeclare(Parser parser) {
  112. PatternParser patternParser = new PatternParser(tokenSource);
  113. try {
  114. Declare ret = patternParser.parseDeclare();
  115. checkEof(parser);
  116. return ret;
  117. } catch (ParserException pe) {
  118. reportError(parser, pe);
  119. return null;
  120. }
  121. }
  122. public Declare parseAnnotationDeclare(Parser parser) {
  123. PatternParser patternParser = new PatternParser(tokenSource);
  124. try {
  125. Declare ret = patternParser.parseDeclareAnnotation();
  126. checkEof(parser);
  127. return ret;
  128. } catch (ParserException pe) {
  129. reportError(parser, pe);
  130. return null;
  131. } }
  132. public void postParse(TypeDeclaration typeDec, MethodDeclaration enclosingDec) {
  133. int counter = 0; // Counter can be used by postParse as a value to compute uniqueness (if required)
  134. for (int i=0, len=tokens.length; i < len; i++) {
  135. counter+=tokens[i].postParse(typeDec, enclosingDec, counter);
  136. }
  137. }
  138. /* (non-Javadoc)
  139. * @see org.eclipse.jdt.internal.compiler.ast.ASTNode#print(int, java.lang.StringBuffer)
  140. */
  141. public StringBuffer print(int indent, StringBuffer output) {
  142. output.append(tokenSource.toString());
  143. return output;
  144. }
  145. }