Browse Source

* Add sequence types (FrozenArray,ObservableArray)

Michaël Van Canneyt 1 year ago
parent
commit
323adefec5

+ 14 - 4
packages/webidl/src/webidldefs.pp

@@ -482,16 +482,18 @@ type
   end;
   end;
 
 
   { TIDLSequenceTypeDefDefinition }
   { TIDLSequenceTypeDefDefinition }
-
+  TSequenceType = (stSequence,stFrozenArray,stObservableArray);
   TIDLSequenceTypeDefDefinition = Class(TIDLTypeDefDefinition)
   TIDLSequenceTypeDefDefinition = Class(TIDLTypeDefDefinition)
   private
   private
     FElementType: TIDLTypeDefDefinition;
     FElementType: TIDLTypeDefDefinition;
+    FSequenceType: TSequenceType;
     procedure SetElementType(AValue: TIDLTypeDefDefinition);
     procedure SetElementType(AValue: TIDLTypeDefDefinition);
   Public
   Public
     Function AsString(Full: Boolean): UTF8String; override;
     Function AsString(Full: Boolean): UTF8String; override;
     Function Clone (aParent : TIDLDefinition) : TIDLTypeDefDefinition; override;
     Function Clone (aParent : TIDLDefinition) : TIDLTypeDefDefinition; override;
     Destructor Destroy; override;
     Destructor Destroy; override;
     property ElementType : TIDLTypeDefDefinition Read FElementType Write SetElementType;
     property ElementType : TIDLTypeDefDefinition Read FElementType Write SetElementType;
+    Property SequenceType : TSequenceType Read FSequenceType Write FSequenceType;
   end;
   end;
 
 
   { TIDLSetlikeDefinition }
   { TIDLSetlikeDefinition }
@@ -1020,11 +1022,19 @@ begin
 end;
 end;
 
 
 function TIDLSequenceTypeDefDefinition.AsString(Full: Boolean): UTF8String;
 function TIDLSequenceTypeDefDefinition.AsString(Full: Boolean): UTF8String;
+
+var
+  TT : String;
+
 begin
 begin
+  Case SequenceType of
+    stSequence : TT:='sequence';
+    stFrozenArray : TT:='FrozenArray';
+    stObservableArray : TT:='ObservableArray';
+  end;
+  Result:=TT+' <'+ElementType.TypeName+'>';
   if Full then
   if Full then
-    Result:='typedef sequence <'+ElementType.TypeName+'> '+Name
-  else
-    Result:='sequence <'+ElementType.TypeName+'>';
+    Result:='typedef '+Result+' '+Name;
   if full and HasAttributes then
   if full and HasAttributes then
     Result:=Attributes.AsString(True)+' '+Result;
     Result:=Attributes.AsString(True)+' '+Result;
 end;
 end;

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

@@ -135,6 +135,7 @@ Type
     Constructor Create(aContext : TWEBIDLContext; aSource : UTF8String);overload;
     Constructor Create(aContext : TWEBIDLContext; aSource : UTF8String);overload;
     Destructor Destroy; override;
     Destructor Destroy; override;
     Procedure Parse;
     Procedure Parse;
+    class function TokenTypeToSequenceType(aToken : TIDLToken) : TSequenceType;
     Property Scanner : TWebIDLScanner Read FScanner;
     Property Scanner : TWebIDLScanner Read FScanner;
     Property Context : TWebIDLContext Read FContext;
     Property Context : TWebIDLContext Read FContext;
     Property Version : TWebIDLVersion Read FVersion Write SetVersion;
     Property Version : TWebIDLVersion Read FVersion Write SetVersion;
@@ -1249,7 +1250,7 @@ begin
 end;
 end;
 
 
 function TWebIDLParser.ParseSequenceTypeDef(aParent : TIDLBaseObject): TIDLSequenceTypeDefDefinition;
 function TWebIDLParser.ParseSequenceTypeDef(aParent : TIDLBaseObject): TIDLSequenceTypeDefDefinition;
-(* On Entry we're on sequence. On exit, we're on the > token *)
+(* On Entry we're on sequence|FrozenArray|ObservableArray. On exit, we're on the > token *)
 
 
 var
 var
   ok: Boolean;
   ok: Boolean;
@@ -1257,6 +1258,7 @@ begin
   Result:=TIDLSequenceTypeDefDefinition(AddDefinition(aParent,TIDLSequenceTypeDefDefinition,''));
   Result:=TIDLSequenceTypeDefDefinition(AddDefinition(aParent,TIDLSequenceTypeDefDefinition,''));
   ok:=false;
   ok:=false;
   try
   try
+    Result.SequenceType:=TokenTypeToSequenceType(CurrentToken);
     Result.TypeName:='sequence';
     Result.TypeName:='sequence';
     ExpectToken(tkLess);
     ExpectToken(tkLess);
     Result.ElementType:=ParseType(Result);
     Result.ElementType:=ParseType(Result);
@@ -1342,7 +1344,7 @@ function TWebIDLParser.ParseType(aParent : TIDLBaseObject; FetchFirst : Boolean
 
 
 Const
 Const
   SimplePrefixTokens = [tkUnsigned,tkLong,tkUnrestricted];
   SimplePrefixTokens = [tkUnsigned,tkLong,tkUnrestricted];
-  ComplexPrefixTokens = [tkSequence,tkPromise,tkBracketOpen,tkRecord,tkFrozenArray];
+  ComplexPrefixTokens = [tkSequence,tkPromise,tkBracketOpen,tkRecord,tkFrozenArray,tkObservableArray];
   PrefixTokens  = ComplexPrefixTokens+SimplePrefixTokens;
   PrefixTokens  = ComplexPrefixTokens+SimplePrefixTokens;
   PrimitiveTokens = [tkBoolean,tkByte,tkOctet,tkFloat,tkDouble,tkShort,tkAny,tkObject];
   PrimitiveTokens = [tkBoolean,tkByte,tkOctet,tkFloat,tkDouble,tkShort,tkAny,tkObject];
   IdentifierTokens = [tkIdentifier,tkByteString,tkUSVString,tkDOMString];
   IdentifierTokens = [tkIdentifier,tkByteString,tkUSVString,tkDOMString];
@@ -1426,6 +1428,7 @@ begin
       Case tk of
       Case tk of
         tkRecord : Result:=ParseRecordTypeDef(aParent);
         tkRecord : Result:=ParseRecordTypeDef(aParent);
         tkFrozenArray,
         tkFrozenArray,
+        tkObservableArray,
         tkSequence : Result:=ParseSequenceTypeDef(aParent);
         tkSequence : Result:=ParseSequenceTypeDef(aParent);
         tkPromise : Result:=ParsePromiseTypeDef(aParent);
         tkPromise : Result:=ParsePromiseTypeDef(aParent);
         tkBracketOpen : Result:=ParseUnionTypeDef(aParent);
         tkBracketOpen : Result:=ParseUnionTypeDef(aParent);
@@ -1562,6 +1565,15 @@ begin
   ParseDefinitions(Context.Definitions);
   ParseDefinitions(Context.Definitions);
 end;
 end;
 
 
+class function TWebIDLParser.TokenTypeToSequenceType(aToken: TIDLToken): TSequenceType;
+begin
+  case aToken of
+   tkObservableArray : Result:=stObservableArray;
+   tkFrozenArray : Result:=stFrozenArray;
+   tkSequence : Result:=stSequence;
+  end;
+end;
+
 { TWebIDLContext }
 { TWebIDLContext }
 
 
 constructor TWebIDLContext.Create(OwnsDefinitions : Boolean = True);
 constructor TWebIDLContext.Create(OwnsDefinitions : Boolean = True);

+ 6 - 4
packages/webidl/src/webidlscanner.pp

@@ -133,13 +133,14 @@ type
     tkRecord,
     tkRecord,
     tkSetLike,
     tkSetLike,
     tkOther,
     tkOther,
-    tkConstructor
+    tkConstructor,
+    tkObservableArray
     );
     );
   TIDLTokens = Set of TIDLToken;
   TIDLTokens = Set of TIDLToken;
   EWebIDLScanner = class(EParserError);
   EWebIDLScanner = class(EParserError);
 
 
 Const
 Const
-  V2Tokens = [tkMixin,tkIncludes,tkMapLike,tkRecord,tkSetLike,tkFrozenArray,tkConstructor];
+  V2Tokens = [tkMixin,tkIncludes,tkMapLike,tkRecord,tkSetLike,tkFrozenArray,tkObservableArray,tkConstructor];
   V1Tokens = [tkImplements];
   V1Tokens = [tkImplements];
   VersionNonTokens : Array[TWebIDLVersion] of TIDLTokens = (V2Tokens,V1Tokens);
   VersionNonTokens : Array[TWebIDLVersion] of TIDLTokens = (V2Tokens,V1Tokens);
 
 
@@ -400,7 +401,8 @@ const
   'record',
   'record',
   'setlike',
   'setlike',
   'other',
   'other',
-  'constructor'
+  'constructor',
+  'ObservableArray'
   );
   );
 
 
 Function GetTokenName(aToken : TIDLToken) : String;
 Function GetTokenName(aToken : TIDLToken) : String;
@@ -1462,7 +1464,7 @@ end;
 function TWebIDLScanner.DetermineToken2 : TIDLToken;
 function TWebIDLScanner.DetermineToken2 : TIDLToken;
 
 
 Const
 Const
-  InfTokens = [tkNan,tkInfinity,tkNegInfinity,tkByteString,tkUSVString,tkDOMString,tkPromise,tkFrozenArray];
+  InfTokens = [tkNan,tkInfinity,tkNegInfinity,tkByteString,tkUSVString,tkDOMString,tkPromise,tkFrozenArray,tkObservableArray];
 
 
 begin
 begin
   For Result in InfTokens do
   For Result in InfTokens do

+ 18 - 6
packages/webidl/tests/tcidlparser.pp

@@ -55,7 +55,7 @@ Type
   TTestTypeDefParser = Class(TTestParser)
   TTestTypeDefParser = Class(TTestParser)
   private
   private
     function DoTestPromise(aDef: UTF8String; AReturnType: String=''): TIDLPromiseTypeDefDefinition;
     function DoTestPromise(aDef: UTF8String; AReturnType: String=''): TIDLPromiseTypeDefDefinition;
-    function DoTestSequence(aDef: UTF8String): TIDLSequenceTypeDefDefinition;
+    function DoTestSequence(aDef: UTF8String; aType : TSequenceType): TIDLSequenceTypeDefDefinition;
     function DoTestRecord(aDef: UTF8String; const aKeyTypeName,
     function DoTestRecord(aDef: UTF8String; const aKeyTypeName,
       aValueTypeName: String): TIDLRecordDefinition;
       aValueTypeName: String): TIDLRecordDefinition;
     function DoTestUnion(aDef: String): TIDLUnionTypeDefDefinition;
     function DoTestUnion(aDef: String): TIDLUnionTypeDefDefinition;
@@ -96,6 +96,8 @@ Type
     Procedure TestUnion;
     Procedure TestUnion;
     Procedure TestUnionNull;
     Procedure TestUnionNull;
     Procedure TestSequence;
     Procedure TestSequence;
+    Procedure TestFrozenArray;
+    Procedure TestObservableArray;
     Procedure TestSequenceNull;
     Procedure TestSequenceNull;
     Procedure TestPromise;
     Procedure TestPromise;
     Procedure TestPromiseVoid;
     Procedure TestPromiseVoid;
@@ -425,7 +427,7 @@ end;
 
 
 procedure TTestIncludesParser.ParseIncludesSimple;
 procedure TTestIncludesParser.ParseIncludesSimple;
 begin
 begin
-
+  AssertNotNull(ParseIncludes('Window','TouchEventHandlers'));
 end;
 end;
 
 
 { TTestOperationInterfaceParser }
 { TTestOperationInterfaceParser }
@@ -1248,8 +1250,7 @@ begin
   AssertTrue('Is null',DoTestUnion('(byte or octet) ? A').AllowNull);
   AssertTrue('Is null',DoTestUnion('(byte or octet) ? A').AllowNull);
 end;
 end;
 
 
-function TTestTypeDefParser.DoTestSequence(aDef: UTF8String
-  ): TIDLSequenceTypeDefDefinition;
+function TTestTypeDefParser.DoTestSequence(aDef: UTF8String; aType: TSequenceType): TIDLSequenceTypeDefDefinition;
 
 
 Var
 Var
   D : TIDLTypeDefDefinition;
   D : TIDLTypeDefDefinition;
@@ -1263,6 +1264,7 @@ begin
   D:=TIDLTypeDefDefinition(S.ElementType);
   D:=TIDLTypeDefDefinition(S.ElementType);
   AssertEquals('1: Correct type name','byte',D.TypeName);
   AssertEquals('1: Correct type name','byte',D.TypeName);
   Result:=S;
   Result:=S;
+  AssertTrue('Correct sequence type',S.SequenceType=aType);
 end;
 end;
 
 
 function TTestTypeDefParser.DoTestRecord(aDef: UTF8String; const aKeyTypeName,
 function TTestTypeDefParser.DoTestRecord(aDef: UTF8String; const aKeyTypeName,
@@ -1289,13 +1291,23 @@ end;
 procedure TTestTypeDefParser.TestSequence;
 procedure TTestTypeDefParser.TestSequence;
 
 
 begin
 begin
-  DoTestSequence('sequence<byte> A');
+  DoTestSequence('sequence<byte> A',stSequence);
+end;
+
+procedure TTestTypeDefParser.TestFrozenArray;
+begin
+  DoTestSequence('FrozenArray<byte> A',stFrozenArray);
+end;
+
+procedure TTestTypeDefParser.TestObservableArray;
+begin
+  DoTestSequence('ObservableArray<byte> A',stObservableArray);
 end;
 end;
 
 
 procedure TTestTypeDefParser.TestSequenceNull;
 procedure TTestTypeDefParser.TestSequenceNull;
 
 
 begin
 begin
-  AssertTrue('Is Null ',DoTestSequence('sequence<byte> ? A').AllowNull);
+  AssertTrue('Is Null ',DoTestSequence('sequence<byte> ? A',stSequence).AllowNull);
 end;
 end;
 
 
 function TTestTypeDefParser.DoTestPromise(aDef: UTF8String; AReturnType : String = ''): TIDLPromiseTypeDefDefinition;
 function TTestTypeDefParser.DoTestPromise(aDef: UTF8String; AReturnType : String = ''): TIDLPromiseTypeDefDefinition;