Browse Source

* External var does not need, but allows semicolon after var type

git-svn-id: trunk@35639 -
michael 8 years ago
parent
commit
406c7caa6f

+ 6 - 5
packages/fcl-passrc/src/pparser.pp

@@ -3134,13 +3134,14 @@ begin
     Value:=nil;
     ExternalClass:=(msExternalClass in CurrentModeSwitches)
                     and (Parent is TPasClassType) ;
-    H:=H+CheckHint(Nil,Full);
-    if Full  then
-      Mods:=GetVariableModifiers(Parent,VarMods,aLibName,aExpName,ExternalClass)
-    else if ExternalClass then
+    H:=H+CheckHint(Nil,False);
+    if Full or Externalclass then
       begin
+      NextToken;
+      If Curtoken<>tkSemicolon then
+        UnGetToken;
       Mods:=GetVariableModifiers(Parent,VarMods,aLibName,aExpName,ExternalClass)  ;
-      if mods='' then
+      if (mods='') and (CurToken<>tkSemicolon) then
          NextToken;
       end
     else

+ 14 - 2
packages/fcl-passrc/tests/tcclasstype.pas

@@ -92,7 +92,8 @@ type
     procedure TestHintFieldExperimental;
     procedure TestHintFieldLibraryError;
     procedure TestHintFieldUninmplemented;
-    Procedure TestOneVarFieldExternamName;
+    Procedure TestOneVarFieldExternalName;
+    procedure TestOneVarFieldExternalNameSemicolon;
     Procedure TestMethodSimple;
     Procedure TestMethodSimpleComment;
     Procedure TestMethodWithDotFails;
@@ -783,7 +784,7 @@ begin
   AssertMemberName('unimplemented');
 end;
 
-procedure TTestClassType.TestOneVarFieldExternamName;
+procedure TTestClassType.TestOneVarFieldExternalName;
 begin
   Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msExternalClass];
   StartExternalClass('','myname','');
@@ -794,6 +795,17 @@ begin
   AssertMemberName('unimplemented');
 end;
 
+procedure TTestClassType.TestOneVarFieldExternalNameSemicolon;
+begin
+  Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msExternalClass];
+  StartExternalClass('','myname','');
+  AddMember('unimplemented: integer; external name ''uni''');
+  ParseClass;
+  AssertEquals('1 members',1,TheClass.members.Count);
+  AssertNotNull('Have field',Field1);
+  AssertMemberName('unimplemented');
+end;
+
 procedure TTestClassType.TestMethodSimple;
 begin
   AddMember('Procedure DoSomething');

+ 14 - 0
packages/fcl-passrc/tests/tcresolver.pas

@@ -344,6 +344,7 @@ type
     Procedure TestClass_Sealed;
     Procedure TestClass_SealedDescendFail;
     Procedure TestClass_VarExternal;
+    Procedure TestClass_VarExternalSemicolon;
     Procedure TestClass_External;
     // Todo: Fail to use class.method in constant or type, e.g. const p = @o.doit;
 
@@ -5362,6 +5363,19 @@ begin
   ParseProgram;
 end;
 
+procedure TTestResolver.TestClass_VarExternalSemicolon;
+begin
+  StartProgram(false);
+  Add('type');
+  Add('{$modeswitch externalclass}');
+  Add('  TObject = class');
+  Add('    Id: longint; external name ''$Id'';');
+  Add('    Data: longint; external name ''$Data'';');
+  Add('  end;');
+  Add('begin');
+  ParseProgram;
+end;
+
 procedure TTestResolver.TestClass_External;
 begin
   StartProgram(false);

+ 7 - 0
packages/fcl-passrc/tests/tcvarparser.pas

@@ -44,6 +44,7 @@ Type
     Procedure TestVarExternal;
     Procedure TestVarExternalLib;
     Procedure TestVarExternalLibName;
+    procedure TestVarExternalNoSemiColon;
     Procedure TestVarCVar;
     Procedure TestVarCVarExternal;
     Procedure TestVarPublic;
@@ -269,6 +270,12 @@ begin
   AssertEquals('Variable modifiers',[vmexternal],TheVar.VarModifiers);
 end;
 
+procedure TTestVarParser.TestVarExternalNoSemiColon;
+begin
+  ParseVar('integer external','');
+  AssertEquals('Variable modifiers',[vmexternal],TheVar.VarModifiers);
+end;
+
 procedure TTestVarParser.TestVarExternalLib;
 begin
   ParseVar('integer; external name ''mylib''','');