Keywords as basic scalar type
This commit is contained in:
@@ -114,6 +114,7 @@ end;
|
||||
procedure TJsonAstConverter.DataValueToJson(const AValue: TDataValue; const AParent: TJSONObject; const AName: string);
|
||||
var
|
||||
valObj, scalarObj: TJSONObject;
|
||||
kwName: string;
|
||||
begin
|
||||
valObj := TJSONObject.Create;
|
||||
valObj.AddPair('Kind', TJSONString.Create(AValue.Kind.ToString));
|
||||
@@ -126,11 +127,16 @@ begin
|
||||
case AValue.AsScalar.Kind of
|
||||
TScalar.TKind.Ordinal: scalarObj.AddPair('Value', TJSONNumber.Create(AValue.AsScalar.Value.AsInt64));
|
||||
TScalar.TKind.Float: scalarObj.AddPair('Value', TJSONNumber.Create(AValue.AsScalar.Value.AsDouble));
|
||||
TScalar.TKind.Keyword:
|
||||
begin
|
||||
// Use reverse map to get name from index (AsInt64)
|
||||
kwName := TKeywordRegistry.GetName(AValue.AsScalar.Value.AsInt64);
|
||||
scalarObj.AddPair('Value', TJSONString.Create(kwName));
|
||||
end;
|
||||
end;
|
||||
valObj.AddPair('Value', scalarObj);
|
||||
end;
|
||||
vkText: valObj.AddPair('Value', TJSONString.Create(AValue.AsText));
|
||||
vkKeyword: valObj.AddPair('Value', TJSONString.Create(AValue.AsKeyword.Name));
|
||||
vkVoid:; // No value to add
|
||||
else
|
||||
raise ENotSupportedException.Create('Unsupported TDataValue kind for constant serialization.');
|
||||
@@ -660,16 +666,15 @@ begin
|
||||
case scalarKind of
|
||||
TScalar.TKind.Ordinal: Result := TScalar.FromInt64(scalarObj.GetValue<TJSONNumber>('Value').AsInt64);
|
||||
TScalar.TKind.Float: Result := TScalar.FromDouble(scalarObj.GetValue<TJSONNumber>('Value').AsDouble);
|
||||
TScalar.TKind.Keyword:
|
||||
// Keywords are serialized by name, intern them back
|
||||
Result := TScalar.FromKeyword(TKeywordRegistry.Intern(scalarObj.GetValue<string>('Value')));
|
||||
end;
|
||||
end
|
||||
else if SameText(kindStr, 'Text') then
|
||||
begin
|
||||
Result := valObj.GetValue<string>('Value');
|
||||
end
|
||||
else if SameText(kindStr, 'Keyword') then
|
||||
begin
|
||||
Result := TDataValue.FromKeyword(TKeywordRegistry.Intern(valObj.GetValue<string>('Value')));
|
||||
end
|
||||
else if SameText(kindStr, 'Void') then
|
||||
begin
|
||||
Result := TDataValue.Void;
|
||||
|
||||
Reference in New Issue
Block a user