Ver código fonte

pastojs: fixed property RTTI for alias type in other unit

git-svn-id: trunk@39361 -
Mattias Gaertner 7 anos atrás
pai
commit
b8ae9f5d6d
2 arquivos alterados com 468 adições e 419 exclusões
  1. 1 0
      packages/pastojs/src/fppas2js.pp
  2. 467 419
      packages/pastojs/tests/tcmodules.pas

+ 1 - 0
packages/pastojs/src/fppas2js.pp

@@ -13914,6 +13914,7 @@ var
   aModule: TPasModule;
   Bracket: TJSBracketMemberExpression;
 begin
+  El:=ResolveSimpleAliasType(El);
   aName:=GetTypeInfoName(El,AContext,ErrorEl);
   if aName=FBuiltInNames[pbivnRTTILocal] then
     Result:=CreatePrimitiveDotExpr(aName,El)

+ 467 - 419
packages/pastojs/tests/tcmodules.pas

@@ -660,17 +660,18 @@ type
     Procedure TestRTTI_PublishedClassPropertyFail;
     Procedure TestRTTI_PublishedClassFieldFail;
     Procedure TestRTTI_PublishedFieldExternalFail;
+    Procedure TestRTTI_Class_Field;
+    Procedure TestRTTI_Class_Method;
+    Procedure TestRTTI_Class_MethodArgFlags;
+    Procedure TestRTTI_Class_Property;
+    Procedure TestRTTI_Class_PropertyParams;
+    Procedure TestRTTI_Class_OtherUnit_TypeAlias;
     Procedure TestRTTI_IndexModifier;
     Procedure TestRTTI_StoredModifier;
     Procedure TestRTTI_DefaultValue;
     Procedure TestRTTI_DefaultValueSet;
     Procedure TestRTTI_DefaultValueRangeType;
     Procedure TestRTTI_DefaultValueInherit;
-    Procedure TestRTTI_Class_Field;
-    Procedure TestRTTI_Class_Method;
-    Procedure TestRTTI_Class_MethodArgFlags;
-    Procedure TestRTTI_Class_Property;
-    Procedure TestRTTI_Class_PropertyParams;
     Procedure TestRTTI_OverrideMethod;
     Procedure TestRTTI_OverloadProperty;
     // ToDo: array argument
@@ -19785,215 +19786,512 @@ begin
   ConvertProgram;
 end;
 
-procedure TTestModule.TestRTTI_IndexModifier;
+procedure TTestModule.TestRTTI_Class_Field;
 begin
   Converter.Options:=Converter.Options-[coNoTypeInfo];
   StartProgram(false);
-  Add([
-  'type',
-  '  TEnum = (red, blue);',
-  '  TObject = class',
-  '    FB: boolean;',
-  '    procedure SetIntBool(Index: longint; b: boolean); virtual; abstract;',
-  '    function GetBoolBool(Index: boolean): boolean; virtual; abstract;',
-  '    procedure SetBoolBool(Index: boolean; b: boolean); virtual; abstract;',
-  '    function GetEnumBool(Index: TEnum): boolean; virtual; abstract;',
-  '    function GetStrIntBool(A: String; I: longint): boolean; virtual; abstract;',
-  '    procedure SetStrIntBool(A: String; I: longint; b: boolean); virtual; abstract;',
-  '  published',
-  '    property B1: boolean index 1 read FB write SetIntBool;',
-  '    property B2: boolean index TEnum.blue read GetEnumBool write FB;',
-  '    property I1[A: String]: boolean index 2 read GetStrIntBool write SetStrIntBool;',
-  '  end;',
-  'begin']);
+  Add('{$modeswitch externalclass}');
+  Add('type');
+  Add('  TObject = class');
+  Add('  private');
+  Add('    FPropA: string;');
+  Add('  published');
+  Add('    VarLI: longint;');
+  Add('    VarC: char;');
+  Add('    VarS: string;');
+  Add('    VarD: double;');
+  Add('    VarB: boolean;');
+  Add('    VarLW: longword;');
+  Add('    VarSmI: smallint;');
+  Add('    VarW: word;');
+  Add('    VarShI: shortint;');
+  Add('    VarBy: byte;');
+  Add('    VarExt: longint external name ''VarExt'';');
+  Add('  end;');
+  Add('var p: pointer;');
+  Add('  Obj: tobject;');
+  Add('begin');
+  Add('  p:=typeinfo(tobject);');
+  Add('  p:=typeinfo(p);');
+  Add('  p:=typeinfo(obj);');
   ConvertProgram;
-  CheckSource('TestRTTI_IndexModifier',
+  CheckSource('TestRTTI_Class_Field',
     LinesToStr([ // statements
-    'this.TEnum = {',
-    '  "0": "red",',
-    '  red: 0,',
-    '  "1": "blue",',
-    '  blue: 1',
-    '};',
-    '$mod.$rtti.$Enum("TEnum", {',
-    '  minvalue: 0,',
-    '  maxvalue: 1,',
-    '  ordtype: 1,',
-    '  enumtype: this.TEnum',
-    '});',
     'rtl.createClass($mod, "TObject", null, function () {',
     '  this.$init = function () {',
-    '    this.FB = false;',
+    '    this.FPropA = "";',
+    '    this.VarLI = 0;',
+    '    this.VarC = "";',
+    '    this.VarS = "";',
+    '    this.VarD = 0.0;',
+    '    this.VarB = false;',
+    '    this.VarLW = 0;',
+    '    this.VarSmI = 0;',
+    '    this.VarW = 0;',
+    '    this.VarShI = 0;',
+    '    this.VarBy = 0;',
     '  };',
     '  this.$final = function () {',
     '  };',
     '  var $r = this.$rtti;',
-    '  $r.addProperty(',
-    '    "B1",',
-    '    18,',
-    '    rtl.boolean,',
-    '    "FB",',
-    '    "SetIntBool",',
-    '    {',
-    '      index: 1',
-    '    }',
-    '  );',
-    '  $r.addProperty(',
-    '    "B2",',
-    '    17,',
-    '    rtl.boolean,',
-    '    "GetEnumBool",',
-    '    "FB",',
-    '    {',
-    '      index: $mod.TEnum.blue',
-    '    }',
-    '  );',
-    '  $r.addProperty(',
-    '    "I1",',
-    '    19,',
-    '    rtl.boolean,',
-    '    "GetStrIntBool",',
-    '    "SetStrIntBool",',
-    '    {',
-    '      index: 2',
-    '    }',
-    '  );',
+    '  $r.addField("VarLI", rtl.longint);',
+    '  $r.addField("VarC", rtl.char);',
+    '  $r.addField("VarS", rtl.string);',
+    '  $r.addField("VarD", rtl.double);',
+    '  $r.addField("VarB", rtl.boolean);',
+    '  $r.addField("VarLW", rtl.longword);',
+    '  $r.addField("VarSmI", rtl.smallint);',
+    '  $r.addField("VarW", rtl.word);',
+    '  $r.addField("VarShI", rtl.shortint);',
+    '  $r.addField("VarBy", rtl.byte);',
+    '  $r.addField("VarExt", rtl.longint);',
     '});',
+    'this.p = null;',
+    'this.Obj = null;',
     '']),
     LinesToStr([ // $mod.$main
+    '$mod.p = $mod.$rtti["TObject"];',
+    '$mod.p = rtl.pointer;',
+    '$mod.p = $mod.Obj.$rtti;',
     '']));
 end;
 
-procedure TTestModule.TestRTTI_StoredModifier;
+procedure TTestModule.TestRTTI_Class_Method;
 begin
   Converter.Options:=Converter.Options-[coNoTypeInfo];
   StartProgram(false);
-  Add([
-  'const',
-  '  ConstB = true;',
-  'type',
-  '  TObject = class',
-  '  private',
-  '    FB: boolean;',
-  '    function IsBStored: boolean; virtual; abstract;',
-  '  published',
-  '    property BoolA: boolean read FB stored true;',
-  '    property BoolB: boolean read FB stored false;',
-  '    property BoolC: boolean read FB stored FB;',
-  '    property BoolD: boolean read FB stored ConstB;',
-  '    property BoolE: boolean read FB stored IsBStored;',
-  '  end;',
-  'begin']);
+  Add('type');
+  Add('  TObject = class');
+  Add('  private');
+  Add('    procedure Internal; external name ''$intern'';');
+  Add('  published');
+  Add('    procedure Click; virtual; abstract;');
+  Add('    procedure Notify(Sender: TObject); virtual; abstract;');
+  Add('    function GetNotify: boolean; external name ''GetNotify'';');
+  Add('    procedure Println(a,b: longint); varargs; virtual; abstract;');
+  Add('  end;');
+  Add('begin');
   ConvertProgram;
-  CheckSource('TestRTTI_StoredModifier',
+  CheckSource('TestRTTI_Class_Method',
     LinesToStr([ // statements
-    'this.ConstB = true;',
     'rtl.createClass($mod, "TObject", null, function () {',
     '  this.$init = function () {',
-    '    this.FB = false;',
     '  };',
     '  this.$final = function () {',
     '  };',
     '  var $r = this.$rtti;',
-    '  $r.addProperty("BoolA", 0, rtl.boolean, "FB", "");',
-    '  $r.addProperty("BoolB", 4, rtl.boolean, "FB", "");',
-    '  $r.addProperty(',
-    '    "BoolC",',
-    '    8,',
-    '    rtl.boolean,',
-    '    "FB",',
-    '    "",',
-    '    {',
-    '      stored: "FB"',
-    '    }',
-    '  );',
-    '  $r.addProperty("BoolD", 0, rtl.boolean, "FB", "");',
-    '  $r.addProperty(',
-    '    "BoolE",',
-    '    12,',
-    '    rtl.boolean,',
-    '    "FB",',
-    '    "",',
-    '    {',
-    '      stored: "IsBStored"',
-    '    }',
-    '  );',
+    '  $r.addMethod("Click", 0, null);',
+    '  $r.addMethod("Notify", 0, [["Sender", $r]]);',
+    '  $r.addMethod("GetNotify", 1, null, rtl.boolean,{flags: 4});',
+    '  $r.addMethod("Println", 0, [["a", rtl.longint], ["b", rtl.longint]], null, {',
+    '    flags: 2',
+    '  });',
     '});',
     '']),
     LinesToStr([ // $mod.$main
     '']));
 end;
 
-procedure TTestModule.TestRTTI_DefaultValue;
+procedure TTestModule.TestRTTI_Class_MethodArgFlags;
 begin
   Converter.Options:=Converter.Options-[coNoTypeInfo];
   StartProgram(false);
-  Add([
-  'type',
-  '  TEnum = (red, blue);',
-  'const',
-  '  CB = true or false;',
-  '  CI = 1+2;',
-  'type',
-  '  TObject = class',
-  '    FB: boolean;',
-  '    FI: longint;',
-  '    FE: TEnum;',
-  '  published',
-  '    property B1: boolean read FB default true;',
-  '    property B2: boolean read FB default CB;',
-  '    property B3: boolean read FB default test1.cb;',
-  '    property I1: longint read FI default 2;',
-  '    property I2: longint read FI default CI;',
-  '    property E1: TEnum read FE default red;',
-  '    property E2: TEnum read FE default TEnum.blue;',
-  '  end;',
-  'begin']);
+  Add('type');
+  Add('  TObject = class');
+  Add('  published');
+  Add('    procedure OpenArray(const Args: array of string); virtual; abstract;');
+  Add('    procedure ByRef(var Value: longint; out Item: longint); virtual; abstract;');
+  Add('    procedure Untyped(var Value; out Item); virtual; abstract;');
+  Add('  end;');
+  Add('begin');
   ConvertProgram;
-  CheckSource('TestRTTI_DefaultValue',
+  CheckSource('TestRTTI_Class_MethodOpenArray',
     LinesToStr([ // statements
-    'this.TEnum = {',
-    '  "0": "red",',
-    '  red: 0,',
-    '  "1": "blue",',
-    '  blue: 1',
-    '};',
-    '$mod.$rtti.$Enum("TEnum", {',
-    '  minvalue: 0,',
-    '  maxvalue: 1,',
-    '  ordtype: 1,',
-    '  enumtype: this.TEnum',
-    '});',
-    'this.CB = true || false;',
-    'this.CI = 1 + 2;',
     'rtl.createClass($mod, "TObject", null, function () {',
     '  this.$init = function () {',
-    '    this.FB = false;',
-    '    this.FI = 0;',
-    '    this.FE = 0;',
     '  };',
     '  this.$final = function () {',
     '  };',
     '  var $r = this.$rtti;',
-    '  $r.addProperty(',
-    '    "B1",',
-    '    0,',
-    '    rtl.boolean,',
-    '    "FB",',
-    '    "",',
-    '    {',
-    '      Default: true',
-    '    }',
-    '  );',
-    '  $r.addProperty(',
-    '    "B2",',
-    '    0,',
-    '    rtl.boolean,',
-    '    "FB",',
-    '    "",',
-    '    {',
-    '      Default: true',
-    '    }',
+    '$r.addMethod("OpenArray", 0, [["Args", rtl.string, 10]]);',
+    '$r.addMethod("ByRef", 0, [["Value", rtl.longint, 1], ["Item", rtl.longint, 4]]);',
+    '$r.addMethod("Untyped", 0, [["Value", null, 1], ["Item", null, 4]]);',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
+procedure TTestModule.TestRTTI_Class_Property;
+begin
+  Converter.Options:=Converter.Options-[coNoTypeInfo];
+  StartProgram(false);
+  Add('{$modeswitch externalclass}');
+  Add('type');
+  Add('  TObject = class');
+  Add('  private');
+  Add('    FColor: longint;');
+  Add('    FColorStored: boolean;');
+  Add('    procedure SetColor(Value: longint); virtual; abstract;');
+  Add('    function GetColor: longint; virtual; abstract;');
+  Add('    function GetColorStored: boolean; virtual; abstract;');
+  Add('    FExtSize: longint external name ''$extSize'';');
+  Add('    FExtSizeStored: boolean external name ''$extSizeStored'';');
+  Add('    procedure SetExtSize(Value: longint); external name ''$setSize'';');
+  Add('    function GetExtSize: longint; external name ''$getSize'';');
+  Add('    function GetExtSizeStored: boolean; external name ''$getExtSizeStored'';');
+  Add('  published');
+  Add('    property ColorA: longint read FColor;');
+  Add('    property ColorB: longint write FColor;');
+  Add('    property ColorC: longint read GetColor write SetColor;');
+  Add('    property ColorD: longint read FColor write FColor stored FColorStored;');
+  Add('    property ExtSizeA: longint read FExtSize write FExtSize;');
+  Add('    property ExtSizeB: longint read GetExtSize write SetExtSize stored FExtSizeStored;');
+  Add('    property ExtSizeC: longint read FExtSize write FExtSize stored GetExtSizeStored;');
+  Add('  end;');
+  Add('begin');
+  ConvertProgram;
+  CheckSource('TestRTTI_Class_Property',
+    LinesToStr([ // statements
+    'rtl.createClass($mod, "TObject", null, function () {',
+    '  this.$init = function () {',
+    '    this.FColor = 0;',
+    '    this.FColorStored = false;',
+    '  };',
+    '  this.$final = function () {',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $r.addProperty("ColorA", 0, rtl.longint, "FColor", "");',
+    '  $r.addProperty("ColorB", 0, rtl.longint, "", "FColor");',
+    '  $r.addProperty("ColorC", 3, rtl.longint, "GetColor", "SetColor");',
+    '  $r.addProperty(',
+    '    "ColorD",',
+    '    8,',
+    '    rtl.longint,',
+    '    "FColor",',
+    '    "FColor",',
+    '    {',
+    '      stored: "FColorStored"',
+    '    }',
+    '  );',
+    '  $r.addProperty("ExtSizeA", 0, rtl.longint, "$extSize", "$extSize");',
+    '  $r.addProperty(',
+    '    "ExtSizeB",',
+    '    11,',
+    '    rtl.longint,',
+    '    "$getSize",',
+    '    "$setSize",',
+    '    {',
+    '      stored: "$extSizeStored"',
+    '    }',
+    '  );',
+    '  $r.addProperty(',
+    '    "ExtSizeC",',
+    '    12,',
+    '    rtl.longint,',
+    '    "$extSize",',
+    '    "$extSize",',
+    '    {',
+    '      stored: "$getExtSizeStored"',
+    '    }',
+    '  );',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
+procedure TTestModule.TestRTTI_Class_PropertyParams;
+begin
+  Converter.Options:=Converter.Options-[coNoTypeInfo];
+  StartProgram(false);
+  Add('{$modeswitch externalclass}');
+  Add('type');
+  Add('  integer = longint;');
+  Add('  TObject = class');
+  Add('  private');
+  Add('    function GetItems(i: integer): tobject; virtual; abstract;');
+  Add('    procedure SetItems(i: integer; value: tobject); virtual; abstract;');
+  Add('    function GetValues(const i: integer; var b: boolean): char; virtual; abstract;');
+  Add('    procedure SetValues(const i: integer; var b: boolean; value: char); virtual; abstract;');
+  Add('  published');
+  Add('    property Items[Index: integer]: tobject read getitems write setitems;');
+  Add('    property Values[const keya: integer; var keyb: boolean]: char read getvalues write setvalues;');
+  Add('  end;');
+  Add('begin');
+  ConvertProgram;
+  CheckSource('TestRTTI_Class_PropertyParams',
+    LinesToStr([ // statements
+    'rtl.createClass($mod, "TObject", null, function () {',
+    '  this.$init = function () {',
+    '  };',
+    '  this.$final = function () {',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $r.addProperty("Items", 3, $r, "GetItems", "SetItems");',
+    '  $r.addProperty("Values", 3, rtl.char, "GetValues", "SetValues");',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
+procedure TTestModule.TestRTTI_Class_OtherUnit_TypeAlias;
+begin
+  Converter.Options:=Converter.Options-[coNoTypeInfo];
+  AddModuleWithIntfImplSrc('unit1.pas',
+    'type TColor = -5..5;',
+    '');
+
+  StartProgram(true);
+  Add([
+  'uses unit1;',
+  'type',
+  '  TColorAlias = TColor;',
+  '  TColorTypeAlias = type TColor;',
+  '  TObject = class',
+  '  private',
+  '    fColor: TColor;',
+  '    fAlias: TColorAlias;',
+  '    fTypeAlias: TColorTypeAlias;',
+  '  published',
+  '    property Color: TColor read fcolor;',
+  '    property Alias: TColorAlias read falias;',
+  '    property TypeAlias: TColorTypeAlias read ftypealias;',
+  '  end;',
+  'begin',
+  '']);
+  ConvertProgram;
+  CheckSource('TestRTTI_Class_OtherUnit_TypeAlias',
+    LinesToStr([ // statements
+    '$mod.$rtti.$inherited("TColorTypeAlias", pas.unit1.$rtti["TColor"], {});',
+    'rtl.createClass($mod, "TObject", null, function () {',
+    '  this.$init = function () {',
+    '    this.fColor = -5;',
+    '    this.fAlias = -5;',
+    '    this.fTypeAlias = -5;',
+    '  };',
+    '  this.$final = function () {',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $r.addProperty("Color", 0, pas.unit1.$rtti["TColor"], "fColor", "");',
+    '  $r.addProperty("Alias", 0, pas.unit1.$rtti["TColor"], "fAlias", "");',
+    '  $r.addProperty("TypeAlias", 0, $mod.$rtti["TColorTypeAlias"], "fTypeAlias", "");',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
+procedure TTestModule.TestRTTI_IndexModifier;
+begin
+  Converter.Options:=Converter.Options-[coNoTypeInfo];
+  StartProgram(false);
+  Add([
+  'type',
+  '  TEnum = (red, blue);',
+  '  TObject = class',
+  '    FB: boolean;',
+  '    procedure SetIntBool(Index: longint; b: boolean); virtual; abstract;',
+  '    function GetBoolBool(Index: boolean): boolean; virtual; abstract;',
+  '    procedure SetBoolBool(Index: boolean; b: boolean); virtual; abstract;',
+  '    function GetEnumBool(Index: TEnum): boolean; virtual; abstract;',
+  '    function GetStrIntBool(A: String; I: longint): boolean; virtual; abstract;',
+  '    procedure SetStrIntBool(A: String; I: longint; b: boolean); virtual; abstract;',
+  '  published',
+  '    property B1: boolean index 1 read FB write SetIntBool;',
+  '    property B2: boolean index TEnum.blue read GetEnumBool write FB;',
+  '    property I1[A: String]: boolean index 2 read GetStrIntBool write SetStrIntBool;',
+  '  end;',
+  'begin']);
+  ConvertProgram;
+  CheckSource('TestRTTI_IndexModifier',
+    LinesToStr([ // statements
+    'this.TEnum = {',
+    '  "0": "red",',
+    '  red: 0,',
+    '  "1": "blue",',
+    '  blue: 1',
+    '};',
+    '$mod.$rtti.$Enum("TEnum", {',
+    '  minvalue: 0,',
+    '  maxvalue: 1,',
+    '  ordtype: 1,',
+    '  enumtype: this.TEnum',
+    '});',
+    'rtl.createClass($mod, "TObject", null, function () {',
+    '  this.$init = function () {',
+    '    this.FB = false;',
+    '  };',
+    '  this.$final = function () {',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $r.addProperty(',
+    '    "B1",',
+    '    18,',
+    '    rtl.boolean,',
+    '    "FB",',
+    '    "SetIntBool",',
+    '    {',
+    '      index: 1',
+    '    }',
+    '  );',
+    '  $r.addProperty(',
+    '    "B2",',
+    '    17,',
+    '    rtl.boolean,',
+    '    "GetEnumBool",',
+    '    "FB",',
+    '    {',
+    '      index: $mod.TEnum.blue',
+    '    }',
+    '  );',
+    '  $r.addProperty(',
+    '    "I1",',
+    '    19,',
+    '    rtl.boolean,',
+    '    "GetStrIntBool",',
+    '    "SetStrIntBool",',
+    '    {',
+    '      index: 2',
+    '    }',
+    '  );',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
+procedure TTestModule.TestRTTI_StoredModifier;
+begin
+  Converter.Options:=Converter.Options-[coNoTypeInfo];
+  StartProgram(false);
+  Add([
+  'const',
+  '  ConstB = true;',
+  'type',
+  '  TObject = class',
+  '  private',
+  '    FB: boolean;',
+  '    function IsBStored: boolean; virtual; abstract;',
+  '  published',
+  '    property BoolA: boolean read FB stored true;',
+  '    property BoolB: boolean read FB stored false;',
+  '    property BoolC: boolean read FB stored FB;',
+  '    property BoolD: boolean read FB stored ConstB;',
+  '    property BoolE: boolean read FB stored IsBStored;',
+  '  end;',
+  'begin']);
+  ConvertProgram;
+  CheckSource('TestRTTI_StoredModifier',
+    LinesToStr([ // statements
+    'this.ConstB = true;',
+    'rtl.createClass($mod, "TObject", null, function () {',
+    '  this.$init = function () {',
+    '    this.FB = false;',
+    '  };',
+    '  this.$final = function () {',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $r.addProperty("BoolA", 0, rtl.boolean, "FB", "");',
+    '  $r.addProperty("BoolB", 4, rtl.boolean, "FB", "");',
+    '  $r.addProperty(',
+    '    "BoolC",',
+    '    8,',
+    '    rtl.boolean,',
+    '    "FB",',
+    '    "",',
+    '    {',
+    '      stored: "FB"',
+    '    }',
+    '  );',
+    '  $r.addProperty("BoolD", 0, rtl.boolean, "FB", "");',
+    '  $r.addProperty(',
+    '    "BoolE",',
+    '    12,',
+    '    rtl.boolean,',
+    '    "FB",',
+    '    "",',
+    '    {',
+    '      stored: "IsBStored"',
+    '    }',
+    '  );',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
+procedure TTestModule.TestRTTI_DefaultValue;
+begin
+  Converter.Options:=Converter.Options-[coNoTypeInfo];
+  StartProgram(false);
+  Add([
+  'type',
+  '  TEnum = (red, blue);',
+  'const',
+  '  CB = true or false;',
+  '  CI = 1+2;',
+  'type',
+  '  TObject = class',
+  '    FB: boolean;',
+  '    FI: longint;',
+  '    FE: TEnum;',
+  '  published',
+  '    property B1: boolean read FB default true;',
+  '    property B2: boolean read FB default CB;',
+  '    property B3: boolean read FB default test1.cb;',
+  '    property I1: longint read FI default 2;',
+  '    property I2: longint read FI default CI;',
+  '    property E1: TEnum read FE default red;',
+  '    property E2: TEnum read FE default TEnum.blue;',
+  '  end;',
+  'begin']);
+  ConvertProgram;
+  CheckSource('TestRTTI_DefaultValue',
+    LinesToStr([ // statements
+    'this.TEnum = {',
+    '  "0": "red",',
+    '  red: 0,',
+    '  "1": "blue",',
+    '  blue: 1',
+    '};',
+    '$mod.$rtti.$Enum("TEnum", {',
+    '  minvalue: 0,',
+    '  maxvalue: 1,',
+    '  ordtype: 1,',
+    '  enumtype: this.TEnum',
+    '});',
+    'this.CB = true || false;',
+    'this.CI = 1 + 2;',
+    'rtl.createClass($mod, "TObject", null, function () {',
+    '  this.$init = function () {',
+    '    this.FB = false;',
+    '    this.FI = 0;',
+    '    this.FE = 0;',
+    '  };',
+    '  this.$final = function () {',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $r.addProperty(',
+    '    "B1",',
+    '    0,',
+    '    rtl.boolean,',
+    '    "FB",',
+    '    "",',
+    '    {',
+    '      Default: true',
+    '    }',
+    '  );',
+    '  $r.addProperty(',
+    '    "B2",',
+    '    0,',
+    '    rtl.boolean,',
+    '    "FB",',
+    '    "",',
+    '    {',
+    '      Default: true',
+    '    }',
     '  );',
     '  $r.addProperty(',
     '    "B3",',
@@ -20241,256 +20539,6 @@ begin
     '']));
 end;
 
-procedure TTestModule.TestRTTI_Class_Field;
-begin
-  Converter.Options:=Converter.Options-[coNoTypeInfo];
-  StartProgram(false);
-  Add('{$modeswitch externalclass}');
-  Add('type');
-  Add('  TObject = class');
-  Add('  private');
-  Add('    FPropA: string;');
-  Add('  published');
-  Add('    VarLI: longint;');
-  Add('    VarC: char;');
-  Add('    VarS: string;');
-  Add('    VarD: double;');
-  Add('    VarB: boolean;');
-  Add('    VarLW: longword;');
-  Add('    VarSmI: smallint;');
-  Add('    VarW: word;');
-  Add('    VarShI: shortint;');
-  Add('    VarBy: byte;');
-  Add('    VarExt: longint external name ''VarExt'';');
-  Add('  end;');
-  Add('var p: pointer;');
-  Add('  Obj: tobject;');
-  Add('begin');
-  Add('  p:=typeinfo(tobject);');
-  Add('  p:=typeinfo(p);');
-  Add('  p:=typeinfo(obj);');
-  ConvertProgram;
-  CheckSource('TestRTTI_Class_Field',
-    LinesToStr([ // statements
-    'rtl.createClass($mod, "TObject", null, function () {',
-    '  this.$init = function () {',
-    '    this.FPropA = "";',
-    '    this.VarLI = 0;',
-    '    this.VarC = "";',
-    '    this.VarS = "";',
-    '    this.VarD = 0.0;',
-    '    this.VarB = false;',
-    '    this.VarLW = 0;',
-    '    this.VarSmI = 0;',
-    '    this.VarW = 0;',
-    '    this.VarShI = 0;',
-    '    this.VarBy = 0;',
-    '  };',
-    '  this.$final = function () {',
-    '  };',
-    '  var $r = this.$rtti;',
-    '  $r.addField("VarLI", rtl.longint);',
-    '  $r.addField("VarC", rtl.char);',
-    '  $r.addField("VarS", rtl.string);',
-    '  $r.addField("VarD", rtl.double);',
-    '  $r.addField("VarB", rtl.boolean);',
-    '  $r.addField("VarLW", rtl.longword);',
-    '  $r.addField("VarSmI", rtl.smallint);',
-    '  $r.addField("VarW", rtl.word);',
-    '  $r.addField("VarShI", rtl.shortint);',
-    '  $r.addField("VarBy", rtl.byte);',
-    '  $r.addField("VarExt", rtl.longint);',
-    '});',
-    'this.p = null;',
-    'this.Obj = null;',
-    '']),
-    LinesToStr([ // $mod.$main
-    '$mod.p = $mod.$rtti["TObject"];',
-    '$mod.p = rtl.pointer;',
-    '$mod.p = $mod.Obj.$rtti;',
-    '']));
-end;
-
-procedure TTestModule.TestRTTI_Class_Method;
-begin
-  Converter.Options:=Converter.Options-[coNoTypeInfo];
-  StartProgram(false);
-  Add('type');
-  Add('  TObject = class');
-  Add('  private');
-  Add('    procedure Internal; external name ''$intern'';');
-  Add('  published');
-  Add('    procedure Click; virtual; abstract;');
-  Add('    procedure Notify(Sender: TObject); virtual; abstract;');
-  Add('    function GetNotify: boolean; external name ''GetNotify'';');
-  Add('    procedure Println(a,b: longint); varargs; virtual; abstract;');
-  Add('  end;');
-  Add('begin');
-  ConvertProgram;
-  CheckSource('TestRTTI_Class_Method',
-    LinesToStr([ // statements
-    'rtl.createClass($mod, "TObject", null, function () {',
-    '  this.$init = function () {',
-    '  };',
-    '  this.$final = function () {',
-    '  };',
-    '  var $r = this.$rtti;',
-    '  $r.addMethod("Click", 0, null);',
-    '  $r.addMethod("Notify", 0, [["Sender", $r]]);',
-    '  $r.addMethod("GetNotify", 1, null, rtl.boolean,{flags: 4});',
-    '  $r.addMethod("Println", 0, [["a", rtl.longint], ["b", rtl.longint]], null, {',
-    '    flags: 2',
-    '  });',
-    '});',
-    '']),
-    LinesToStr([ // $mod.$main
-    '']));
-end;
-
-procedure TTestModule.TestRTTI_Class_MethodArgFlags;
-begin
-  Converter.Options:=Converter.Options-[coNoTypeInfo];
-  StartProgram(false);
-  Add('type');
-  Add('  TObject = class');
-  Add('  published');
-  Add('    procedure OpenArray(const Args: array of string); virtual; abstract;');
-  Add('    procedure ByRef(var Value: longint; out Item: longint); virtual; abstract;');
-  Add('    procedure Untyped(var Value; out Item); virtual; abstract;');
-  Add('  end;');
-  Add('begin');
-  ConvertProgram;
-  CheckSource('TestRTTI_Class_MethodOpenArray',
-    LinesToStr([ // statements
-    'rtl.createClass($mod, "TObject", null, function () {',
-    '  this.$init = function () {',
-    '  };',
-    '  this.$final = function () {',
-    '  };',
-    '  var $r = this.$rtti;',
-    '$r.addMethod("OpenArray", 0, [["Args", rtl.string, 10]]);',
-    '$r.addMethod("ByRef", 0, [["Value", rtl.longint, 1], ["Item", rtl.longint, 4]]);',
-    '$r.addMethod("Untyped", 0, [["Value", null, 1], ["Item", null, 4]]);',
-    '});',
-    '']),
-    LinesToStr([ // $mod.$main
-    '']));
-end;
-
-procedure TTestModule.TestRTTI_Class_Property;
-begin
-  Converter.Options:=Converter.Options-[coNoTypeInfo];
-  StartProgram(false);
-  Add('{$modeswitch externalclass}');
-  Add('type');
-  Add('  TObject = class');
-  Add('  private');
-  Add('    FColor: longint;');
-  Add('    FColorStored: boolean;');
-  Add('    procedure SetColor(Value: longint); virtual; abstract;');
-  Add('    function GetColor: longint; virtual; abstract;');
-  Add('    function GetColorStored: boolean; virtual; abstract;');
-  Add('    FExtSize: longint external name ''$extSize'';');
-  Add('    FExtSizeStored: boolean external name ''$extSizeStored'';');
-  Add('    procedure SetExtSize(Value: longint); external name ''$setSize'';');
-  Add('    function GetExtSize: longint; external name ''$getSize'';');
-  Add('    function GetExtSizeStored: boolean; external name ''$getExtSizeStored'';');
-  Add('  published');
-  Add('    property ColorA: longint read FColor;');
-  Add('    property ColorB: longint write FColor;');
-  Add('    property ColorC: longint read GetColor write SetColor;');
-  Add('    property ColorD: longint read FColor write FColor stored FColorStored;');
-  Add('    property ExtSizeA: longint read FExtSize write FExtSize;');
-  Add('    property ExtSizeB: longint read GetExtSize write SetExtSize stored FExtSizeStored;');
-  Add('    property ExtSizeC: longint read FExtSize write FExtSize stored GetExtSizeStored;');
-  Add('  end;');
-  Add('begin');
-  ConvertProgram;
-  CheckSource('TestRTTI_Class_Property',
-    LinesToStr([ // statements
-    'rtl.createClass($mod, "TObject", null, function () {',
-    '  this.$init = function () {',
-    '    this.FColor = 0;',
-    '    this.FColorStored = false;',
-    '  };',
-    '  this.$final = function () {',
-    '  };',
-    '  var $r = this.$rtti;',
-    '  $r.addProperty("ColorA", 0, rtl.longint, "FColor", "");',
-    '  $r.addProperty("ColorB", 0, rtl.longint, "", "FColor");',
-    '  $r.addProperty("ColorC", 3, rtl.longint, "GetColor", "SetColor");',
-    '  $r.addProperty(',
-    '    "ColorD",',
-    '    8,',
-    '    rtl.longint,',
-    '    "FColor",',
-    '    "FColor",',
-    '    {',
-    '      stored: "FColorStored"',
-    '    }',
-    '  );',
-    '  $r.addProperty("ExtSizeA", 0, rtl.longint, "$extSize", "$extSize");',
-    '  $r.addProperty(',
-    '    "ExtSizeB",',
-    '    11,',
-    '    rtl.longint,',
-    '    "$getSize",',
-    '    "$setSize",',
-    '    {',
-    '      stored: "$extSizeStored"',
-    '    }',
-    '  );',
-    '  $r.addProperty(',
-    '    "ExtSizeC",',
-    '    12,',
-    '    rtl.longint,',
-    '    "$extSize",',
-    '    "$extSize",',
-    '    {',
-    '      stored: "$getExtSizeStored"',
-    '    }',
-    '  );',
-    '});',
-    '']),
-    LinesToStr([ // $mod.$main
-    '']));
-end;
-
-procedure TTestModule.TestRTTI_Class_PropertyParams;
-begin
-  Converter.Options:=Converter.Options-[coNoTypeInfo];
-  StartProgram(false);
-  Add('{$modeswitch externalclass}');
-  Add('type');
-  Add('  integer = longint;');
-  Add('  TObject = class');
-  Add('  private');
-  Add('    function GetItems(i: integer): tobject; virtual; abstract;');
-  Add('    procedure SetItems(i: integer; value: tobject); virtual; abstract;');
-  Add('    function GetValues(const i: integer; var b: boolean): char; virtual; abstract;');
-  Add('    procedure SetValues(const i: integer; var b: boolean; value: char); virtual; abstract;');
-  Add('  published');
-  Add('    property Items[Index: integer]: tobject read getitems write setitems;');
-  Add('    property Values[const keya: integer; var keyb: boolean]: char read getvalues write setvalues;');
-  Add('  end;');
-  Add('begin');
-  ConvertProgram;
-  CheckSource('TestRTTI_Class_PropertyParams',
-    LinesToStr([ // statements
-    'rtl.createClass($mod, "TObject", null, function () {',
-    '  this.$init = function () {',
-    '  };',
-    '  this.$final = function () {',
-    '  };',
-    '  var $r = this.$rtti;',
-    '  $r.addProperty("Items", 3, $r, "GetItems", "SetItems");',
-    '  $r.addProperty("Values", 3, rtl.char, "GetValues", "SetValues");',
-    '});',
-    '']),
-    LinesToStr([ // $mod.$main
-    '']));
-end;
-
 procedure TTestModule.TestRTTI_OverrideMethod;
 begin
   Converter.Options:=Converter.Options-[coNoTypeInfo];