Browse Source

pastojs: fixed name clash published property and external

git-svn-id: trunk@40290 -
Mattias Gaertner 6 năm trước cách đây
mục cha
commit
895139f332
2 tập tin đã thay đổi với 45 bổ sung8 xóa
  1. 7 8
      packages/pastojs/src/fppas2js.pp
  2. 38 0
      packages/pastojs/tests/tcmodules.pas

+ 7 - 8
packages/pastojs/src/fppas2js.pp

@@ -1198,7 +1198,7 @@ type
     procedure OnClearHashItem(Item, Dummy: pointer);
   protected
     FOverloadScopes: TFPList; // list of TPasIdentifierScope
-    function HasOverloadIndex(El: TPasElement): boolean; virtual;
+    function HasOverloadIndex(El: TPasElement; WithElevatedLocal: boolean = false): boolean; virtual;
     function GetOverloadIndex(Identifier: TPasIdentifier;
       StopAt: TPasElement): integer;
     function GetOverloadAt(Identifier: TPasIdentifier; var Index: integer): TPasIdentifier;
@@ -2354,7 +2354,8 @@ begin
     end;
 end;
 
-function TPas2JSResolver.HasOverloadIndex(El: TPasElement): boolean;
+function TPas2JSResolver.HasOverloadIndex(El: TPasElement;
+  WithElevatedLocal: boolean): boolean;
 var
   C: TClass;
   ProcScope: TPasProcedureScope;
@@ -2364,7 +2365,7 @@ begin
     exit(false)
   else if C=TPasConst then
     begin
-    if El.Parent is TProcedureBody then
+    if (not WithElevatedLocal) and (El.Parent is TProcedureBody) then
       exit(false); // local const counted via TPas2JSSectionScope.FElevatedLocals
     end
   else if C=TPasClassType then
@@ -2400,11 +2401,8 @@ begin
     El:=Identifier.Element;
     Identifier:=Identifier.NextSameIdentifier;
     if El=StopAt then
-      begin
-      Result:=0;
-      continue;
-      end;
-    if HasOverloadIndex(El) then
+      Result:=0
+    else if HasOverloadIndex(El) then
       inc(Result);
     end;
 end;
@@ -2462,6 +2460,7 @@ var
   CurEl: TPasElement;
 begin
   Result:=0;
+  if not HasOverloadIndex(El,true) then exit;
   for i:=FOverloadScopes.Count-1 downto 0 do
     begin
     Scope:=TPasIdentifierScope(FOverloadScopes[i]);

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

@@ -520,6 +520,7 @@ type
     Procedure TestExternalClass_FunctionResultInTypeCast;
     Procedure TestExternalClass_NonExternalOverride;
     Procedure TestExternalClass_OverloadHint;
+    Procedure TestExternalClass_SameNamePublishedProperty;
     Procedure TestExternalClass_Property;
     Procedure TestExternalClass_ClassProperty;
     Procedure TestExternalClass_ClassOf;
@@ -13357,6 +13358,43 @@ begin
     '']));
 end;
 
+procedure TTestModule.TestExternalClass_SameNamePublishedProperty;
+begin
+  StartProgram(false);
+  Add([
+  '{$modeswitch externalclass}',
+  'type',
+  '  JSwiper = class external name ''Swiper''',
+  '    constructor New;',
+  '  end;',
+  '  TObject = class',
+  '  private',
+  '    FSwiper: JSwiper;',
+  '  published',
+  '    property Swiper: JSwiper read FSwiper write FSwiper;',
+  '  end;',
+  'begin',
+  '  JSwiper.new;',
+  '']);
+  ConvertProgram;
+  CheckSource('TestExternalClass_SameNamePublishedProperty',
+    LinesToStr([ // statements
+    'rtl.createClass($mod, "TObject", null, function () {',
+    '  this.$init = function () {',
+    '    this.FSwiper = null;',
+    '  };',
+    '  this.$final = function () {',
+    '    this.FSwiper = undefined;',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $r.addProperty("Swiper", 0, $mod.$rtti["JSwiper"], "FSwiper", "FSwiper");',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    'new Swiper();',
+    '']));
+end;
+
 procedure TTestModule.TestExternalClass_Property;
 begin
   StartProgram(false);