mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 10:45:08 +02:00
* Add sequence types (FrozenArray,ObservableArray)
This commit is contained in:
parent
d12d82dab4
commit
323adefec5
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user