mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-07 21:50:14 +02:00
pastojs: default(settype|rangetype|currency|string)
git-svn-id: trunk@38886 -
This commit is contained in:
parent
0493219f48
commit
790e1e6007
@ -12978,6 +12978,8 @@ begin
|
||||
Evaluated:=TResEvalString.CreateValue(#0)
|
||||
else if bt=btWideChar then
|
||||
Evaluated:=TResEvalUTF16.CreateValue(#0)
|
||||
else if bt in btAllFloats then
|
||||
Evaluated:=TResEvalFloat.CreateValue(0.0)
|
||||
else
|
||||
begin
|
||||
{$IFDEF VerbosePasResolver}
|
||||
@ -12991,8 +12993,35 @@ begin
|
||||
// e.g. type t = 2..10;
|
||||
Evaluated:=EvalRangeLimit(TPasRangeType(TypeEl).RangeExpr,FLags,true,Param);
|
||||
end
|
||||
else if ParamResolved.BaseType=btSet then
|
||||
begin
|
||||
if ParamResolved.SubType=btContext then
|
||||
begin
|
||||
if ParamResolved.LoTypeEl.ClassType=TPasEnumType then
|
||||
Evaluated:=TResEvalSet.CreateEmpty(revskEnum,TPasEnumType(ParamResolved.LoTypeEl))
|
||||
else
|
||||
begin
|
||||
{$IFDEF VerbosePasResolver}
|
||||
writeln('TPasResolver.BI_Default_OnEval ',GetResolverResultDbg(ParamResolved));
|
||||
{$ENDIF}
|
||||
RaiseNotYetImplemented(20180501125138,Param);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{$IFDEF VerbosePasResolver}
|
||||
writeln('TPasResolver.BI_Default_OnEval ',GetResolverResultDbg(ParamResolved));
|
||||
{$ENDIF}
|
||||
RaiseNotYetImplemented(20180501125014,Param);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{$IFDEF VerbosePasResolver}
|
||||
writeln('TPasResolver.BI_Default_OnEval ',GetResolverResultDbg(ParamResolved));
|
||||
{$ENDIF}
|
||||
RaiseNotYetImplemented(20180501004839,Param);
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TPasResolver.Create;
|
||||
|
@ -9831,6 +9831,7 @@ var
|
||||
TypeEl: TPasType;
|
||||
Value: TResEvalValue;
|
||||
MinVal, MaxVal: MaxPrecInt;
|
||||
C: TClass;
|
||||
begin
|
||||
Result:=nil;
|
||||
if AContext.Resolver=nil then
|
||||
@ -9838,87 +9839,130 @@ begin
|
||||
Param:=El.Params[0];
|
||||
AContext.Resolver.ComputeElement(Param,ResolvedEl,[]);
|
||||
case ResolvedEl.BaseType of
|
||||
btContext:
|
||||
btBoolean,btByteBool,btWordBool,btLongBool:
|
||||
begin
|
||||
Result:=CreateLiteralBoolean(El,LowJSBoolean);
|
||||
exit;
|
||||
end;
|
||||
btChar,
|
||||
btWideChar:
|
||||
begin
|
||||
Result:=CreateLiteralJSString(El,#0);
|
||||
exit;
|
||||
end;
|
||||
btString,btUnicodeString:
|
||||
begin
|
||||
Result:=CreateLiteralJSString(El,'');
|
||||
exit;
|
||||
end;
|
||||
btByte..btInt64:
|
||||
begin
|
||||
TypeEl:=ResolvedEl.LoTypeEl;
|
||||
if TypeEl.ClassType=TPasUnresolvedSymbolRef then
|
||||
begin
|
||||
TypeEl:=ResolvedEl.LoTypeEl;
|
||||
if TypeEl.ClassType=TPasEnumType then
|
||||
if TypeEl.CustomData is TResElDataBaseType then
|
||||
begin
|
||||
CreateEnumValue(TPasEnumType(TypeEl));
|
||||
AContext.Resolver.GetIntegerRange(ResolvedEl.BaseType,MinVal,MaxVal);
|
||||
Result:=CreateLiteralNumber(El,MinVal);
|
||||
exit;
|
||||
end
|
||||
else if (TypeEl.ClassType=TPasSetType) then
|
||||
begin
|
||||
Result:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,El));
|
||||
exit;
|
||||
end
|
||||
else if TypeEl.ClassType=TPasArrayType then
|
||||
begin
|
||||
Result:=CreateArrayInit(TPasArrayType(TypeEl),nil,El,AContext);
|
||||
exit;
|
||||
end
|
||||
else if TypeEl.ClassType=TPasRecordType then
|
||||
begin
|
||||
Result:=CreateRecordInit(TPasRecordType(TypeEl),nil,El,AContext);
|
||||
exit;
|
||||
end
|
||||
else if (TypeEl.ClassType=TPasRangeType) then
|
||||
// a custom range without initial value -> use first value
|
||||
begin
|
||||
Value:=AContext.Resolver.Eval(TPasRangeType(TypeEl).RangeExpr.left,[refConst]);
|
||||
try
|
||||
Result:=ConvertConstValue(Value,AContext,El);
|
||||
finally
|
||||
ReleaseEvalValue(Value);
|
||||
end;
|
||||
end
|
||||
else if TypeEl.ClassType=TPasRangeType then
|
||||
begin
|
||||
Value:=AContext.Resolver.EvalRangeLimit(TPasRangeType(TypeEl).RangeExpr,
|
||||
[refConst],true,El);
|
||||
try
|
||||
case Value.Kind of
|
||||
revkInt:
|
||||
Result:=CreateLiteralNumber(El,TResEvalInt(Value).Int);
|
||||
revkUInt:
|
||||
Result:=CreateLiteralNumber(El,TResEvalUInt(Value).UInt);
|
||||
else
|
||||
RaiseNotSupported(El,AContext,20180501011646);
|
||||
end;
|
||||
exit;
|
||||
finally
|
||||
ReleaseEvalValue(Value);
|
||||
end;
|
||||
btBoolean,btByteBool,btWordBool,btLongBool:
|
||||
end;
|
||||
{$IFDEF VerbosePas2JS}
|
||||
writeln('TPasToJSConverter.ConvertBuiltIn_Default ',GetResolverResultDbg(ResolvedEl));
|
||||
{$ENDIF}
|
||||
RaiseNotSupported(El,AContext,20180501011649);
|
||||
end;
|
||||
btSingle,btDouble:
|
||||
begin
|
||||
Result:=CreateLiteralNumber(El,0);
|
||||
TJSLiteral(Result).Value.CustomValue:='0.0';
|
||||
exit;
|
||||
end;
|
||||
btCurrency:
|
||||
begin
|
||||
Result:=CreateLiteralNumber(El,0);
|
||||
exit;
|
||||
end;
|
||||
btContext:
|
||||
begin
|
||||
TypeEl:=ResolvedEl.LoTypeEl;
|
||||
C:=TypeEl.ClassType;
|
||||
if C=TPasEnumType then
|
||||
begin
|
||||
Result:=CreateLiteralBoolean(El,LowJSBoolean);
|
||||
CreateEnumValue(TPasEnumType(TypeEl));
|
||||
exit;
|
||||
end
|
||||
else if C=TPasSetType then
|
||||
begin
|
||||
Result:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,El));
|
||||
exit;
|
||||
end
|
||||
else if C=TPasArrayType then
|
||||
begin
|
||||
Result:=CreateArrayInit(TPasArrayType(TypeEl),nil,El,AContext);
|
||||
exit;
|
||||
end
|
||||
else if C=TPasRecordType then
|
||||
begin
|
||||
Result:=CreateRecordInit(TPasRecordType(TypeEl),nil,El,AContext);
|
||||
exit;
|
||||
end
|
||||
else if C=TPasRangeType then
|
||||
// a custom range without initial value -> use first value
|
||||
begin
|
||||
Value:=AContext.Resolver.Eval(TPasRangeType(TypeEl).RangeExpr.left,[refConst]);
|
||||
try
|
||||
Result:=ConvertConstValue(Value,AContext,El);
|
||||
finally
|
||||
ReleaseEvalValue(Value);
|
||||
end;
|
||||
end
|
||||
else if (C=TPasClassType) or (C=TPasPointerType) then
|
||||
begin
|
||||
Result:=CreateLiteralNull(El);
|
||||
exit;
|
||||
end;
|
||||
btChar,
|
||||
btWideChar:
|
||||
end;
|
||||
btRange:
|
||||
begin
|
||||
if ResolvedEl.LoTypeEl is TPasRangeType then
|
||||
begin
|
||||
Result:=CreateLiteralJSString(El,#0);
|
||||
Value:=AContext.Resolver.Eval(TPasRangeType(ResolvedEl.LoTypeEl).RangeExpr.left,[refConst]);
|
||||
try
|
||||
Result:=ConvertConstValue(Value,AContext,El);
|
||||
finally
|
||||
ReleaseEvalValue(Value);
|
||||
end;
|
||||
exit;
|
||||
end;
|
||||
btByte..btInt64:
|
||||
begin
|
||||
TypeEl:=ResolvedEl.LoTypeEl;
|
||||
if TypeEl.ClassType=TPasUnresolvedSymbolRef then
|
||||
begin
|
||||
if TypeEl.CustomData is TResElDataBaseType then
|
||||
begin
|
||||
AContext.Resolver.GetIntegerRange(ResolvedEl.BaseType,MinVal,MaxVal);
|
||||
Result:=CreateLiteralNumber(El,MinVal);
|
||||
exit;
|
||||
end;
|
||||
end
|
||||
else if TypeEl.ClassType=TPasRangeType then
|
||||
begin
|
||||
Value:=AContext.Resolver.EvalRangeLimit(TPasRangeType(TypeEl).RangeExpr,
|
||||
[refConst],true,El);
|
||||
try
|
||||
case Value.Kind of
|
||||
revkInt:
|
||||
Result:=CreateLiteralNumber(El,TResEvalInt(Value).Int);
|
||||
revkUInt:
|
||||
Result:=CreateLiteralNumber(El,TResEvalUInt(Value).UInt);
|
||||
else
|
||||
RaiseNotSupported(El,AContext,20180501011646);
|
||||
end;
|
||||
exit;
|
||||
finally
|
||||
ReleaseEvalValue(Value);
|
||||
end;
|
||||
end;
|
||||
{$IFDEF VerbosePas2JS}
|
||||
writeln('TPasToJSConverter.ConvertBuiltIn_Default ',GetResolverResultDbg(ResolvedEl));
|
||||
{$ENDIF}
|
||||
RaiseNotSupported(El,AContext,20180501011649);
|
||||
end;
|
||||
end;
|
||||
btSet:
|
||||
begin
|
||||
Result:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,El));
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
{$IFDEF VerbosePas2JS}
|
||||
writeln('TPasToJSConverter.ConvertBuiltIn_Default ',GetResolverResultDbg(ResolvedEl));
|
||||
{$ENDIF}
|
||||
DoError(20180501011723,nXExpectedButYFound,sXExpectedButYFound,['record',
|
||||
AContext.Resolver.GetResolverResultDescription(ResolvedEl)],Param);
|
||||
end;
|
||||
|
@ -3553,6 +3553,7 @@ begin
|
||||
Add('var f: TMyEnum = Blue;');
|
||||
Add('begin');
|
||||
Add(' e:=green;');
|
||||
Add(' e:=default(TMyEnum);');
|
||||
ConvertProgram;
|
||||
CheckSource('TestEnumName',
|
||||
LinesToStr([ // statements
|
||||
@ -3568,7 +3569,8 @@ begin
|
||||
'this.f = $mod.TMyEnum.Blue;'
|
||||
]),
|
||||
LinesToStr([
|
||||
'$mod.e=$mod.TMyEnum.Green;'
|
||||
'$mod.e=$mod.TMyEnum.Green;',
|
||||
'$mod.e=$mod.TMyEnum.Red;'
|
||||
]));
|
||||
end;
|
||||
|
||||
@ -3896,9 +3898,11 @@ begin
|
||||
' s:=[Red..Blue];',
|
||||
' s:=[Red,Green..Blue];',
|
||||
' s:=[Red,c];',
|
||||
' s:=t;']);
|
||||
' s:=t;',
|
||||
' s:=default(TColors);',
|
||||
'']);
|
||||
ConvertProgram;
|
||||
CheckSource('TestEnumName',
|
||||
CheckSource('TestSet',
|
||||
LinesToStr([ // statements
|
||||
'this.TColor = {',
|
||||
' "0":"Red",',
|
||||
@ -3921,6 +3925,7 @@ begin
|
||||
'$mod.s=rtl.createSet($mod.TColor.Red,null,$mod.TColor.Green,$mod.TColor.Blue);',
|
||||
'$mod.s=rtl.createSet($mod.TColor.Red,$mod.c);',
|
||||
'$mod.s=rtl.refSet($mod.t);',
|
||||
'$mod.s={};',
|
||||
'']));
|
||||
end;
|
||||
|
||||
@ -4843,6 +4848,7 @@ begin
|
||||
' d:=mindouble;',
|
||||
' d:=MinSafeIntDouble;',
|
||||
' d:=MaxSafeIntDouble;',
|
||||
' d:=default(double);',
|
||||
'']);
|
||||
ConvertProgram;
|
||||
CheckSource('TestDouble',
|
||||
@ -4894,6 +4900,7 @@ begin
|
||||
'$mod.d = -1.7E308;',
|
||||
'$mod.d = -4503599627370496;',
|
||||
'$mod.d = 4503599627370495;',
|
||||
'$mod.d = 0.0;',
|
||||
'']));
|
||||
end;
|
||||
|
||||
@ -4911,7 +4918,8 @@ begin
|
||||
'var',
|
||||
' i: TMyInt;',
|
||||
'begin',
|
||||
' i:=-MinInt;']);
|
||||
' i:=-MinInt;',
|
||||
' i:=default(TMyInt);']);
|
||||
ConvertProgram;
|
||||
CheckSource('TestIntegerRange',
|
||||
LinesToStr([
|
||||
@ -4922,6 +4930,7 @@ begin
|
||||
'']),
|
||||
LinesToStr([
|
||||
'$mod.i = - -4503599627370496;',
|
||||
'$mod.i = -4503599627370496;',
|
||||
'']));
|
||||
end;
|
||||
|
||||
@ -4949,6 +4958,7 @@ begin
|
||||
' i2: TInt2;',
|
||||
'begin',
|
||||
' i:=i2;',
|
||||
' i:=default(TMyInt);',
|
||||
' if i=i2 then ;']);
|
||||
ConvertProgram;
|
||||
CheckSource('TestIntegerRange',
|
||||
@ -4968,6 +4978,7 @@ begin
|
||||
'']),
|
||||
LinesToStr([
|
||||
'$mod.i = $mod.i2;',
|
||||
'$mod.i = -1;',
|
||||
'if ($mod.i === $mod.i2) ;',
|
||||
'']));
|
||||
end;
|
||||
@ -5071,6 +5082,7 @@ begin
|
||||
' c:=GetIt(c);',
|
||||
' j:=c;',
|
||||
' Write(c);',
|
||||
' c:=default(currency);',
|
||||
'']);
|
||||
ConvertProgram;
|
||||
CheckSource('TestCurrency',
|
||||
@ -5133,6 +5145,7 @@ begin
|
||||
'$mod.c = Math.floor($mod.GetIt($mod.c / 10000) * 10000);',
|
||||
'$mod.j = $mod.c / 10000;',
|
||||
'$mod.Write($mod.c / 10000);',
|
||||
'$mod.c = 0;',
|
||||
'']));
|
||||
end;
|
||||
|
||||
@ -5253,6 +5266,7 @@ begin
|
||||
Add(' c:=#$0b;');
|
||||
Add(' c:=^A;');
|
||||
Add(' c:=''"'';');
|
||||
Add(' c:=default(char);');
|
||||
ConvertProgram;
|
||||
CheckSource('TestCharConst',
|
||||
LinesToStr([
|
||||
@ -5271,7 +5285,8 @@ begin
|
||||
'$mod.c="\x0B";',
|
||||
'$mod.c="\x0B";',
|
||||
'$mod.c="\x01";',
|
||||
'$mod.c=''"'';'
|
||||
'$mod.c=''"'';',
|
||||
'$mod.c="\x00";'
|
||||
]));
|
||||
end;
|
||||
|
||||
@ -5374,6 +5389,7 @@ begin
|
||||
' s:=''foo''#13''bar'';',
|
||||
' s:=''"'';',
|
||||
' s:=''"''''"'';',
|
||||
' s:=default(string);',
|
||||
'']);
|
||||
ConvertProgram;
|
||||
CheckSource('TestStringConst',
|
||||
@ -5387,7 +5403,8 @@ begin
|
||||
'$mod.s="©";',
|
||||
'$mod.s="foo\rbar";',
|
||||
'$mod.s=''"'';',
|
||||
'$mod.s=''"\''"'';'
|
||||
'$mod.s=''"\''"'';',
|
||||
'$mod.s="";'
|
||||
]));
|
||||
end;
|
||||
|
||||
@ -5652,6 +5669,7 @@ begin
|
||||
' if crg=crg2 then ;',
|
||||
' if c in s then ;',
|
||||
' if crg2 in s then ;',
|
||||
' c:=default(TCharRg);',
|
||||
'']);
|
||||
ConvertProgram;
|
||||
CheckSource('TestCharSet_Custom',
|
||||
@ -5670,6 +5688,7 @@ begin
|
||||
'if ($mod.crg === $mod.crg2) ;',
|
||||
'if ($mod.c.charCodeAt() in $mod.s) ;',
|
||||
'if ($mod.crg2.charCodeAt() in $mod.s) ;',
|
||||
'$mod.c = "a";',
|
||||
'']));
|
||||
end;
|
||||
|
||||
@ -6344,6 +6363,7 @@ begin
|
||||
Add(' i:=low(arr);');
|
||||
Add(' i:=high(arr);');
|
||||
Add(' b:=Assigned(arr);');
|
||||
Add(' Arr:=default(TArrayInt);');
|
||||
ConvertProgram;
|
||||
CheckSource('TestArray_Dynamic',
|
||||
LinesToStr([ // statements
|
||||
@ -6360,6 +6380,7 @@ begin
|
||||
'$mod.i = 0;',
|
||||
'$mod.i = rtl.length($mod.Arr) - 1;',
|
||||
'$mod.b = rtl.length($mod.Arr) > 0;',
|
||||
'$mod.Arr = [];',
|
||||
'']));
|
||||
end;
|
||||
|
||||
@ -6463,6 +6484,7 @@ begin
|
||||
Add(' i:=low(arr);');
|
||||
Add(' i:=high(arr);');
|
||||
Add(' b:=arr[2]=arr[3];');
|
||||
Add(' arr:=default(TArrayInt);');
|
||||
ConvertProgram;
|
||||
CheckSource('TestArray_StaticInt',
|
||||
LinesToStr([ // statements
|
||||
@ -6479,6 +6501,7 @@ begin
|
||||
'$mod.i = 2;',
|
||||
'$mod.i = 4;',
|
||||
'$mod.b = $mod.Arr[0] === $mod.Arr[1];',
|
||||
'$mod.Arr = rtl.arraySetLength(null,0,3).slice(0);',
|
||||
'']));
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user