text: /*
  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.
   */
  
  /** @type LanguageFn */
  function aspectj(hljs) {
    var 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';
    var 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 : 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 : 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 : 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;
  