From 790e1e60076b971b1c43e2ea1976ab795f032802 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Tue, 1 May 2018 10:59:52 +0000 Subject: [PATCH] pastojs: default(settype|rangetype|currency|string) git-svn-id: trunk@38886 - --- packages/fcl-passrc/src/pasresolver.pp | 29 ++++ packages/pastojs/src/fppas2js.pp | 180 +++++++++++++++---------- packages/pastojs/tests/tcmodules.pas | 35 ++++- 3 files changed, 170 insertions(+), 74 deletions(-) diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index 10bfd6cbf4..f07783ab47 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -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; diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 32cf5fa87f..7ffed0e61b 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -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; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index cc79f0d719..deb27be46a 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -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;