mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-13 15:29:13 +02:00
webidl: ifndef
This commit is contained in:
parent
6719b7df29
commit
6d9578a38f
@ -361,7 +361,7 @@ begin
|
||||
Result.HasEllipsis:=True;
|
||||
GetToken;
|
||||
end;
|
||||
CheckCurrentTokens([tkIdentifier,tkOther,tkCallback]);
|
||||
CheckCurrentTokens([tkIdentifier,tkOther,tkCallback,tkInterface]);
|
||||
Result.Name:=CurrentTokenString;
|
||||
ok:=true;
|
||||
finally
|
||||
@ -785,7 +785,7 @@ begin
|
||||
ok:=false;
|
||||
try
|
||||
Result.AttributeType:=ParseType(Result,True,True);
|
||||
CheckCurrentTokens([tkIdentifier,tkRequired,tkInterface]);
|
||||
CheckCurrentTokens([tkIdentifier,tkRequired]);
|
||||
Result.Name:=CurrentTokenString;
|
||||
Result.Options:=Options;
|
||||
ok:=true;
|
||||
|
@ -275,6 +275,7 @@ Type
|
||||
function DoFetchToken: TIDLToken;
|
||||
procedure HandleDirective; virtual;
|
||||
procedure HandleIfDef; virtual;
|
||||
procedure HandleIfNDef; virtual;
|
||||
procedure HandleIf; virtual;
|
||||
procedure HandleElse; virtual;
|
||||
procedure HandleEndIf; virtual;
|
||||
@ -405,6 +406,7 @@ Resourcestring
|
||||
SErrOperandAndOperatorMismatch = 'operand and operator mismatch';
|
||||
SErrDivByZero = 'division by zero';
|
||||
SErrInvalidCharacterX = 'Invalid character ''%s''';
|
||||
SErrUnknownDirectiveX = 'Unknown directive ''%s''';
|
||||
|
||||
Function GetTokenName(aToken : TIDLToken) : String;
|
||||
|
||||
@ -1537,7 +1539,7 @@ begin
|
||||
else
|
||||
Error(SErrInvalidCharacter, [CurRow,CurColumn,TokenStr[0]]);
|
||||
end;
|
||||
until FSkipMode=wisSkipNone;
|
||||
until not FIsSkipping;
|
||||
|
||||
FCurToken := Result;
|
||||
end;
|
||||
@ -1554,9 +1556,12 @@ begin
|
||||
SkipWhitespace;
|
||||
case lowercase(aDirective) of
|
||||
'ifdef': HandleIfDef;
|
||||
'ifndef': HandleIfNDef;
|
||||
'if': HandleIf;
|
||||
'else': HandleElse;
|
||||
'endif': HandleEndIf;
|
||||
else
|
||||
Error(SErrUnknownDirectiveX, [CurRow,CurColumn,aDirective]);
|
||||
end;
|
||||
SkipWhitespace;
|
||||
SkipLineBreak;
|
||||
@ -1591,6 +1596,35 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TWebIDLScanner.HandleIfNDef;
|
||||
var
|
||||
StartP: PChar;
|
||||
aName: string;
|
||||
begin
|
||||
PushSkipMode;
|
||||
if FIsSkipping then
|
||||
FSkipMode := wisSkipAll
|
||||
else
|
||||
begin
|
||||
StartP:=TokenStr;
|
||||
while TokenStr^ in ['a'..'z','A'..'Z','0'..'9','_'] do
|
||||
inc(TokenStr);
|
||||
SetString(aName,StartP,TokenStr-StartP);
|
||||
if not IsDefined(aName) then
|
||||
FSkipMode := wisSkipElseBranch
|
||||
else
|
||||
begin
|
||||
FSkipMode := wisSkipIfBranch;
|
||||
FIsSkipping := true;
|
||||
end;
|
||||
//If LogEvent(sleConditionals) then
|
||||
// if FSkipMode=wisSkipElseBranch then
|
||||
// DoLog(mtInfo,nLogIFDefAccepted,sLogIFDefAccepted,[aName])
|
||||
// else
|
||||
// DoLog(mtInfo,nLogIFDefRejected,sLogIFDefRejected,[aName]);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TWebIDLScanner.HandleIf;
|
||||
var
|
||||
StartP: PChar;
|
||||
|
@ -125,8 +125,9 @@ Type
|
||||
Procedure ParseMixinEmptyInheritance;
|
||||
Procedure ParseCustomAttributes1;
|
||||
|
||||
Procedure ParseIFDEFHeader;
|
||||
Procedure ParseIfDefinedHeader;
|
||||
Procedure ParseIfDefSkip;
|
||||
Procedure ParseIfNDefUse;
|
||||
Procedure ParseIfDefinedSkip;
|
||||
end;
|
||||
|
||||
{ TTestMapLikeInterfaceParser }
|
||||
@ -197,7 +198,6 @@ Type
|
||||
Procedure ParseSimpleReadonlyStringifierAttribute;
|
||||
Procedure ParseComplexReadonlyStaticAttribute;
|
||||
Procedure ParseSimpleAttributeRequired;
|
||||
Procedure ParseSimpleAttributeInterface;
|
||||
Procedure ParseIdentifierAttribute;
|
||||
Procedure Parse2IdentifierAttributes;
|
||||
end;
|
||||
@ -722,11 +722,6 @@ begin
|
||||
ParseAttribute('attribute boolean required','required','boolean',[]);
|
||||
end;
|
||||
|
||||
procedure TTestAttributeInterfaceParser.ParseSimpleAttributeInterface;
|
||||
begin
|
||||
ParseAttribute('attribute boolean interface','interface','boolean',[]);
|
||||
end;
|
||||
|
||||
procedure TTestAttributeInterfaceParser.ParseIdentifierAttribute;
|
||||
begin
|
||||
ParseAttribute('attribute B A','A','B',[]);
|
||||
@ -1421,7 +1416,7 @@ begin
|
||||
AssertEquals('Attributes',CustAttributes,ParseInterface('A','B',[]).Attributes.AsString(True));
|
||||
end;
|
||||
|
||||
procedure TTestInterfaceParser.ParseIFDEFHeader;
|
||||
procedure TTestInterfaceParser.ParseIfDefSkip;
|
||||
var
|
||||
d: TIDLInterfaceDefinition;
|
||||
begin
|
||||
@ -1436,7 +1431,23 @@ begin
|
||||
AssertEquals('Member count',0,d.Members.Count);
|
||||
end;
|
||||
|
||||
procedure TTestInterfaceParser.ParseIfDefinedHeader;
|
||||
procedure TTestInterfaceParser.ParseIfNDefUse;
|
||||
var
|
||||
d: TIDLInterfaceDefinition;
|
||||
begin
|
||||
InitSource('#ifndef Nothing'+sLineBreak
|
||||
+'interface A;'+sLineBreak
|
||||
+'#endif'+sLineBreak
|
||||
);
|
||||
Parser.Parse;
|
||||
AssertEquals('Has one definition',1,Definitions.Count);
|
||||
AssertEquals('Correct class',TIDLInterfaceDefinition,Definitions[0].ClassType);
|
||||
d:=Definitions[0] as TIDLInterfaceDefinition;
|
||||
AssertEquals('Name','A',d.Name);
|
||||
AssertEquals('Member count',0,d.Members.Count);
|
||||
end;
|
||||
|
||||
procedure TTestInterfaceParser.ParseIfDefinedSkip;
|
||||
var
|
||||
d: TIDLInterfaceDefinition;
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user