* Add sequence types (FrozenArray,ObservableArray)

This commit is contained in:
Michaël Van Canneyt 2024-04-05 09:45:23 +02:00
parent d12d82dab4
commit 323adefec5
4 changed files with 52 additions and 16 deletions

View File

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

View File

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

View File

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

View File

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