Browse Source

webidl: ifndef

mattias 3 years ago
parent
commit
6d9578a38f

+ 2 - 2
packages/webidl/src/webidlparser.pp

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

+ 35 - 1
packages/webidl/src/webidlscanner.pp

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

+ 21 - 10
packages/webidl/tests/tcidlparser.pp

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