aspectj.js 5.1 KB

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