Browse Source

compiler: allow nested objects to refence owner class in method arguments (issue #0017986)

git-svn-id: trunk@16440 -
paul 14 years ago
parent
commit
8aef216f21
3 changed files with 35 additions and 9 deletions
  1. 1 0
      .gitattributes
  2. 14 9
      compiler/ptype.pas
  3. 20 0
      tests/webtbs/tw17986.pp

+ 1 - 0
.gitattributes

@@ -10761,6 +10761,7 @@ tests/webtbs/tw17950.pp svneol=native#text/pascal
 tests/webtbs/tw17952a.pp svneol=native#text/pascal
 tests/webtbs/tw17952a.pp svneol=native#text/pascal
 tests/webtbs/tw17952b.pp svneol=native#text/pascal
 tests/webtbs/tw17952b.pp svneol=native#text/pascal
 tests/webtbs/tw1798.pp svneol=native#text/plain
 tests/webtbs/tw1798.pp svneol=native#text/plain
+tests/webtbs/tw17986.pp svneol=native#text/pascal
 tests/webtbs/tw17998.pp svneol=native#text/plain
 tests/webtbs/tw17998.pp svneol=native#text/plain
 tests/webtbs/tw18013.pp svneol=native#text/plain
 tests/webtbs/tw18013.pp svneol=native#text/plain
 tests/webtbs/tw1820.pp svneol=native#text/plain
 tests/webtbs/tw1820.pp svneol=native#text/plain

+ 14 - 9
compiler/ptype.pas

@@ -351,6 +351,7 @@ implementation
         srsymtable : TSymtable;
         srsymtable : TSymtable;
         s,sorg : TIDString;
         s,sorg : TIDString;
         t : ttoken;
         t : ttoken;
+        objdef : tobjectdef;
       begin
       begin
          s:=pattern;
          s:=pattern;
          sorg:=orgpattern;
          sorg:=orgpattern;
@@ -358,16 +359,20 @@ implementation
          { use of current parsed object:
          { use of current parsed object:
             - classes can be used also in classes
             - classes can be used also in classes
             - objects can be parameters }
             - objects can be parameters }
-         if assigned(current_objectdef) and
-            (current_objectdef.objname^=pattern) and
-            (
-             (testcurobject=2) or
-             is_class_or_interface_or_objc(current_objectdef)
-            )then
+         objdef:=current_objectdef;
+         while Assigned(objdef) and (objdef.typ=objectdef) do
            begin
            begin
-             consume(_ID);
-             def:=current_objectdef;
-             exit;
+             if (tobjectdef(objdef).objname^=pattern) and
+                (
+                  (testcurobject=2) or
+                  is_class_or_interface_or_objc(objdef)
+                ) then
+                begin
+                  consume(_ID);
+                  def:=objdef;
+                  exit;
+                end;
+             objdef:=tobjectdef(tobjectdef(objdef).owner.defowner);
            end;
            end;
          { Use the special searchsym_type that ignores records,objects and
          { Use the special searchsym_type that ignores records,objects and
            parameters }
            parameters }

+ 20 - 0
tests/webtbs/tw17986.pp

@@ -0,0 +1,20 @@
+program tw17986;
+
+{$mode delphi}
+
+type
+  TFoo1 = class
+  public
+    type
+      TFoo2 = class
+        procedure Proc(value: TFoo1); // was error: Type "TFoo1" is not completely defined
+      end;
+  end;
+
+procedure TFoo1.TFoo2.Proc(value: TFoo1);
+begin
+end;
+
+begin
+end.
+