Browse Source

pastojs: rtti for enum range

git-svn-id: trunk@37576 -
Mattias Gaertner 7 years ago
parent
commit
d4a570fa6d
2 changed files with 64 additions and 17 deletions
  1. 46 17
      packages/pastojs/src/fppas2js.pp
  2. 18 0
      packages/pastojs/tests/tcmodules.pas

+ 46 - 17
packages/pastojs/src/fppas2js.pp

@@ -2785,13 +2785,26 @@ begin
     begin
     begin
     if ParamResolved.IdentEl is TPasSetType then
     if ParamResolved.IdentEl is TPasSetType then
       TIName:=Pas2JSBuiltInNames[pbitnTISet];
       TIName:=Pas2JSBuiltInNames[pbitnTISet];
+    end
+  else if ParamResolved.BaseType=btRange then
+    begin
+    ConvertRangeToElement(ParamResolved);
+    if ParamResolved.BaseType in btAllJSInteger then
+      TIName:=Pas2JSBuiltInNames[pbitnTIInteger]
+    else if ParamResolved.BaseType=btContext then
+      begin
+      TypeEl:=ParamResolved.TypeEl;
+      C:=TypeEl.ClassType;
+      if C=TPasEnumType then
+        TIName:=Pas2JSBuiltInNames[pbitnTIEnum];
+      end;
     end;
     end;
   if TIName='' then
   if TIName='' then
     begin
     begin
     {$IFDEF VerbosePas2JS}
     {$IFDEF VerbosePas2JS}
     writeln('TPas2JSResolver.BI_TypeInfo_OnGetCallResult ',GetResolverResultDbg(ParamResolved));
     writeln('TPas2JSResolver.BI_TypeInfo_OnGetCallResult ',GetResolverResultDbg(ParamResolved));
     {$ENDIF}
     {$ENDIF}
-    RaiseMsg(20170413091852,nTypeIdentifierExpected,sTypeIdentifierExpected,[],Param);
+    RaiseNotYetImplemented(20170413091852,Param);
     end;
     end;
 
 
   // search for TIName
   // search for TIName
@@ -8605,6 +8618,7 @@ var
   MinInt, MaxInt: MaxPrecInt;
   MinInt, MaxInt: MaxPrecInt;
   OrdType: TOrdType;
   OrdType: TOrdType;
   TIProp: TJSObjectLiteralElement;
   TIProp: TJSObjectLiteralElement;
+  fn: TPas2JSBuiltInName;
 begin
 begin
   Result:=nil;
   Result:=nil;
   if not HasTypeInfo(El,AContext) then exit;
   if not HasTypeInfo(El,AContext) then exit;
@@ -8618,22 +8632,15 @@ begin
     MaxVal:=AContext.Resolver.EvalRangeLimit(El.RangeExpr,[refConst],false,El);
     MaxVal:=AContext.Resolver.EvalRangeLimit(El.RangeExpr,[refConst],false,El);
     if MinVal.Kind=revkInt then
     if MinVal.Kind=revkInt then
       begin
       begin
-      MinInt:=TresEvalInt(MinVal).Int;
-      MaxInt:=TresEvalInt(MaxVal).Int;
-      OrdType:=GetOrdType(MinInt,MaxInt,El);
-      Call:=CreateRTTINewType(El,FBuiltInNames[pbifnRTTINewInt],false,AContext,TIObj);
-      // add  minvalue: number
-      TIProp:=TIObj.Elements.AddElement;
-      TIProp.Name:=TJSString(FBuiltInNames[pbivnRTTIInt_MinValue]);
-      TIProp.Expr:=CreateLiteralNumber(El,MinInt);
-      // add  maxvalue: number
-      TIProp:=TIObj.Elements.AddElement;
-      TIProp.Name:=TJSString(FBuiltInNames[pbivnRTTIInt_MaxValue]);
-      TIProp.Expr:=CreateLiteralNumber(El,MaxInt);
-      // add  ordtype: number
-      TIProp:=TIObj.Elements.AddElement;
-      TIProp.Name:=TJSString(FBuiltInNames[pbivnRTTIInt_OrdType]);
-      TIProp.Expr:=CreateLiteralNumber(El,ord(OrdType));
+      fn:=pbifnRTTINewInt;
+      MinInt:=TResEvalInt(MinVal).Int;
+      MaxInt:=TResEvalInt(MaxVal).Int;
+      end
+    else if MinVal.Kind=revkEnum then
+      begin
+      fn:=pbifnRTTINewEnum;
+      MinInt:=TResEvalEnum(MinVal).Index;
+      MaxInt:=TResEvalEnum(MaxVal).Index;
       end
       end
     else
     else
       begin
       begin
@@ -8642,6 +8649,27 @@ begin
       {$ENDIF}
       {$ENDIF}
       RaiseNotSupported(El,AContext,20170925201628);
       RaiseNotSupported(El,AContext,20170925201628);
       end;
       end;
+    OrdType:=GetOrdType(MinInt,MaxInt,El);
+    Call:=CreateRTTINewType(El,FBuiltInNames[fn],false,AContext,TIObj);
+    // add  minvalue: number
+    TIProp:=TIObj.Elements.AddElement;
+    TIProp.Name:=TJSString(FBuiltInNames[pbivnRTTIInt_MinValue]);
+    TIProp.Expr:=CreateLiteralNumber(El,MinInt);
+    // add  maxvalue: number
+    TIProp:=TIObj.Elements.AddElement;
+    TIProp.Name:=TJSString(FBuiltInNames[pbivnRTTIInt_MaxValue]);
+    TIProp.Expr:=CreateLiteralNumber(El,MaxInt);
+    // add  ordtype: number
+    TIProp:=TIObj.Elements.AddElement;
+    TIProp.Name:=TJSString(FBuiltInNames[pbivnRTTIInt_OrdType]);
+    TIProp.Expr:=CreateLiteralNumber(El,ord(OrdType));
+    if MinVal.Kind=revkEnum then
+      begin
+      // add  enumtype: this.TypeName
+      TIProp:=TIObj.Elements.AddElement;
+      TIProp.Name:=TJSString(FBuiltInNames[pbivnRTTIEnum_EnumType]);
+      TIProp.Expr:=CreateSubDeclNameExpr(El,TResEvalEnum(MinVal).ElType.Name,AContext);
+      end;
     Result:=Call;
     Result:=Call;
   finally
   finally
     ReleaseEvalValue(MinVal);
     ReleaseEvalValue(MinVal);
@@ -10183,6 +10211,7 @@ function TPasToJSConverter.ConvertImplBlock(El: TPasImplBlock;
   AContext: TConvertContext): TJSElement;
   AContext: TConvertContext): TJSElement;
 
 
 begin
 begin
+  //writeln('TPasToJSConverter.ConvertImplBlock ');
   Result:=Nil;
   Result:=Nil;
   if (El is TPasImplStatement) then
   if (El is TPasImplStatement) then
     Result:=ConvertStatement(TPasImplStatement(El),AContext)
     Result:=ConvertStatement(TPasImplStatement(El),AContext)

+ 18 - 0
packages/pastojs/tests/tcmodules.pas

@@ -496,6 +496,7 @@ type
     Procedure TestRTTI_ProcType;
     Procedure TestRTTI_ProcType;
     Procedure TestRTTI_ProcType_ArgFromOtherUnit;
     Procedure TestRTTI_ProcType_ArgFromOtherUnit;
     Procedure TestRTTI_EnumAndSetType;
     Procedure TestRTTI_EnumAndSetType;
+    Procedure TestRTTI_EnumRange;
     Procedure TestRTTI_AnonymousEnumType;
     Procedure TestRTTI_AnonymousEnumType;
     Procedure TestRTTI_StaticArray;
     Procedure TestRTTI_StaticArray;
     Procedure TestRTTI_DynArray;
     Procedure TestRTTI_DynArray;
@@ -13442,6 +13443,23 @@ begin
     '']));
     '']));
 end;
 end;
 
 
+procedure TTestModule.TestRTTI_EnumRange;
+begin
+  Converter.Options:=Converter.Options-[coNoTypeInfo];
+  StartProgram(false);
+  Add([
+  'type',
+  '  TCol = (red,green,blue);',
+  '  TColRg = green..blue;',
+  '  TSetOfColRg = set of TColRg;',
+  'var p: pointer;',
+  'begin',
+  '  p:=typeinfo(tcolrg);',
+  '  p:=typeinfo(tsetofcolrg);',
+  '']);
+  ConvertProgram;
+end;
+
 procedure TTestModule.TestRTTI_AnonymousEnumType;
 procedure TTestModule.TestRTTI_AnonymousEnumType;
 begin
 begin
   Converter.Options:=Converter.Options-[coNoTypeInfo];
   Converter.Options:=Converter.Options-[coNoTypeInfo];