fcl-passrc: implemented $if

git-svn-id: trunk@36140 -
This commit is contained in:
Mattias Gaertner 2017-05-06 20:11:26 +00:00
parent 6ed045a911
commit 04807d1ac4
3 changed files with 1078 additions and 22 deletions

View File

@ -137,8 +137,9 @@ Works:
- dotted unitnames
ToDo:
- $IFOpt
$IF option()
- @@
- fix slow lookup declaration proc in PParser
- fail to write a loop var inside the loop
- warn: create class with abstract methods
- classes - TPasClassType

File diff suppressed because it is too large Load Diff

View File

@ -224,6 +224,20 @@ type
procedure TestMacro2;
procedure TestMacro3;
procedure TestMacroHandling;
procedure TestIFDefined;
procedure TestIFUnDefined;
procedure TestIFAnd;
procedure TestIFAndShortEval;
procedure TestIFOr;
procedure TestIFOrShortEval;
procedure TestIFXor;
procedure TestIFAndOr;
procedure TestIFEqual;
procedure TestIFNotEqual;
procedure TestIFGreaterThan;
procedure TestIFGreaterEqualThan;
procedure TestIFLesserThan;
procedure TestIFLesserEqualThan;
Procedure TestModeSwitch;
end;
@ -1511,24 +1525,21 @@ procedure TTestScanner.TestMacro1;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
FScanner.MacrosOn:=true;
TestTokens([tkbegin,tkend,tkDot],'{$DEFINE MM:=begin end.}'#13#10'MM',True,False);
TestTokens([tkbegin,tkend,tkDot],'{$MACRO on}{$DEFINE MM:=begin end.}'#13#10'MM',True,False);
end;
procedure TTestScanner.TestMacro2;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
FScanner.MacrosOn:=true;
TestTokens([tkbegin,tkend,tkDot],'{$DEFINE MM:=begin end}'#13#10'MM .',True,False);
TestTokens([tkbegin,tkend,tkDot],'{$MACRO on}{$DEFINE MM:=begin end}'#13#10'MM .',True,False);
end;
procedure TTestScanner.TestMacro3;
begin
FScanner.SkipComments:=True;
FScanner.SkipWhiteSpace:=True;
FScanner.MacrosOn:=true;
TestTokens([tkof],'{$DEFINE MM:=begin end}'#13#10'{$IFDEF MM} of {$ELSE} in {$ENDIF}');
TestTokens([tkof],'{$MACRO on}{$DEFINE MM:=begin end}'#13#10'{$IFDEF MM} of {$ELSE} in {$ENDIF}');
end;
procedure TTestScanner.TestMacroHandling;
@ -1536,11 +1547,135 @@ begin
TTestingPascalScanner(FScanner).DoSpecial:=True;
FScanner.SkipComments:=True;
FScanner.SkipWhiteSpace:=True;
FScanner.MacrosOn:=true;
TestTokens([tkIdentifier],'{$DEFINE MM:=begin end}'#13#10'MM');
TestTokens([tkIdentifier],'{$MACRO on}{$DEFINE MM:=begin end}'#13#10'MM');
AssertEQuals('Correct identifier', 'somethingweird',LastIdentifier);
end;
procedure TTestScanner.TestIFDefined;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkbegin,tkend,tkDot],'{$DEFINE A}{$IF defined(A)}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFUnDefined;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkbegin,tkend,tkDot],'{$IF undefined(A)}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFAnd;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkbegin,tkend,tkDot],
'{$DEFINE A}{$IF defined(A) and undefined(B)}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFAndShortEval;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkbegin,tkend,tkDot],
'{$UNDEFINE A}{$IF defined(A) and undefined(B)}wrong{$ELSE}begin{$ENDIF}end.',
True,False);
end;
procedure TTestScanner.TestIFOr;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkbegin,tkend,tkDot],
'{$DEFINE B}{$IF defined(A) or defined(B)}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFOrShortEval;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkbegin,tkend,tkDot],
'{$DEFINE A}{$IF defined(A) or defined(B)}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFXor;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkbegin,tkend,tkDot],
'{$DEFINE B}{$IF defined(A) xor defined(B)}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFAndOr;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
TestTokens([tkbegin,tkend,tkDot],
'{$IF defined(A) and defined(B) or defined(C)}wrong1{$ENDIF}'+LineEnding
+'{$IF defined(A) and defined(B) or undefined(C)}{$ELSE}wrong2{$ENDIF}'+LineEnding
+'{$IF defined(A) and undefined(B) or defined(C)}wrong3{$ENDIF}'+LineEnding
+'{$IF defined(A) and undefined(B) or undefined(C)}{$ELSE}wrong4{$ENDIF}'+LineEnding
+'{$IF undefined(A) and defined(B) or defined(C)}wrong5{$ENDIF}'+LineEnding
+'{$IF undefined(A) and defined(B) or undefined(C)}{$ELSE}wrong6{$ENDIF}'+LineEnding
+'{$IF undefined(A) and undefined(B) or defined(C)}{$ELSE}wrong7{$ENDIF}'+LineEnding
+'{$IF undefined(A) and undefined(B) or undefined(C)}begin{$ENDIF}end.',
True,False);
end;
procedure TTestScanner.TestIFEqual;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
FScanner.AddMacro('Version','30101');
TestTokens([tkbegin,tkend,tkDot],
'{$IF Version=30101}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFNotEqual;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
FScanner.AddMacro('Version','30101');
TestTokens([tkbegin,tkend,tkDot],
'{$IF Version<>30000}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFGreaterThan;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
FScanner.AddMacro('Version','30101');
TestTokens([tkbegin,tkend,tkDot],
'{$IF Version>30000}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFGreaterEqualThan;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
FScanner.AddMacro('Version','30101');
TestTokens([tkbegin,tkend,tkDot],
'{$IF Version>=30000}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFLesserThan;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
FScanner.AddMacro('Version','30101');
TestTokens([tkbegin,tkend,tkDot],
'{$IF Version<40000}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestIFLesserEqualThan;
begin
FScanner.SkipWhiteSpace:=True;
FScanner.SkipComments:=True;
FScanner.AddMacro('Version','30101');
TestTokens([tkbegin,tkend,tkDot],
'{$IF Version<=30101}begin{$ENDIF}end.',True,False);
end;
procedure TTestScanner.TestModeSwitch;
Const