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

git-svn-id: trunk@35639 -
This commit is contained in:
michael 2017-03-22 20:31:29 +00:00
parent f7db076989
commit 406c7caa6f
4 changed files with 41 additions and 7 deletions

View File

@ -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

View File

@ -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');

View File

@ -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);

View File

@ -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''','');