webidl: ifndef

This commit is contained in:
mattias 2022-06-18 15:49:48 +02:00
parent 6719b7df29
commit 6d9578a38f
3 changed files with 58 additions and 13 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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