瀏覽代碼

* Generic templates can be separated by semicolon (used in fgl unit)

git-svn-id: trunk@40942 -
michael 6 年之前
父節點
當前提交
2bcc195677
共有 2 個文件被更改,包括 24 次插入1 次删除
  1. 1 1
      packages/fcl-passrc/src/pparser.pp
  2. 23 0
      packages/fcl-passrc/tests/tcgenerics.pp

+ 1 - 1
packages/fcl-passrc/src/pparser.pp

@@ -4006,7 +4006,7 @@ begin
       T.TypeConstraint:=ExpectIdentifier;
       T.TypeConstraint:=ExpectIdentifier;
       NextToken;
       NextToken;
       end;
       end;
-    if not (CurToken in [tkComma,tkGreaterThan]) then
+    if not (CurToken in [tkComma,tkSemicolon,tkGreaterThan]) then
       ParseExc(nParserExpectToken2Error,SParserExpectToken2Error,
       ParseExc(nParserExpectToken2Error,SParserExpectToken2Error,
         [TokenInfos[tkComma], TokenInfos[tkColon], TokenInfos[tkGreaterThan]]);
         [TokenInfos[tkComma], TokenInfos[tkColon], TokenInfos[tkGreaterThan]]);
   until CurToken = tkGreaterThan;
   until CurToken = tkGreaterThan;

+ 23 - 0
packages/fcl-passrc/tests/tcgenerics.pp

@@ -21,6 +21,7 @@ Type
     procedure TestDeclarationConstraint;
     procedure TestDeclarationConstraint;
     Procedure TestDeclarationDelphi;
     Procedure TestDeclarationDelphi;
     Procedure TestDeclarationDelphiSpecialize;
     Procedure TestDeclarationDelphiSpecialize;
+    procedure TestDeclarationFPC;
     Procedure TestMethodImplementation;
     Procedure TestMethodImplementation;
     Procedure TestInlineSpecializationInArgument;
     Procedure TestInlineSpecializationInArgument;
     Procedure TestSpecializeNested;
     Procedure TestSpecializeNested;
@@ -86,6 +87,28 @@ begin
   AssertSame('Parent 1 is class',T,TPasElement(T.GenericTemplateTypes[1]).Parent);
   AssertSame('Parent 1 is class',T,TPasElement(T.GenericTemplateTypes[1]).Parent);
 end;
 end;
 
 
+procedure TTestGenerics.TestDeclarationFPC;
+Var
+  T : TPasClassType;
+begin
+  Scanner.CurrentModeSwitches:=[msDelphi]+Scanner.CurrentModeSwitches ;
+  Source.Add('Type');
+  Source.Add('  TSomeClass<T;T2> = Class(TObject)');
+  Source.Add('  b : T;');
+  Source.Add('  b2 : T2;');
+  Source.Add('end;');
+  ParseDeclarations;
+  AssertNotNull('have generic definition',Declarations.Classes);
+  AssertEquals('have generic definition',1,Declarations.Classes.Count);
+  AssertEquals('Pascal class',TPasClassType,TObject(Declarations.Classes[0]).ClassType);
+  T:=TPasClassType(Declarations.Classes[0]);
+  AssertNotNull('have generic templates',T.GenericTemplateTypes);
+  AssertEquals('2 template types',2,T.GenericTemplateTypes.Count);
+  AssertSame('Parent 0 is class',T,TPasElement(T.GenericTemplateTypes[0]).Parent);
+  AssertSame('Parent 1 is class',T,TPasElement(T.GenericTemplateTypes[1]).Parent);
+end;
+
+
 procedure TTestGenerics.TestDeclarationConstraint;
 procedure TTestGenerics.TestDeclarationConstraint;
 Var
 Var
   T : TPasClassType;
   T : TPasClassType;