187 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @param {string} value
 | 
						|
 * @returns {RegExp}
 | 
						|
 * */
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {RegExp | string } re
 | 
						|
 * @returns {string}
 | 
						|
 */
 | 
						|
function source(re) {
 | 
						|
  if (!re) return null;
 | 
						|
  if (typeof re === "string") return re;
 | 
						|
 | 
						|
  return re.source;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {...(RegExp | string) } args
 | 
						|
 * @returns {string}
 | 
						|
 */
 | 
						|
function concat(...args) {
 | 
						|
  const joined = args.map((x) => source(x)).join("");
 | 
						|
  return joined;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
Language: AspectJ
 | 
						|
Author: Hakan Ozler <ozler.hakan@gmail.com>
 | 
						|
Website: https://www.eclipse.org/aspectj/
 | 
						|
Description: Syntax Highlighting for the AspectJ Language which is a general-purpose aspect-oriented extension to the Java programming language.
 | 
						|
Audit: 2020
 | 
						|
*/
 | 
						|
 | 
						|
/** @type LanguageFn */
 | 
						|
function aspectj(hljs) {
 | 
						|
  const KEYWORDS =
 | 
						|
    'false synchronized int abstract float private char boolean static null if const ' +
 | 
						|
    'for true while long throw strictfp finally protected import native final return void ' +
 | 
						|
    'enum else extends implements break transient new catch instanceof byte super volatile case ' +
 | 
						|
    'assert short package default double public try this switch continue throws privileged ' +
 | 
						|
    'aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization ' +
 | 
						|
    'staticinitialization withincode target within execution getWithinTypeName handler ' +
 | 
						|
    'thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents ' +
 | 
						|
    'warning error soft precedence thisAspectInstance';
 | 
						|
  const SHORTKEYS = 'get set args call';
 | 
						|
 | 
						|
  return {
 | 
						|
    name: 'AspectJ',
 | 
						|
    keywords: KEYWORDS,
 | 
						|
    illegal: /<\/|#/,
 | 
						|
    contains: [
 | 
						|
      hljs.COMMENT(
 | 
						|
        /\/\*\*/,
 | 
						|
        /\*\//,
 | 
						|
        {
 | 
						|
          relevance: 0,
 | 
						|
          contains: [
 | 
						|
            {
 | 
						|
              // eat up @'s in emails to prevent them to be recognized as doctags
 | 
						|
              begin: /\w+@/,
 | 
						|
              relevance: 0
 | 
						|
            },
 | 
						|
            {
 | 
						|
              className: 'doctag',
 | 
						|
              begin: /@[A-Za-z]+/
 | 
						|
            }
 | 
						|
          ]
 | 
						|
        }
 | 
						|
      ),
 | 
						|
      hljs.C_LINE_COMMENT_MODE,
 | 
						|
      hljs.C_BLOCK_COMMENT_MODE,
 | 
						|
      hljs.APOS_STRING_MODE,
 | 
						|
      hljs.QUOTE_STRING_MODE,
 | 
						|
      {
 | 
						|
        className: 'class',
 | 
						|
        beginKeywords: 'aspect',
 | 
						|
        end: /[{;=]/,
 | 
						|
        excludeEnd: true,
 | 
						|
        illegal: /[:;"\[\]]/,
 | 
						|
        contains: [
 | 
						|
          {
 | 
						|
            beginKeywords: 'extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton'
 | 
						|
          },
 | 
						|
          hljs.UNDERSCORE_TITLE_MODE,
 | 
						|
          {
 | 
						|
            begin: /\([^\)]*/,
 | 
						|
            end: /[)]+/,
 | 
						|
            keywords: KEYWORDS + ' ' + SHORTKEYS,
 | 
						|
            excludeEnd: false
 | 
						|
          }
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        className: 'class',
 | 
						|
        beginKeywords: 'class interface',
 | 
						|
        end: /[{;=]/,
 | 
						|
        excludeEnd: true,
 | 
						|
        relevance: 0,
 | 
						|
        keywords: 'class interface',
 | 
						|
        illegal: /[:"\[\]]/,
 | 
						|
        contains: [
 | 
						|
          {
 | 
						|
            beginKeywords: 'extends implements'
 | 
						|
          },
 | 
						|
          hljs.UNDERSCORE_TITLE_MODE
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        // AspectJ Constructs
 | 
						|
        beginKeywords: 'pointcut after before around throwing returning',
 | 
						|
        end: /[)]/,
 | 
						|
        excludeEnd: false,
 | 
						|
        illegal: /["\[\]]/,
 | 
						|
        contains: [
 | 
						|
          {
 | 
						|
            begin: concat(hljs.UNDERSCORE_IDENT_RE, /\s*\(/),
 | 
						|
            returnBegin: true,
 | 
						|
            contains: [ hljs.UNDERSCORE_TITLE_MODE ]
 | 
						|
          }
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        begin: /[:]/,
 | 
						|
        returnBegin: true,
 | 
						|
        end: /[{;]/,
 | 
						|
        relevance: 0,
 | 
						|
        excludeEnd: false,
 | 
						|
        keywords: KEYWORDS,
 | 
						|
        illegal: /["\[\]]/,
 | 
						|
        contains: [
 | 
						|
          {
 | 
						|
            begin: concat(hljs.UNDERSCORE_IDENT_RE, /\s*\(/),
 | 
						|
            keywords: KEYWORDS + ' ' + SHORTKEYS,
 | 
						|
            relevance: 0
 | 
						|
          },
 | 
						|
          hljs.QUOTE_STRING_MODE
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      {
 | 
						|
        // this prevents 'new Name(...), or throw ...' from being recognized as a function definition
 | 
						|
        beginKeywords: 'new throw',
 | 
						|
        relevance: 0
 | 
						|
      },
 | 
						|
      {
 | 
						|
        // the function class is a bit different for AspectJ compared to the Java language
 | 
						|
        className: 'function',
 | 
						|
        begin: /\w+ +\w+(\.\w+)?\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,
 | 
						|
        returnBegin: true,
 | 
						|
        end: /[{;=]/,
 | 
						|
        keywords: KEYWORDS,
 | 
						|
        excludeEnd: true,
 | 
						|
        contains: [
 | 
						|
          {
 | 
						|
            begin: concat(hljs.UNDERSCORE_IDENT_RE, /\s*\(/),
 | 
						|
            returnBegin: true,
 | 
						|
            relevance: 0,
 | 
						|
            contains: [ hljs.UNDERSCORE_TITLE_MODE ]
 | 
						|
          },
 | 
						|
          {
 | 
						|
            className: 'params',
 | 
						|
            begin: /\(/,
 | 
						|
            end: /\)/,
 | 
						|
            relevance: 0,
 | 
						|
            keywords: KEYWORDS,
 | 
						|
            contains: [
 | 
						|
              hljs.APOS_STRING_MODE,
 | 
						|
              hljs.QUOTE_STRING_MODE,
 | 
						|
              hljs.C_NUMBER_MODE,
 | 
						|
              hljs.C_BLOCK_COMMENT_MODE
 | 
						|
            ]
 | 
						|
          },
 | 
						|
          hljs.C_LINE_COMMENT_MODE,
 | 
						|
          hljs.C_BLOCK_COMMENT_MODE
 | 
						|
        ]
 | 
						|
      },
 | 
						|
      hljs.C_NUMBER_MODE,
 | 
						|
      {
 | 
						|
        // annotation is also used in this language
 | 
						|
        className: 'meta',
 | 
						|
        begin: /@[A-Za-z]+/
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
module.exports = aspectj;
 |