--[[ delphi.lang v0.0.1 | 2019/01/05 | Highlight v3.48
********************************************************************************
*                                                                              *
*                         Delphi Syntax for Highlight                          *
*                                                                              *
********************************************************************************
Adapted by Tristano Ajmone. Original author unknown (maybe André Simon?).
License: GNU GPL v3.

This is a readaptation of the Pascal syntax definition ("pas.lang") that ships
with Highlight; it was tweaked to cover Delphi native types and keywords.
Being a derivative work from a file taken from the Highlight project, it falls
under the same license of Highlight (GNU GPL v3).
]]

Description="delphi"

Categories = {"source"}

Digits=[[ (?:0x|0X|\$)[0-9a-fA-F]+|\d*[\.\_]?\d+(?:[eE][\-\+]\d+)?[lLuUbfdm]* ]]

Keywords={
  -- ===========================================================================
  --                              Delphi Keywords
  -- ===========================================================================
  -- Keywords list is the same as the original Pascal langDef.
  -- ---------------------------------------------------------------------------
  { Id=1,
    List={
      "absolute", "abstract", "and", "array", "as", "asm", "assembler", "automated", "begin", "case",
      "cdecl", "class", "const", "constructor", "destructor", "dispid", "dispinterface", "div",
      "do", "downto", "dynamic", "else", "end", "except", "export", "exports", "external", "far",
      "file", "finalization", "finally", "for", "forward", "function", "goto", "if", "implementation",
      "in", "inherited", "initialization", "inline", "interface", "is", "label", "library", "message",
      "mod", "near", "nil", "not", "object", "of", "or", "out", "override", "packed", "pascal",
      "private", "procedure", "program", "property", "protected", "public", "published", "raise",
      "record", "register", "repeat", "resourcestring", "safecall", "set", "shl", "shr", "stdcall",
      "then", "threadvar", "to", "try", "type", "unit", "until", "uses", "var", "virtual", "while", "with",
      "xor", "break", "continue", "on", "self", "dispose", "exit", "new"
    },
  },
  -- ===========================================================================
  --                             Delphi Data Types
  -- ===========================================================================
  -- Keywords list updated based on:
  -- http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Delphi_Data_Types_for_API_Integration
  -- ---------------------------------------------------------------------------
  { Id=2,
    List={
      "ansichar", "ansistring", "array", "boolean", "byte", "bytebool", "cardinal", "char", "currency",
      "double", "false", "fixedint", "fixeduint", "int64", "integer", "longbool", "longint", "longword",
      "nativeint", "nativeuint", "pansichar", "pansistring", "pboolean", "pbyte", "pcardinal", "pchar",
      "pcurrency", "pdouble", "pfixedint", "pfixeduint", "pint64", "pinteger", "plongbool", "plongint",
      "plongword", "pnativeint", "pnativeuint", "pointer", "ppointer", "prawbytestring", "pshortint",
      "pshortstring", "psingle", "psmallint", "pstring", "puint64", "punicodestring", "pvariant",
      "pwidechar", "pwidestring", "pword", "pwordbool", "rawbytestring", "real", "record", "shortint",
      "shortstring", "single", "smallint", "string", "tdoublerec", "text", "true", "tsinglerec", "type",
      "uint64", "unicodestring", "variant", "widechar", "widestring", "word", "wordbool", },
  },
  { Id=4,
    Regex=[[(\w+)\s*\(]],
  },
}

Strings={
  Delimiter=[["|']],
  Escape="#[[:digit:]]+"
}

IgnoreCase=true

Comments={
  { Block=false,
    Delimiter= { [[//]] },
  },
  { Block=true,
    Nested=false,
    Delimiter= { [[\{(?!\$)]],[[\}]] }
  },
  { Block=true,
    Nested=false,
    Delimiter= { [[\(\*]],[[\*\)]] }
  }
}

PreProcessor = {
  Prefix=[[{]],
  Continuation="\x13",
}

NestedSections = {
  {
    Lang="assembler",
    Delimiter= { [[asm]], [[end;]] }
  }
}

Operators=[[\(|\)|\[|\]|,|;|:|&|<|>|\!|\=|\/|\*|\%|\+|\-|\@|\.|\^]]

function OnStateChange(oldState, newState, token)
  if token=="}" and oldState==HL_PREPROC then
    return HL_PREPROC_END
  end
  return newState
end

--[[============================================================================
                                  CHANGELOG
================================================================================
v0.0.1  - 2019/01/05 (Highlight v3.48)
        - First release. Adapted from the Pascal syntax definition ("pas.lang").
        - Updated keywords Id2 list to include the Delphi native Data Types.
--]]
