Files
HeidiSQL/components/synedit/Source/SynHighlighterJava.pas
2021-03-16 20:12:46 +01:00

1011 lines
26 KiB
ObjectPascal

{-------------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: SynHighlighterJava.pas, released 2000-04-10.
The Original Code is based on the DcjSynJava.pas file from the
mwEdit component suite by Martin Waldenburg and other developers, the Initial
Author of this file is Michael Trier.
Unicode translation by Maël Hörz.
All Rights Reserved.
Contributors to the SynEdit and mwEdit projects are listed in the
Contributors.txt file.
Alternatively, the contents of this file may be used under the terms of the
GNU General Public License Version 2 or later (the "GPL"), in which case
the provisions of the GPL are applicable instead of those above.
If you wish to allow use of your version of this file only under the terms
of the GPL and not to allow others to use your version of this file
under the MPL, indicate your decision by deleting the provisions above and
replace them with the notice and other provisions required by the GPL.
If you do not delete the provisions above, a recipient may use your version
of this file under either the MPL or the GPL.
$Id: SynHighlighterJava.pas,v 1.18.2.10 2008/09/14 16:25:00 maelh Exp $
You may retrieve the latest version of this file at the SynEdit home page,
located at http://SynEdit.SourceForge.net
Known Issues:
-------------------------------------------------------------------------------}
{
@abstract(Provides a Java highlighter for SynEdit)
@author(Michael Trier)
@created(December 1998, converted to SynEdit 2000-04-10 by Michael Hieke)
@lastmod(2000-06-23)
The SynHighlighterJava unit provides SynEdit with a Java source (.java) highlighter.
}
unit SynHighlighterJava;
{$I SynEdit.inc}
interface
uses
Graphics,
SynEditTypes,
SynEditHighlighter,
SynUnicode,
SysUtils, Classes;
type
TtkTokenKind = (tkComment, tkDocument, tkIdentifier, tkInvalid, tkKey,
tkNull, tkNumber, tkSpace, tkString, tkSymbol, tkUnknown);
TxtkTokenKind = (
xtkAdd, xtkAddAssign, xtkAnd, xtkAndAssign, xtkAssign, xtkBitComplement,
xtkBraceClose, xtkBraceOpen, xtkColon, xtkCondAnd, xtkCondOr, xtkDecrement,
xtkDivide, xtkDivideAssign, xtkGreaterThan, xtkGreaterThanEqual, xtkIncOr,
xtkIncOrAssign, xtkIncrement, xtkLessThan, xtkLessThanEqual,
xtkLogComplement, xtkLogEqual, xtkMultiply, xtkMultiplyAssign, xtkNotEqual,
xtkPoint, xtkQuestion, xtkRemainder, xtkRemainderAssign, xtkRoundClose,
xtkRoundOpen, xtkSemiColon, xtkShiftLeft, xtkShiftLeftAssign, xtkShiftRight,
xtkShiftRightAssign, xtkSquareClose, xtkSquareOpen, xtkSubtract,
xtkSubtractAssign, xtkUnsignShiftRight, xtkUnsignShiftRightAssign, xtkXor,
xtkXorAssign, xtkComma);
TRangeState = (rsANil, rsComment, rsDocument, rsUnknown);
PIdentFuncTableFunc = ^TIdentFuncTableFunc;
TIdentFuncTableFunc = function (Index: Integer): TtkTokenKind of object;
TSynJavaSyn = class(TSynCustomHighlighter)
private
FRange: TRangeState;
FRoundCount: Integer;
FSquareCount: Integer;
FTokenID: TtkTokenKind;
FExtTokenID: TxtkTokenKind;
FIdentFuncTable: array[0..112] of TIdentFuncTableFunc;
FCommentAttri: TSynHighlighterAttributes;
FDocumentAttri: TSynHighlighterAttributes;
FIdentifierAttri: TSynHighlighterAttributes;
FInvalidAttri: TSynHighlighterAttributes;
FKeyAttri: TSynHighlighterAttributes;
FNumberAttri: TSynHighlighterAttributes;
FSpaceAttri: TSynHighlighterAttributes;
FStringAttri: TSynHighlighterAttributes;
FSymbolAttri: TSynHighlighterAttributes;
function AltFunc(Index: Integer): TtkTokenKind;
function KeyWordFunc(Index: Integer): TtkTokenKind;
function HashKey(Str: PWideChar): Cardinal;
function IdentKind(MayBe: PWideChar): TtkTokenKind;
procedure InitIdent;
procedure CommentProc;
procedure AndSymbolProc;
procedure AsciiCharProc;
procedure AtSymbolProc;
procedure BraceCloseProc;
procedure BraceOpenProc;
procedure CRProc;
procedure ColonProc;
procedure CommaProc;
procedure EqualProc;
procedure GreaterProc;
procedure IdentProc;
procedure LFProc;
procedure LowerProc;
procedure MinusProc;
procedure MultiplyProc;
procedure NotSymbolProc;
procedure NullProc;
procedure NumberProc;
procedure OrSymbolProc;
procedure PlusProc;
procedure PointProc;
procedure PoundProc;
procedure QuestionProc;
procedure RemainderSymbolProc;
procedure RoundCloseProc;
procedure RoundOpenProc;
procedure SemiColonProc;
procedure SlashProc;
procedure SpaceProc;
procedure SquareCloseProc;
procedure SquareOpenProc;
procedure StringProc;
procedure TildeProc;
procedure XOrSymbolProc;
procedure UnknownProc;
protected
function GetSampleSource: UnicodeString; override;
function GetExtTokenID: TxtkTokenKind;
function IsFilterStored: Boolean; override;
public
class function GetLanguageName: string; override;
class function GetFriendlyLanguageName: UnicodeString; override;
public
constructor Create(AOwner: TComponent); override;
function GetDefaultAttribute(Index: Integer): TSynHighlighterAttributes;
override;
function GetEol: Boolean; override;
function GetRange: Pointer; override;
function GetTokenID: TtkTokenKind;
function GetTokenAttribute: TSynHighlighterAttributes; override;
function GetTokenKind: Integer; override;
function IsIdentChar(AChar: WideChar): Boolean; override;
procedure Next; override;
procedure SetRange(Value: Pointer); override;
procedure ResetRange; override;
property ExtTokenID: TxtkTokenKind read GetExtTokenID;
published
property CommentAttri: TSynHighlighterAttributes read FCommentAttri
write FCommentAttri;
property DocumentAttri: TSynHighlighterAttributes read FDocumentAttri
write FDocumentAttri;
property IdentifierAttri: TSynHighlighterAttributes read FIdentifierAttri
write FIdentifierAttri;
property InvalidAttri: TSynHighlighterAttributes read FInvalidAttri
write FInvalidAttri;
property KeyAttri: TSynHighlighterAttributes read FKeyAttri write FKeyAttri;
property NumberAttri: TSynHighlighterAttributes read FNumberAttri
write FNumberAttri;
property SpaceAttri: TSynHighlighterAttributes read FSpaceAttri
write FSpaceAttri;
property StringAttri: TSynHighlighterAttributes read FStringAttri
write FStringAttri;
property SymbolAttri: TSynHighlighterAttributes read FSymbolAttri
write FSymbolAttri;
end;
implementation
uses
SynEditStrConst;
const
KeyWords: array[0..51] of UnicodeString = (
'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char',
'class', 'const', 'continue', 'default', 'do', 'double', 'else', 'extends',
'false', 'final', 'finally', 'float', 'for', 'goto', 'if', 'implements',
'import', 'instanceof', 'int', 'interface', 'long', 'native', 'new', 'null',
'package', 'private', 'protected', 'public', 'return', 'short', 'static',
'strictfp', 'super', 'switch', 'synchronized', 'this', 'throw', 'throws',
'transient', 'true', 'try', 'void', 'volatile', 'while'
);
KeyIndices: array[0..112] of Integer = (
1, -1, -1, 45, -1, -1, 39, -1, -1, -1, 9, 36, 26, -1, -1, 4, 27, 5, 50, 25,
33, -1, 18, -1, 17, 6, 28, -1, -1, -1, 51, -1, -1, -1, -1, 21, 48, -1, 7, 3,
-1, -1, -1, 49, 41, -1, 35, -1, 46, 40, -1, -1, -1, 42, -1, -1, -1, -1, -1,
-1, 43, -1, -1, -1, -1, -1, 13, 24, -1, 37, -1, -1, 31, 11, -1, 22, -1, -1,
-1, 44, -1, 10, 19, 8, -1, -1, 38, 15, -1, -1, 34, -1, 14, -1, -1, -1, 0,
12, -1, 20, -1, 23, -1, 47, -1, -1, 29, 30, -1, -1, 16, 32, 2
);
{$Q-}
function TSynJavaSyn.HashKey(Str: PWideChar): Cardinal;
begin
Result := 0;
while IsIdentChar(Str^) do
begin
Result := Result * 598 + Ord(Str^) * 349;
Inc(Str);
end;
Result := Result mod 113;
FStringLen := Str - FToIdent;
end;
{$Q+}
function TSynJavaSyn.IdentKind(MayBe: PWideChar): TtkTokenKind;
var
Key: Cardinal;
begin
FToIdent := MayBe;
Key := HashKey(MayBe);
if Key <= High(FIdentFuncTable) then
Result := FIdentFuncTable[Key](KeyIndices[Key])
else
Result := tkIdentifier;
end;
procedure TSynJavaSyn.InitIdent;
var
i: Integer;
begin
for i := Low(FIdentFuncTable) to High(FIdentFuncTable) do
if KeyIndices[i] = -1 then
FIdentFuncTable[i] := AltFunc;
for i := Low(FIdentFuncTable) to High(FIdentFuncTable) do
if @FIdentFuncTable[i] = nil then
FIdentFuncTable[i] := KeyWordFunc;
end;
function TSynJavaSyn.AltFunc(Index: Integer): TtkTokenKind;
begin
Result := tkIdentifier;
end;
function TSynJavaSyn.KeyWordFunc(Index: Integer): TtkTokenKind;
begin
if IsCurrentToken(KeyWords[Index]) then
Result := tkKey
else
Result := tkIdentifier
end;
constructor TSynJavaSyn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCaseSensitive := True;
FCommentAttri := TSynHighlighterAttributes.Create(SYNS_AttrComment, SYNS_FriendlyAttrComment);
FCommentAttri.Style := [fsItalic];
AddAttribute(FCommentAttri);
FDocumentAttri := TSynHighlighterAttributes.Create(SYNS_AttrDocumentation, SYNS_FriendlyAttrDocumentation);
FDocumentAttri.Style := [fsItalic];
AddAttribute(FDocumentAttri);
FIdentifierAttri := TSynHighlighterAttributes.Create(SYNS_AttrIdentifier, SYNS_FriendlyAttrIdentifier);
AddAttribute(FIdentifierAttri);
FInvalidAttri := TSynHighlighterAttributes.Create(SYNS_AttrInvalidSymbol, SYNS_FriendlyAttrInvalidSymbol);
AddAttribute(FInvalidAttri);
FKeyAttri := TSynHighlighterAttributes.Create(SYNS_AttrReservedWord, SYNS_FriendlyAttrReservedWord);
FKeyAttri.Style := [fsBold];
AddAttribute(FKeyAttri);
FNumberAttri := TSynHighlighterAttributes.Create(SYNS_AttrNumber, SYNS_FriendlyAttrNumber);
AddAttribute(FNumberAttri);
FSpaceAttri := TSynHighlighterAttributes.Create(SYNS_AttrSpace, SYNS_FriendlyAttrSpace);
AddAttribute(FSpaceAttri);
FStringAttri := TSynHighlighterAttributes.Create(SYNS_AttrString, SYNS_FriendlyAttrString);
AddAttribute(FStringAttri);
FSymbolAttri := TSynHighlighterAttributes.Create(SYNS_AttrSymbol, SYNS_FriendlyAttrSymbol);
AddAttribute(FSymbolAttri);
FRange := rsUnknown;
SetAttributesOnChange(DefHighlightChange);
InitIdent;
FDefaultFilter := SYNS_FilterJava;
end; { Create }
procedure TSynJavaSyn.CommentProc;
begin
if FRange = rsComment then
FTokenID := tkComment
else
FTokenID := tkDocument;
case FLine[Run] of
#0:
begin
NullProc;
Exit;
end;
#10:
begin
LFProc;
Exit;
end;
#13:
begin
CRProc;
Exit;
end;
end;
while not IsLineEnd(Run) do
case FLine[Run] of
'*':
if FLine[Run + 1] = '/' then
begin
Inc(Run, 2);
FRange := rsUnknown;
Break;
end
else Inc(Run);
else Inc(Run);
end;
end;
procedure TSynJavaSyn.AndSymbolProc;
begin
case FLine[Run + 1] of
'=': {and assign}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkAndAssign;
end;
'&': {conditional and}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkCondAnd;
end;
else {and}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkAnd;
end;
end;
end;
procedure TSynJavaSyn.AsciiCharProc;
begin
FTokenID := tkString;
repeat
if IsLineEnd(Run) then Break;
if FLine[Run] = #92 then
Inc(Run); // backslash, if we have an escaped single character, skip to the next
if not IsLineEnd(Run) then Inc(Run); //Add check here to prevent overrun from backslash being last char
until FLine[Run] = #39;
if not IsLineEnd(Run) then Inc(Run);
end;
procedure TSynJavaSyn.AtSymbolProc;
begin
FTokenID := tkInvalid;
Inc(Run);
end;
procedure TSynJavaSyn.BraceCloseProc;
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkBraceClose;
end;
procedure TSynJavaSyn.BraceOpenProc;
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkBraceOpen;
end;
procedure TSynJavaSyn.CRProc;
begin
FTokenID := tkSpace;
case FLine[Run + 1] of
#10: Inc(Run, 2);
else
Inc(Run);
end;
end;
procedure TSynJavaSyn.ColonProc;
begin
Inc(Run); {colon - conditional}
FTokenID := tkSymbol;
FExtTokenID := xtkColon;
end;
procedure TSynJavaSyn.CommaProc;
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkComma;
end;
procedure TSynJavaSyn.EqualProc;
begin
case FLine[Run + 1] of
'=': {logical equal}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkLogEqual;
end;
else {assign}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkAssign;
end;
end;
end;
procedure TSynJavaSyn.GreaterProc;
begin
case FLine[Run + 1] of
'=': {greater than or equal to}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkGreaterThanEqual;
end;
'>':
begin
case FLine[Run + 2] of
'=': {shift right assign}
begin
Inc(Run, 3);
FExtTokenID := xtkShiftRightAssign;
end;
'>':
if FLine[Run + 3] = '=' then
begin
Inc(Run, 4); {unsigned shift right assign}
FExtTokenID := xtkUnsignShiftRightAssign;
end
else
begin
Inc(Run, 3); {unsigned shift right}
FExtTokenID := xtkUnsignShiftRight;
end;
else {shift right}
begin
Inc(Run, 2);
FExtTokenID := xtkShiftRight;
end;
end;
FTokenID := tkSymbol;
end;
else {greater than}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkGreaterThan;
end;
end;
end;
procedure TSynJavaSyn.IdentProc;
begin
FTokenID := IdentKind((FLine + Run));
Inc(Run, FStringLen);
while IsIdentChar(FLine[Run]) do Inc(Run);
end;
procedure TSynJavaSyn.LFProc;
begin
FTokenID := tkSpace;
Inc(Run);
end;
procedure TSynJavaSyn.LowerProc;
begin
case FLine[Run + 1] of
'=': {less than or equal to}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkLessThanEqual;
end;
'<':
begin
if FLine[Run + 2] = '=' then {shift left assign}
begin
Inc(Run, 3);
FExtTokenID := xtkShiftLeftAssign;
end
else {shift left}
begin
Inc(Run, 2);
FExtTokenID := xtkShiftLeft;
end;
FTokenID := tkSymbol;
end;
else {less than}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkLessThan;
end;
end;
end;
procedure TSynJavaSyn.MinusProc;
begin
case FLine[Run + 1] of
'=': {subtract assign}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkSubtractAssign;
end;
'-': {decrement}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkDecrement;
end;
else {subtract}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkSubtract;
end;
end;
end;
procedure TSynJavaSyn.MultiplyProc;
begin
case FLine[Run + 1] of
'=': {multiply assign}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkMultiplyAssign;
end;
else {multiply}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkMultiply;
end;
end;
end;
procedure TSynJavaSyn.NotSymbolProc;
begin
case FLine[Run + 1] of
'=': {not equal}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkNotEqual;
end;
else {logical complement}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkLogComplement;
end;
end;
end;
procedure TSynJavaSyn.NullProc;
begin
FTokenID := tkNull;
Inc(Run);
end;
procedure TSynJavaSyn.NumberProc;
function IsNumberChar: Boolean;
begin
case FLine[Run] of
'0'..'9', '.', '-', 'l', 'L', 'x', 'X', 'A'..'F', 'a'..'f':
Result := True;
else
Result := False;
end;
end;
begin
Inc(Run);
FTokenID := tkNumber;
while IsNumberChar do
begin
case FLine[Run] of
'.':
if FLine[Run + 1] = '.' then Break;
end;
Inc(Run);
end;
end;
procedure TSynJavaSyn.OrSymbolProc;
begin
case FLine[Run + 1] of
'=': {inclusive or assign}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkIncOrAssign;
end;
'|': {conditional or}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkCondOr;
end;
else {inclusive or}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkIncOr;
end;
end;
end;
procedure TSynJavaSyn.PlusProc;
begin
case FLine[Run + 1] of
'=': {add assign}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkAddAssign;
end;
'+': {increment}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkIncrement;
end;
else {add}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkAdd;
end;
end;
end;
procedure TSynJavaSyn.PointProc;
begin
Inc(Run); {point}
if CharInSet(FLine[Run], ['0'..'9']) then
begin
NumberProc;
Exit;
end;
FTokenID := tkSymbol;
FExtTokenID := xtkPoint;
end;
procedure TSynJavaSyn.PoundProc;
begin
Inc(Run);
FTokenID := tkInvalid;
end;
procedure TSynJavaSyn.QuestionProc;
begin
FTokenID := tkSymbol; {question mark - conditional}
FExtTokenID := xtkQuestion;
Inc(Run);
end;
procedure TSynJavaSyn.RemainderSymbolProc;
begin
case FLine[Run + 1] of
'=': {remainder assign}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkRemainderAssign;
end;
else {remainder}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkRemainder;
end;
end;
end;
procedure TSynJavaSyn.RoundCloseProc;
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkRoundClose;
Dec(FRoundCount);
end;
procedure TSynJavaSyn.RoundOpenProc;
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkRoundOpen;
Inc(FRoundCount);
end;
procedure TSynJavaSyn.SemiColonProc;
begin
Inc(Run); {semicolon}
FTokenID := tkSymbol;
FExtTokenID := xtkSemiColon;
end;
procedure TSynJavaSyn.SlashProc;
begin
case FLine[Run + 1] of
'/': {c++ style comments}
begin
Inc(Run, 2);
FTokenID := tkComment;
while not IsLineEnd(Run) do
begin
Inc(Run);
end;
end;
'*':
begin
if (FLine[Run+2] = '*') and (FLine[Run+3] <> '/')then {documentation comment}
begin
FRange := rsDocument;
FTokenID := tkDocument;
Inc(Run);
end
else {c style comment}
begin
FRange := rsComment;
FTokenID := tkComment;
end;
Inc(Run, 2);
while not IsLineEnd(Run) do
case FLine[Run] of
'*':
if FLine[Run + 1] = '/' then
begin
Inc(Run, 2);
FRange := rsUnknown;
Break;
end else Inc(Run);
else
Inc(Run);
end;
end;
'=': {division assign}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkDivideAssign;
end;
else {division}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkDivide;
end;
end;
end;
procedure TSynJavaSyn.SpaceProc;
begin
Inc(Run);
FTokenID := tkSpace;
while (FLine[Run] <= #32) and not IsLineEnd(Run) do Inc(Run);
end;
procedure TSynJavaSyn.SquareCloseProc;
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkSquareClose;
Dec(FSquareCount);
end;
procedure TSynJavaSyn.SquareOpenProc;
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkSquareOpen;
Inc(FSquareCount);
end;
procedure TSynJavaSyn.StringProc;
begin
FTokenID := tkString;
if (FLine[Run + 1] = #34) and (FLine[Run + 2] = #34) then Inc(Run, 2);
repeat
if IsLineEnd(Run) then Break;
case FLine[Run] of
#92: Inc(Run); // Backslash, if we have an escaped charcter it can be skipped
end;
if not IsLineEnd(Run) then Inc(Run); //Add check here to prevent overrun from backslash being last char
until FLine[Run] = #34;
if not IsLineEnd(Run) then Inc(Run);
end;
procedure TSynJavaSyn.TildeProc;
begin
Inc(Run); {bitwise complement}
FTokenID := tkSymbol;
FExtTokenID := xtkBitComplement;
end;
procedure TSynJavaSyn.XOrSymbolProc;
begin
case FLine[Run + 1] of
'=': {xor assign}
begin
Inc(Run, 2);
FTokenID := tkSymbol;
FExtTokenID := xtkXorAssign;
end;
else {xor}
begin
Inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkXor;
end;
end;
end;
procedure TSynJavaSyn.UnknownProc;
begin
Inc(Run);
FTokenID := tkUnknown;
end;
procedure TSynJavaSyn.Next;
begin
FTokenPos := Run;
case FRange of
rsComment: CommentProc;
rsDocument: CommentProc;
else
begin
FRange := rsUnknown;
case FLine[Run] of
'&': AndSymbolProc;
#39: AsciiCharProc;
'@': AtSymbolProc;
'}': BraceCloseProc;
'{': BraceOpenProc;
#13: CRProc;
':': ColonProc;
',': CommaProc;
'=': EqualProc;
'>': GreaterProc;
'A'..'Z', 'a'..'z', '_', '$',
WideChar(#$00C0)..WideChar(#$00D6),
WideChar(#$00D8)..WideChar(#$00F6),
WideChar(#$00F8)..WideChar(#$00FF): IdentProc;
#10: LFProc;
'<': LowerProc;
'-': MinusProc;
'*': MultiplyProc;
'!': NotSymbolProc;
#0: NullProc;
'0'..'9': NumberProc;
'|': OrSymbolProc;
'+': PlusProc;
'.': PointProc;
'#': PoundProc;
'?': QuestionProc;
'%': RemainderSymbolProc;
')': RoundCloseProc;
'(': RoundOpenProc;
';': SemiColonProc;
'/': SlashProc;
#1..#9, #11, #12, #14..#32: SpaceProc;
']': SquareCloseProc;
'[': SquareOpenProc;
#34: StringProc;
'~': TildeProc;
'^': XOrSymbolProc;
else UnknownProc;
end;
end;
end;
inherited;
end;
function TSynJavaSyn.GetDefaultAttribute(Index: Integer): TSynHighlighterAttributes;
begin
case Index of
SYN_ATTR_COMMENT: Result := FCommentAttri;
SYN_ATTR_IDENTIFIER: Result := FIdentifierAttri;
SYN_ATTR_KEYWORD: Result := FKeyAttri;
SYN_ATTR_STRING: Result := FStringAttri;
SYN_ATTR_WHITESPACE: Result := FSpaceAttri;
SYN_ATTR_SYMBOL: Result := FSymbolAttri;
else Result := nil;
end;
end;
function TSynJavaSyn.GetEol: Boolean;
begin
Result := Run = FLineLen + 1;
end;
function TSynJavaSyn.GetRange: Pointer;
begin
Result := Pointer(FRange);
end;
procedure TSynJavaSyn.ResetRange;
begin
FRange := rsUnknown;
end;
procedure TSynJavaSyn.SetRange(Value: Pointer);
begin
FRange := TRangeState(Value);
end;
function TSynJavaSyn.GetTokenID: TtkTokenKind;
begin
Result := FTokenID;
end;
function TSynJavaSyn.GetExtTokenID: TxtkTokenKind;
begin
Result := FExtTokenID;
end;
function TSynJavaSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
case FTokenID of
tkComment: Result := FCommentAttri;
tkDocument: Result := FDocumentAttri;
tkIdentifier: Result := FIdentifierAttri;
tkInvalid: Result := FInvalidAttri;
tkKey: Result := FKeyAttri;
tkNumber: Result := FNumberAttri;
tkSpace: Result := FSpaceAttri;
tkString: Result := FStringAttri;
tkSymbol: Result := FSymbolAttri;
tkUnknown: Result := FInvalidAttri;
else Result := nil;
end;
end;
function TSynJavaSyn.GetTokenKind: Integer;
begin
Result := Ord(FTokenID);
end;
function TSynJavaSyn.IsFilterStored: Boolean;
begin
Result := FDefaultFilter <> SYNS_FilterJava;
end;
function TSynJavaSyn.IsIdentChar(AChar: WideChar): Boolean;
begin
case AChar of
'_', '$', '0'..'9', 'a'..'z', 'A'..'Z', WideChar(#$00C0)..WideChar(#$00D6),
WideChar(#$00D8)..WideChar(#$00F6), WideChar(#$00F8)..WideChar(#$00FF):
Result := True;
else
Result := False;
end;
end;
class function TSynJavaSyn.GetLanguageName: string;
begin
Result := SYNS_LangJava;
end;
function TSynJavaSyn.GetSampleSource: UnicodeString;
begin
Result :=
'/* Java syntax highlighting */'#13#10 +
'import java.util.*;'#13#10 +
#13#10 +
'/** Example class */'#13#10 +
'public class Sample {'#13#10 +
' public static void main(String[] args) {'#13#10 +
' int i = 0;'#13#10 +
' for(i = 0; i < 10; i++)'#13#10 +
' System.out.println("Hello world");'#13#10 +
' }'#13#10 +
'}';
end;
class function TSynJavaSyn.GetFriendlyLanguageName: UnicodeString;
begin
Result := SYNS_FriendlyLangJava;
end;
initialization
{$IFNDEF SYN_CPPB_1}
RegisterPlaceableHighlighter(TSynJavaSyn);
{$ENDIF}
end.