Browse Source

pastojs: default(settype|rangetype|currency|string)

git-svn-id: trunk@38886 -
Mattias Gaertner 7 years ago
parent
commit
790e1e6007

+ 29 - 0
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;

+ 110 - 66
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));
-        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);
+        AContext.Resolver.GetIntegerRange(ResolvedEl.BaseType,MinVal,MaxVal);
+        Result:=CreateLiteralNumber(El,MinVal);
         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
+      CreateEnumValue(TPasEnumType(TypeEl));
+      exit;
+      end
+    else if C=TPasSetType then
       begin
-      Result:=CreateLiteralBoolean(El,LowJSBoolean);
+      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;
-    btChar,
-    btWideChar:
+      end
+    else if (C=TPasClassType) or (C=TPasPointerType) then
       begin
-      Result:=CreateLiteralJSString(El,#0);
+      Result:=CreateLiteralNull(El);
       exit;
       end;
-    btByte..btInt64:
+    end;
+  btRange:
+    begin
+    if ResolvedEl.LoTypeEl is TPasRangeType then
       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);
+      Value:=AContext.Resolver.Eval(TPasRangeType(ResolvedEl.LoTypeEl).RangeExpr.left,[refConst]);
+      try
+        Result:=ConvertConstValue(Value,AContext,El);
+      finally
+        ReleaseEvalValue(Value);
+      end;
+      exit;
       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;

+ 29 - 6
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;