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.

HandleProviderDelimiter.java 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /********************************************************************
  2. * Copyright (c) 2006 Contributors. All rights reserved.
  3. * This program and the accompanying materials are made available
  4. * under the terms of the Eclipse Public License v 2.0
  5. * which accompanies this distribution and is available at
  6. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  7. *
  8. * Contributors: IBM Corporation - initial API and implementation
  9. * Helen Hawkins - initial version
  10. *******************************************************************/
  11. package org.aspectj.asm.internal;
  12. import org.aspectj.asm.IProgramElement;
  13. /**
  14. * Uses "typesafe enum" pattern.
  15. */
  16. public class HandleProviderDelimiter {
  17. // TODO:
  18. // Keep constants in sync between
  19. // - org.eclipse.jdt.internal.core.JavaElement (JDT Core),
  20. // - org.eclipse.ajdt.core.javaelements.AspectElement (AJDT Core),
  21. // - org.aspectj.asm.internal.HandleProviderDelimiter (AspectJ).
  22. // The reason is that JDT Core introduces new delimiters for new Java language constructs once in a while.
  23. // This led to clashes with existing AJDT symbols in the past already, which consequently had to be changed
  24. // to use other characters. Therefore, manual synchronisation with JDT Core is necessary.
  25. // Taken from org.eclipse.jdt.internal.core.JavaElement (JDT Core)
  26. public static final HandleProviderDelimiter ESCAPE = new HandleProviderDelimiter('\\');
  27. public static final HandleProviderDelimiter JAVAPROJECT = new HandleProviderDelimiter('=');
  28. public static final HandleProviderDelimiter PACKAGEFRAGMENTROOT = new HandleProviderDelimiter('/');
  29. public static final HandleProviderDelimiter PACKAGEFRAGMENT = new HandleProviderDelimiter('<');
  30. public static final HandleProviderDelimiter FIELD = new HandleProviderDelimiter('^');
  31. public static final HandleProviderDelimiter METHOD = new HandleProviderDelimiter('~');
  32. public static final HandleProviderDelimiter INITIALIZER = new HandleProviderDelimiter('|');
  33. public static final HandleProviderDelimiter COMPILATIONUNIT = new HandleProviderDelimiter('{');
  34. public static final HandleProviderDelimiter CLASSFILE = new HandleProviderDelimiter('(');
  35. public static final HandleProviderDelimiter MODULAR_CLASSFILE = new HandleProviderDelimiter('\'');
  36. public static final HandleProviderDelimiter TYPE = new HandleProviderDelimiter('[');
  37. public static final HandleProviderDelimiter PACKAGEDECLARATION = new HandleProviderDelimiter('%');
  38. public static final HandleProviderDelimiter IMPORTDECLARATION = new HandleProviderDelimiter('#');
  39. public static final HandleProviderDelimiter COUNT = new HandleProviderDelimiter('!');
  40. // these below are not currently used because no iprogramelement.kind
  41. // equivalent
  42. public static final HandleProviderDelimiter LOCALVARIABLE = new HandleProviderDelimiter('@');
  43. public static final HandleProviderDelimiter TYPE_PARAMETER = new HandleProviderDelimiter(']');
  44. public static final HandleProviderDelimiter ANNOTATION = new HandleProviderDelimiter('}');
  45. public static final HandleProviderDelimiter LAMBDA_EXPRESSION = new HandleProviderDelimiter(')');
  46. public static final HandleProviderDelimiter LAMBDA_METHOD = new HandleProviderDelimiter('&');
  47. public static final HandleProviderDelimiter STRING = new HandleProviderDelimiter('"');
  48. public static final HandleProviderDelimiter MODULE = new HandleProviderDelimiter('`');
  49. public static final HandleProviderDelimiter DELIMITER_ESCAPE = new HandleProviderDelimiter('=');
  50. // Taken from org.aspectj.asm.internal.HandleProviderDelimiter (AspectJ)
  51. public static final HandleProviderDelimiter ASPECT_CU = new HandleProviderDelimiter('*');
  52. public static final HandleProviderDelimiter ADVICE = new HandleProviderDelimiter('§');
  53. public static final HandleProviderDelimiter ASPECT_TYPE = new HandleProviderDelimiter('>');
  54. public static final HandleProviderDelimiter CODEELEMENT = new HandleProviderDelimiter('?');
  55. public static final HandleProviderDelimiter ITD_FIELD = new HandleProviderDelimiter(',');
  56. public static final HandleProviderDelimiter ITD_METHOD = new HandleProviderDelimiter('°');
  57. public static final HandleProviderDelimiter DECLARE = new HandleProviderDelimiter('´');
  58. public static final HandleProviderDelimiter POINTCUT = new HandleProviderDelimiter('©');
  59. // Special delimiter for phantom handles
  60. public static final HandleProviderDelimiter PHANTOM = new HandleProviderDelimiter(';');
  61. private static char empty = ' ';
  62. private final char delim;
  63. private HandleProviderDelimiter(char delim) {
  64. this.delim = delim;
  65. }
  66. /**
  67. * Returns the delimiter for the HandleProviderDelimiter, for example ASPECT returns '*' and METHOD returns '~'
  68. */
  69. public char getDelimiter() {
  70. return delim;
  71. }
  72. /**
  73. * Returns the delimiter for the given IProgramElement for example if the IProgramElement is an aspect returns '*' and if the
  74. * IProgramElement is a method returns '~'
  75. */
  76. public static char getDelimiter(IProgramElement ipe) {
  77. IProgramElement.Kind kind = ipe.getKind();
  78. if (kind.equals(IProgramElement.Kind.PROJECT)) {
  79. return JAVAPROJECT.getDelimiter();
  80. } else if (kind.equals(IProgramElement.Kind.PACKAGE)) {
  81. return PACKAGEFRAGMENT.getDelimiter();
  82. } else if (kind.equals(IProgramElement.Kind.FILE_JAVA)) {
  83. if (ipe.getName().endsWith(".aj")) {
  84. return ASPECT_CU.getDelimiter();
  85. } else {
  86. return COMPILATIONUNIT.getDelimiter();
  87. }
  88. } else if (kind.equals(IProgramElement.Kind.FILE_ASPECTJ)) {
  89. return ASPECT_CU.getDelimiter();
  90. } else if (kind.equals(IProgramElement.Kind.IMPORT_REFERENCE)) {
  91. return IMPORTDECLARATION.getDelimiter();
  92. } else if (kind.equals(IProgramElement.Kind.PACKAGE_DECLARATION)) {
  93. return PACKAGEDECLARATION.getDelimiter();
  94. } else if (kind.equals(IProgramElement.Kind.CLASS) || kind.equals(IProgramElement.Kind.INTERFACE)
  95. || kind.equals(IProgramElement.Kind.ENUM) || kind.equals(IProgramElement.Kind.ANNOTATION)) {
  96. return TYPE.getDelimiter();
  97. } else if (kind.equals(IProgramElement.Kind.ASPECT)) {
  98. if (ipe.isAnnotationStyleDeclaration()) {
  99. return TYPE.getDelimiter();
  100. } else {
  101. return ASPECT_TYPE.getDelimiter();
  102. }
  103. } else if (kind.equals(IProgramElement.Kind.INITIALIZER)) {
  104. return INITIALIZER.getDelimiter();
  105. } else if (kind.equals(IProgramElement.Kind.INTER_TYPE_FIELD)) {
  106. return ITD_FIELD.getDelimiter();
  107. } else if (kind.equals(IProgramElement.Kind.INTER_TYPE_METHOD) || kind.equals(IProgramElement.Kind.INTER_TYPE_CONSTRUCTOR)
  108. || kind.equals(IProgramElement.Kind.INTER_TYPE_PARENT)) {
  109. return ITD_METHOD.getDelimiter();
  110. } else if (kind.equals(IProgramElement.Kind.CONSTRUCTOR) || kind.equals(IProgramElement.Kind.METHOD)) {
  111. return METHOD.getDelimiter();
  112. } else if (kind.equals(IProgramElement.Kind.FIELD) || kind.equals(IProgramElement.Kind.ENUM_VALUE)) {
  113. return FIELD.getDelimiter();
  114. } else if (kind.equals(IProgramElement.Kind.POINTCUT)) {
  115. if (ipe.isAnnotationStyleDeclaration()) {
  116. return METHOD.getDelimiter();
  117. } else {
  118. return POINTCUT.getDelimiter();
  119. }
  120. } else if (kind.equals(IProgramElement.Kind.ADVICE)) {
  121. if (ipe.isAnnotationStyleDeclaration()) {
  122. return METHOD.getDelimiter();
  123. } else {
  124. return ADVICE.getDelimiter();
  125. }
  126. } else if (kind.equals(IProgramElement.Kind.DECLARE_PARENTS) || kind.equals(IProgramElement.Kind.DECLARE_WARNING)
  127. || kind.equals(IProgramElement.Kind.DECLARE_ERROR) || kind.equals(IProgramElement.Kind.DECLARE_SOFT)
  128. || kind.equals(IProgramElement.Kind.DECLARE_PRECEDENCE)
  129. || kind.equals(IProgramElement.Kind.DECLARE_ANNOTATION_AT_CONSTRUCTOR)
  130. || kind.equals(IProgramElement.Kind.DECLARE_ANNOTATION_AT_FIELD)
  131. || kind.equals(IProgramElement.Kind.DECLARE_ANNOTATION_AT_METHOD)
  132. || kind.equals(IProgramElement.Kind.DECLARE_ANNOTATION_AT_TYPE)) {
  133. return DECLARE.getDelimiter();
  134. } else if (kind.equals(IProgramElement.Kind.CODE)) {
  135. return CODEELEMENT.getDelimiter();
  136. } else if (kind == IProgramElement.Kind.FILE) {
  137. if (ipe.getName().endsWith(".class")) {
  138. return CLASSFILE.getDelimiter();
  139. } else if (ipe.getName().endsWith(".aj")) {
  140. return ASPECT_CU.getDelimiter();
  141. } else if (ipe.getName().endsWith(".java")) {
  142. return COMPILATIONUNIT.getDelimiter();
  143. } else {
  144. return empty;
  145. }
  146. }
  147. return empty;
  148. }
  149. }