aspectj.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. Language: AspectJ
  3. Author: Hakan Ozler <ozler.hakan@gmail.com>
  4. Website: https://www.eclipse.org/aspectj/
  5. Description: Syntax Highlighting for the AspectJ Language which is a general-purpose aspect-oriented extension to the Java programming language.
  6. Audit: 2020
  7. */
  8. /** @type LanguageFn */
  9. function aspectj(hljs) {
  10. const regex = hljs.regex;
  11. const KEYWORDS = [
  12. "false",
  13. "synchronized",
  14. "int",
  15. "abstract",
  16. "float",
  17. "private",
  18. "char",
  19. "boolean",
  20. "static",
  21. "null",
  22. "if",
  23. "const",
  24. "for",
  25. "true",
  26. "while",
  27. "long",
  28. "throw",
  29. "strictfp",
  30. "finally",
  31. "protected",
  32. "import",
  33. "native",
  34. "final",
  35. "return",
  36. "void",
  37. "enum",
  38. "else",
  39. "extends",
  40. "implements",
  41. "break",
  42. "transient",
  43. "new",
  44. "catch",
  45. "instanceof",
  46. "byte",
  47. "super",
  48. "volatile",
  49. "case",
  50. "assert",
  51. "short",
  52. "package",
  53. "default",
  54. "double",
  55. "public",
  56. "try",
  57. "this",
  58. "switch",
  59. "continue",
  60. "throws",
  61. "privileged",
  62. "aspectOf",
  63. "adviceexecution",
  64. "proceed",
  65. "cflowbelow",
  66. "cflow",
  67. "initialization",
  68. "preinitialization",
  69. "staticinitialization",
  70. "withincode",
  71. "target",
  72. "within",
  73. "execution",
  74. "getWithinTypeName",
  75. "handler",
  76. "thisJoinPoint",
  77. "thisJoinPointStaticPart",
  78. "thisEnclosingJoinPointStaticPart",
  79. "declare",
  80. "parents",
  81. "warning",
  82. "error",
  83. "soft",
  84. "precedence",
  85. "thisAspectInstance"
  86. ];
  87. const SHORTKEYS = [
  88. "get",
  89. "set",
  90. "args",
  91. "call"
  92. ];
  93. return {
  94. name: 'AspectJ',
  95. keywords: KEYWORDS,
  96. illegal: /<\/|#/,
  97. contains: [
  98. hljs.COMMENT(
  99. /\/\*\*/,
  100. /\*\//,
  101. {
  102. relevance: 0,
  103. contains: [
  104. {
  105. // eat up @'s in emails to prevent them to be recognized as doctags
  106. begin: /\w+@/,
  107. relevance: 0
  108. },
  109. {
  110. className: 'doctag',
  111. begin: /@[A-Za-z]+/
  112. }
  113. ]
  114. }
  115. ),
  116. hljs.C_LINE_COMMENT_MODE,
  117. hljs.C_BLOCK_COMMENT_MODE,
  118. hljs.APOS_STRING_MODE,
  119. hljs.QUOTE_STRING_MODE,
  120. {
  121. className: 'class',
  122. beginKeywords: 'aspect',
  123. end: /[{;=]/,
  124. excludeEnd: true,
  125. illegal: /[:;"\[\]]/,
  126. contains: [
  127. { beginKeywords: 'extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton' },
  128. hljs.UNDERSCORE_TITLE_MODE,
  129. {
  130. begin: /\([^\)]*/,
  131. end: /[)]+/,
  132. keywords: KEYWORDS.concat(SHORTKEYS),
  133. excludeEnd: false
  134. }
  135. ]
  136. },
  137. {
  138. className: 'class',
  139. beginKeywords: 'class interface',
  140. end: /[{;=]/,
  141. excludeEnd: true,
  142. relevance: 0,
  143. keywords: 'class interface',
  144. illegal: /[:"\[\]]/,
  145. contains: [
  146. { beginKeywords: 'extends implements' },
  147. hljs.UNDERSCORE_TITLE_MODE
  148. ]
  149. },
  150. {
  151. // AspectJ Constructs
  152. beginKeywords: 'pointcut after before around throwing returning',
  153. end: /[)]/,
  154. excludeEnd: false,
  155. illegal: /["\[\]]/,
  156. contains: [
  157. {
  158. begin: regex.concat(hljs.UNDERSCORE_IDENT_RE, /\s*\(/),
  159. returnBegin: true,
  160. contains: [ hljs.UNDERSCORE_TITLE_MODE ]
  161. }
  162. ]
  163. },
  164. {
  165. begin: /[:]/,
  166. returnBegin: true,
  167. end: /[{;]/,
  168. relevance: 0,
  169. excludeEnd: false,
  170. keywords: KEYWORDS,
  171. illegal: /["\[\]]/,
  172. contains: [
  173. {
  174. begin: regex.concat(hljs.UNDERSCORE_IDENT_RE, /\s*\(/),
  175. keywords: KEYWORDS.concat(SHORTKEYS),
  176. relevance: 0
  177. },
  178. hljs.QUOTE_STRING_MODE
  179. ]
  180. },
  181. {
  182. // this prevents 'new Name(...), or throw ...' from being recognized as a function definition
  183. beginKeywords: 'new throw',
  184. relevance: 0
  185. },
  186. {
  187. // the function class is a bit different for AspectJ compared to the Java language
  188. className: 'function',
  189. begin: /\w+ +\w+(\.\w+)?\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,
  190. returnBegin: true,
  191. end: /[{;=]/,
  192. keywords: KEYWORDS,
  193. excludeEnd: true,
  194. contains: [
  195. {
  196. begin: regex.concat(hljs.UNDERSCORE_IDENT_RE, /\s*\(/),
  197. returnBegin: true,
  198. relevance: 0,
  199. contains: [ hljs.UNDERSCORE_TITLE_MODE ]
  200. },
  201. {
  202. className: 'params',
  203. begin: /\(/,
  204. end: /\)/,
  205. relevance: 0,
  206. keywords: KEYWORDS,
  207. contains: [
  208. hljs.APOS_STRING_MODE,
  209. hljs.QUOTE_STRING_MODE,
  210. hljs.C_NUMBER_MODE,
  211. hljs.C_BLOCK_COMMENT_MODE
  212. ]
  213. },
  214. hljs.C_LINE_COMMENT_MODE,
  215. hljs.C_BLOCK_COMMENT_MODE
  216. ]
  217. },
  218. hljs.C_NUMBER_MODE,
  219. {
  220. // annotation is also used in this language
  221. className: 'meta',
  222. begin: /@[A-Za-z]+/
  223. }
  224. ]
  225. };
  226. }
  227. module.exports = aspectj;