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

View File

@ -92,7 +92,8 @@ type
procedure TestHintFieldExperimental; procedure TestHintFieldExperimental;
procedure TestHintFieldLibraryError; procedure TestHintFieldLibraryError;
procedure TestHintFieldUninmplemented; procedure TestHintFieldUninmplemented;
Procedure TestOneVarFieldExternamName; Procedure TestOneVarFieldExternalName;
procedure TestOneVarFieldExternalNameSemicolon;
Procedure TestMethodSimple; Procedure TestMethodSimple;
Procedure TestMethodSimpleComment; Procedure TestMethodSimpleComment;
Procedure TestMethodWithDotFails; Procedure TestMethodWithDotFails;
@ -783,7 +784,7 @@ begin
AssertMemberName('unimplemented'); AssertMemberName('unimplemented');
end; end;
procedure TTestClassType.TestOneVarFieldExternamName; procedure TTestClassType.TestOneVarFieldExternalName;
begin begin
Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msExternalClass]; Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msExternalClass];
StartExternalClass('','myname',''); StartExternalClass('','myname','');
@ -794,6 +795,17 @@ begin
AssertMemberName('unimplemented'); AssertMemberName('unimplemented');
end; 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; procedure TTestClassType.TestMethodSimple;
begin begin
AddMember('Procedure DoSomething'); AddMember('Procedure DoSomething');

View File

@ -344,6 +344,7 @@ type
Procedure TestClass_Sealed; Procedure TestClass_Sealed;
Procedure TestClass_SealedDescendFail; Procedure TestClass_SealedDescendFail;
Procedure TestClass_VarExternal; Procedure TestClass_VarExternal;
Procedure TestClass_VarExternalSemicolon;
Procedure TestClass_External; Procedure TestClass_External;
// Todo: Fail to use class.method in constant or type, e.g. const p = @o.doit; // Todo: Fail to use class.method in constant or type, e.g. const p = @o.doit;
@ -5362,6 +5363,19 @@ begin
ParseProgram; ParseProgram;
end; 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; procedure TTestResolver.TestClass_External;
begin begin
StartProgram(false); StartProgram(false);

View File

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