mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 12:49:33 +02:00
* External var does not need, but allows semicolon after var type
git-svn-id: trunk@35639 -
This commit is contained in:
parent
f7db076989
commit
406c7caa6f
@ -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
|
||||
|
@ -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');
|
||||
|
@ -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);
|
||||
|
@ -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''','');
|
||||
|
Loading…
Reference in New Issue
Block a user