mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 21:49:15 +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;
|
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
|
||||||
|
@ -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');
|
||||||
|
@ -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);
|
||||||
|
@ -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''','');
|
||||||
|
Loading…
Reference in New Issue
Block a user