mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-03 04:49:42 +01:00
* Added support for source line number information
This commit is contained in:
parent
b89a9cd777
commit
52d3dcf9f9
@ -49,12 +49,15 @@ type
|
||||
FPackage: TPasPackage;
|
||||
public
|
||||
function CreateElement(AClass: TPTreeElement; const AName: String;
|
||||
AParent: TPasElement): TPasElement;
|
||||
AParent: TPasElement; const ASourceFilename: String;
|
||||
ASourceLinenumber: Integer): TPasElement;
|
||||
function CreateElement(AClass: TPTreeElement; const AName: String;
|
||||
AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
|
||||
AParent: TPasElement; AVisibility: TPasMemberVisibility;
|
||||
const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
|
||||
virtual; abstract;
|
||||
function CreateFunctionType(const AName: String; AParent: TPasElement;
|
||||
UseParentAsResultParent: Boolean): TPasFunctionType;
|
||||
UseParentAsResultParent: Boolean; const ASourceFilename: String;
|
||||
ASourceLinenumber: Integer): TPasFunctionType;
|
||||
function FindElement(const AName: String): TPasElement; virtual; abstract;
|
||||
function FindModule(const AName: String): TPasModule; virtual;
|
||||
property Package: TPasPackage read FPackage;
|
||||
@ -99,6 +102,11 @@ type
|
||||
|
||||
function GetCurColumn: Integer;
|
||||
procedure ParseExc(const Msg: String);
|
||||
protected
|
||||
function CreateElement(AClass: TPTreeElement; const AName: String;
|
||||
AParent: TPasElement): TPasElement;
|
||||
function CreateElement(AClass: TPTreeElement; const AName: String;
|
||||
AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
|
||||
public
|
||||
constructor Create(AScanner: TPascalScanner; AFileResolver: TFileResolver;
|
||||
AEngine: TPasTreeContainer);
|
||||
@ -146,17 +154,21 @@ type
|
||||
|
||||
|
||||
function TPasTreeContainer.CreateElement(AClass: TPTreeElement;
|
||||
const AName: String; AParent: TPasElement): TPasElement;
|
||||
const AName: String; AParent: TPasElement; const ASourceFilename: String;
|
||||
ASourceLinenumber: Integer): TPasElement;
|
||||
begin
|
||||
Result := CreateElement(AClass, AName, AParent, visDefault);
|
||||
Result := CreateElement(AClass, AName, AParent, visDefault, ASourceFilename,
|
||||
ASourceLinenumber);
|
||||
end;
|
||||
|
||||
function TPasTreeContainer.CreateFunctionType(const AName: String;
|
||||
AParent: TPasElement; UseParentAsResultParent: Boolean): TPasFunctionType;
|
||||
AParent: TPasElement; UseParentAsResultParent: Boolean;
|
||||
const ASourceFilename: String; ASourceLinenumber: Integer): TPasFunctionType;
|
||||
var
|
||||
ResultParent: TPasElement;
|
||||
begin
|
||||
Result := TPasFunctionType(CreateElement(TPasFunctionType, AName, AParent));
|
||||
Result := TPasFunctionType(CreateElement(TPasFunctionType, AName, AParent,
|
||||
ASourceFilename, ASourceLinenumber));
|
||||
|
||||
if UseParentAsResultParent then
|
||||
ResultParent := AParent
|
||||
@ -164,7 +176,8 @@ begin
|
||||
ResultParent := Result;
|
||||
|
||||
TPasFunctionType(Result).ResultEl :=
|
||||
TPasResultElement(CreateElement(TPasResultElement, 'Result', ResultParent));
|
||||
TPasResultElement(CreateElement(TPasResultElement, 'Result', ResultParent,
|
||||
ASourceFilename, ASourceLinenumber));
|
||||
end;
|
||||
|
||||
function TPasTreeContainer.FindModule(const AName: String): TPasModule;
|
||||
@ -278,7 +291,7 @@ function TPasParser.ParseType(Parent: TPasElement): TPasType;
|
||||
|
||||
procedure ParseRange;
|
||||
begin
|
||||
Result := TPasRangeType(Engine.CreateElement(TPasRangeType, '', Parent));
|
||||
Result := TPasRangeType(CreateElement(TPasRangeType, '', Parent));
|
||||
try
|
||||
TPasRangeType(Result).RangeStart := ParseExpression;
|
||||
ExpectToken(tkDotDot);
|
||||
@ -326,12 +339,12 @@ begin
|
||||
Ref := Engine.FindElement(Name);
|
||||
if Assigned(Ref) then
|
||||
begin
|
||||
{Result := TPasTypeRef(Engine.CreateElement(TPasTypeRef, Name, nil));
|
||||
{Result := TPasTypeRef(CreateElement(TPasTypeRef, Name, nil));
|
||||
TPasTypeRef(Result).RefType := Ref as TPasType;}
|
||||
Result := Ref as TPasType;
|
||||
Result.AddRef;
|
||||
end else
|
||||
Result := TPasUnresolvedTypeRef(Engine.CreateElement(TPasUnresolvedTypeRef, Name, nil));
|
||||
Result := TPasUnresolvedTypeRef(CreateElement(TPasUnresolvedTypeRef, Name, nil));
|
||||
|
||||
// !!!: Doesn't make sense for resolved types
|
||||
if Name = 'String' then
|
||||
@ -349,23 +362,22 @@ begin
|
||||
end;
|
||||
tkCaret:
|
||||
begin
|
||||
Result := TPasPointerType(
|
||||
Engine.CreateElement(TPasPointerType, '', Parent));
|
||||
Result := TPasPointerType(CreateElement(TPasPointerType, '', Parent));
|
||||
TPasPointerType(Result).DestType := ParseType(nil);
|
||||
end;
|
||||
tkArray:
|
||||
begin
|
||||
Result := TPasArrayType(Engine.CreateElement(TPasArrayType, '', Parent));
|
||||
Result := TPasArrayType(CreateElement(TPasArrayType, '', Parent));
|
||||
ParseArrayType(TPasArrayType(Result));
|
||||
end;
|
||||
tkBraceOpen:
|
||||
begin
|
||||
Result := TPasEnumType(Engine.CreateElement(TPasEnumType, '', Parent));
|
||||
Result := TPasEnumType(CreateElement(TPasEnumType, '', Parent));
|
||||
while True do
|
||||
begin
|
||||
NextToken;
|
||||
EnumValue := TPasEnumValue(Engine.CreateElement(TPasEnumValue,
|
||||
CurTokenString, Result));
|
||||
EnumValue := TPasEnumValue(CreateElement(TPasEnumValue,
|
||||
CurTokenString, Result));
|
||||
TPasEnumType(Result).Values.Add(EnumValue);
|
||||
NextToken;
|
||||
if CurToken = tkBraceClose then
|
||||
@ -376,22 +388,20 @@ begin
|
||||
end;
|
||||
tkSet:
|
||||
begin
|
||||
Result := TPasSetType(
|
||||
Engine.CreateElement(TPasSetType, '', Parent));
|
||||
Result := TPasSetType(CreateElement(TPasSetType, '', Parent));
|
||||
ExpectToken(tkOf);
|
||||
TPasSetType(Result).EnumType := ParseType(Result);
|
||||
end;
|
||||
tkRecord:
|
||||
begin
|
||||
Result := TPasRecordType(
|
||||
Engine.CreateElement(TPasRecordType, '', Parent));
|
||||
Result := TPasRecordType(CreateElement(TPasRecordType, '', Parent));
|
||||
ParseRecordDecl(TPasRecordType(Result));
|
||||
UngetToken;
|
||||
end;
|
||||
tkProcedure:
|
||||
begin
|
||||
Result := TPasProcedureType(
|
||||
Engine.CreateElement(TPasProcedureType, '', Parent));
|
||||
CreateElement(TPasProcedureType, '', Parent));
|
||||
try
|
||||
ParseProcedureOrFunctionHeader(Result,
|
||||
TPasProcedureType(Result), False, True);
|
||||
@ -402,7 +412,8 @@ begin
|
||||
end;
|
||||
tkFunction:
|
||||
begin
|
||||
Result := Engine.CreateFunctionType('', Parent, False);
|
||||
Result := Engine.CreateFunctionType('', Parent, False,
|
||||
Scanner.CurFilename, Scanner.CurRow);
|
||||
try
|
||||
ParseProcedureOrFunctionHeader(Result,
|
||||
TPasFunctionType(Result), True, True);
|
||||
@ -426,15 +437,15 @@ begin
|
||||
case CurToken of
|
||||
tkProcedure:
|
||||
begin
|
||||
Result := TPasProcedureType(
|
||||
Engine.CreateElement(TPasProcedureType, '', nil));
|
||||
Result := TPasProcedureType(CreateElement(TPasProcedureType, '', nil));
|
||||
ParseProcedureOrFunctionHeader(Result,
|
||||
TPasProcedureType(Result), False, True);
|
||||
UngetToken; // Unget semicolon
|
||||
end;
|
||||
tkFunction:
|
||||
begin
|
||||
Result := Engine.CreateFunctionType('', nil, False);
|
||||
Result := Engine.CreateFunctionType('', nil, False, Scanner.CurFilename,
|
||||
Scanner.CurRow);
|
||||
ParseProcedureOrFunctionHeader(Result,
|
||||
TPasFunctionType(Result), True, True);
|
||||
UngetToken; // Unget semicolon
|
||||
@ -618,8 +629,8 @@ var
|
||||
VarEl: TPasVariable;
|
||||
begin
|
||||
Module := nil;
|
||||
Module := TPasModule(Engine.
|
||||
CreateElement(TPasModule, ExpectIdentifier, Engine.Package));
|
||||
Module := TPasModule(CreateElement(TPasModule, ExpectIdentifier,
|
||||
Engine.Package));
|
||||
if Assigned(Engine.Package) then
|
||||
begin
|
||||
Module.PackageName := Engine.Package.Name;
|
||||
@ -627,7 +638,7 @@ begin
|
||||
end;
|
||||
ExpectToken(tkSemicolon);
|
||||
ExpectToken(tkInterface);
|
||||
Section := TPasSection(Engine.CreateElement(TPasSection, '', Module));
|
||||
Section := TPasSection(CreateElement(TPasSection, '', Module));
|
||||
Module.InterfaceSection := Section;
|
||||
CurBlock := declNone;
|
||||
while True do
|
||||
@ -761,8 +772,8 @@ begin
|
||||
if Assigned(Element) then
|
||||
Element.AddRef
|
||||
else
|
||||
Element := TPasType(Engine.CreateElement(TPasUnresolvedTypeRef,
|
||||
UnitName, ASection));
|
||||
Element := TPasType(CreateElement(TPasUnresolvedTypeRef, UnitName,
|
||||
ASection));
|
||||
ASection.UsesList.Add(Element);
|
||||
|
||||
NextToken;
|
||||
@ -776,7 +787,7 @@ end;
|
||||
// Starts after the variable name
|
||||
function TPasParser.ParseConstDecl(Parent: TPasElement): TPasConst;
|
||||
begin
|
||||
Result := TPasConst(Engine.CreateElement(TPasConst, CurTokenString, Parent));
|
||||
Result := TPasConst(CreateElement(TPasConst, CurTokenString, Parent));
|
||||
|
||||
try
|
||||
NextToken;
|
||||
@ -797,8 +808,7 @@ end;
|
||||
// Starts after the variable name
|
||||
function TPasParser.ParseResourcestringDecl(Parent: TPasElement): TPasResString;
|
||||
begin
|
||||
Result := TPasResString(
|
||||
Engine.CreateElement(TPasResString, CurTokenString, Parent));
|
||||
Result := TPasResString(CreateElement(TPasResString, CurTokenString, Parent));
|
||||
try
|
||||
ExpectToken(tkEqual);
|
||||
ExpectToken(tkString);
|
||||
@ -818,7 +828,7 @@ var
|
||||
|
||||
procedure ParseRange;
|
||||
begin
|
||||
Result := TPasRangeType(Engine.CreateElement(TPasRangeType, TypeName, Parent));
|
||||
Result := TPasRangeType(CreateElement(TPasRangeType, TypeName, Parent));
|
||||
try
|
||||
TPasRangeType(Result).RangeStart := ParseExpression;
|
||||
ExpectToken(tkDotDot);
|
||||
@ -839,8 +849,8 @@ begin
|
||||
case CurToken of
|
||||
tkRecord:
|
||||
begin
|
||||
Result := TPasRecordType(
|
||||
Engine.CreateElement(TPasRecordType, TypeName, Parent));
|
||||
Result := TPasRecordType(CreateElement(TPasRecordType, TypeName,
|
||||
Parent));
|
||||
try
|
||||
ParseRecordDecl(TPasRecordType(Result));
|
||||
except
|
||||
@ -850,8 +860,8 @@ begin
|
||||
end;
|
||||
tkPacked:
|
||||
begin
|
||||
Result := TPasRecordType(
|
||||
Engine.CreateElement(TPasRecordType, TypeName, Parent));
|
||||
Result := TPasRecordType(CreateElement(TPasRecordType, TypeName,
|
||||
Parent));
|
||||
try
|
||||
TPasRecordType(Result).IsPacked := True;
|
||||
ExpectToken(tkRecord);
|
||||
@ -869,8 +879,8 @@ begin
|
||||
Result := ParseClassDecl(Parent, TypeName, okInterface);
|
||||
tkCaret:
|
||||
begin
|
||||
Result := TPasPointerType(
|
||||
Engine.CreateElement(TPasPointerType, TypeName, Parent));
|
||||
Result := TPasPointerType(CreateElement(TPasPointerType, TypeName,
|
||||
Parent));
|
||||
try
|
||||
TPasPointerType(Result).DestType := ParseType(nil);
|
||||
ExpectToken(tkSemicolon);
|
||||
@ -893,8 +903,8 @@ begin
|
||||
begin
|
||||
UngetToken;
|
||||
UngetToken;
|
||||
Result := TPasAliasType(
|
||||
Engine.CreateElement(TPasAliasType, TypeName, Parent));
|
||||
Result := TPasAliasType(CreateElement(TPasAliasType, TypeName,
|
||||
Parent));
|
||||
try
|
||||
TPasAliasType(Result).DestType := ParseType(nil);
|
||||
ExpectToken(tkSemicolon);
|
||||
@ -905,8 +915,8 @@ begin
|
||||
end else if CurToken = tkSquaredBraceOpen then
|
||||
begin
|
||||
// !!!: Check for string type and store string length somewhere
|
||||
Result := TPasAliasType(
|
||||
Engine.CreateElement(TPasAliasType, TypeName, Parent));
|
||||
Result := TPasAliasType(CreateElement(TPasAliasType, TypeName,
|
||||
Parent));
|
||||
try
|
||||
TPasAliasType(Result).DestType :=
|
||||
TPasUnresolvedTypeRef.Create(CurTokenString, Parent);
|
||||
@ -926,16 +936,14 @@ begin
|
||||
end;
|
||||
{ _STRING, _FILE:
|
||||
begin
|
||||
Result := TPasAliasType(
|
||||
Engine.CreateElement(TPasAliasType, TypeName, Parent));
|
||||
Result := TPasAliasType(CreateElement(TPasAliasType, TypeName, Parent));
|
||||
UngetToken;
|
||||
TPasAliasType(Result).DestType := ParseType(nil);
|
||||
ExpectToken(tkSemicolon);
|
||||
end;}
|
||||
tkArray:
|
||||
begin
|
||||
Result := TPasArrayType(
|
||||
Engine.CreateElement(TPasArrayType, TypeName, Parent));
|
||||
Result := TPasArrayType(CreateElement(TPasArrayType, TypeName, Parent));
|
||||
try
|
||||
ParseArrayType(TPasArrayType(Result));
|
||||
ExpectToken(tkSemicolon);
|
||||
@ -946,8 +954,7 @@ begin
|
||||
end;
|
||||
tkSet:
|
||||
begin
|
||||
Result := TPasSetType(
|
||||
Engine.CreateElement(TPasSetType, TypeName, Parent));
|
||||
Result := TPasSetType(CreateElement(TPasSetType, TypeName, Parent));
|
||||
try
|
||||
ExpectToken(tkOf);
|
||||
TPasSetType(Result).EnumType := ParseType(Result);
|
||||
@ -959,14 +966,13 @@ begin
|
||||
end;
|
||||
tkBraceOpen:
|
||||
begin
|
||||
Result := TPasEnumType(
|
||||
Engine.CreateElement(TPasEnumType, TypeName, Parent));
|
||||
Result := TPasEnumType(CreateElement(TPasEnumType, TypeName, Parent));
|
||||
try
|
||||
while True do
|
||||
begin
|
||||
NextToken;
|
||||
EnumValue := TPasEnumValue(
|
||||
Engine.CreateElement(TPasEnumValue, CurTokenString, Result));
|
||||
EnumValue := TPasEnumValue(CreateElement(TPasEnumValue,
|
||||
CurTokenString, Result));
|
||||
TPasEnumType(Result).Values.Add(EnumValue);
|
||||
NextToken;
|
||||
if CurToken = tkBraceClose then
|
||||
@ -982,8 +988,8 @@ begin
|
||||
end;
|
||||
tkProcedure:
|
||||
begin
|
||||
Result := TPasProcedureType(
|
||||
Engine.CreateElement(TPasProcedureType, TypeName, Parent));
|
||||
Result := TPasProcedureType(CreateElement(TPasProcedureType, TypeName,
|
||||
Parent));
|
||||
try
|
||||
ParseProcedureOrFunctionHeader(Result,
|
||||
TPasProcedureType(Result), False, True);
|
||||
@ -994,7 +1000,8 @@ begin
|
||||
end;
|
||||
tkFunction:
|
||||
begin
|
||||
Result := Engine.CreateFunctionType(TypeName, Parent, False);
|
||||
Result := Engine.CreateFunctionType(TypeName, Parent, False,
|
||||
Scanner.CurFilename, Scanner.CurRow);
|
||||
try
|
||||
ParseProcedureOrFunctionHeader(Result,
|
||||
TPasFunctionType(Result), True, True);
|
||||
@ -1005,8 +1012,8 @@ begin
|
||||
end;
|
||||
tkType:
|
||||
begin
|
||||
Result := TPasTypeAliasType(
|
||||
Engine.CreateElement(TPasTypeAliasType, TypeName, Parent));
|
||||
Result := TPasTypeAliasType(CreateElement(TPasTypeAliasType, TypeName,
|
||||
Parent));
|
||||
try
|
||||
TPasTypeAliasType(Result).DestType := ParseType(nil);
|
||||
ExpectToken(tkSemicolon);
|
||||
@ -1056,8 +1063,8 @@ begin
|
||||
|
||||
for i := 0 to VarNames.Count - 1 do
|
||||
begin
|
||||
VarEl := TPasVariable(
|
||||
Engine.CreateElement(TPasVariable, VarNames[i], Parent, AVisibility));
|
||||
VarEl := TPasVariable(CreateElement(TPasVariable, VarNames[i], Parent,
|
||||
AVisibility));
|
||||
VarEl.VarType := VarType;
|
||||
if i > 0 then
|
||||
VarType.AddRef;
|
||||
@ -1082,7 +1089,7 @@ var
|
||||
begin
|
||||
while True do
|
||||
begin
|
||||
List.Add(Engine.CreateElement(TPasVariable, CurTokenString, Parent));
|
||||
List.Add(CreateElement(TPasVariable, CurTokenString, Parent));
|
||||
NextToken;
|
||||
if CurToken = tkColon then
|
||||
break
|
||||
@ -1236,8 +1243,7 @@ begin
|
||||
|
||||
for i := 0 to ArgNames.Count - 1 do
|
||||
begin
|
||||
Arg := TPasArgument(
|
||||
Engine.CreateElement(TPasArgument, ArgNames[i], Parent));
|
||||
Arg := TPasArgument(CreateElement(TPasArgument, ArgNames[i], Parent));
|
||||
Arg.Access := Access;
|
||||
Arg.ArgType := ArgType;
|
||||
if (i > 0) and Assigned(ArgType) then
|
||||
@ -1338,13 +1344,14 @@ begin
|
||||
Name := ExpectIdentifier;
|
||||
if IsFunction then
|
||||
begin
|
||||
Result := TPasFunction(Engine.CreateElement(TPasFunction, Name, Parent));
|
||||
Result.ProcType := Engine.CreateFunctionType('', Result, True);
|
||||
Result := TPasFunction(CreateElement(TPasFunction, Name, Parent));
|
||||
Result.ProcType := Engine.CreateFunctionType('', Result, True,
|
||||
Scanner.CurFilename, Scanner.CurRow);
|
||||
end else
|
||||
begin
|
||||
Result := TPasProcedure(Engine.CreateElement(TPasProcedure, Name, Parent));
|
||||
Result.ProcType := TPasProcedureType(
|
||||
Engine.CreateElement(TPasProcedureType, '', Result));
|
||||
Result := TPasProcedure(CreateElement(TPasProcedure, Name, Parent));
|
||||
Result.ProcType := TPasProcedureType(CreateElement(TPasProcedureType, '',
|
||||
Result));
|
||||
end;
|
||||
|
||||
ParseProcedureOrFunctionHeader(Result, Result.ProcType, IsFunction, False);
|
||||
@ -1399,23 +1406,24 @@ var
|
||||
Owner := CheckIfOverloaded(TPasClassType(Result), CurTokenString);
|
||||
if HasReturnValue then
|
||||
begin
|
||||
Proc := TPasFunction(
|
||||
Engine.CreateElement(TPasFunction, CurTokenString, Owner, CurVisibility));
|
||||
Proc.ProcType := Engine.CreateFunctionType( '', Proc, True);
|
||||
Proc := TPasFunction(CreateElement(TPasFunction, CurTokenString, Owner,
|
||||
CurVisibility));
|
||||
Proc.ProcType := Engine.CreateFunctionType( '', Proc, True,
|
||||
Scanner.CurFilename, Scanner.CurRow);
|
||||
end else
|
||||
begin
|
||||
// !!!: The following is more than ugly
|
||||
if MethodTypeName = 'constructor' then
|
||||
Proc := TPasConstructor(
|
||||
Engine.CreateElement(TPasConstructor, CurTokenString, Owner, CurVisibility))
|
||||
Proc := TPasConstructor(CreateElement(TPasConstructor, CurTokenString,
|
||||
Owner, CurVisibility))
|
||||
else if MethodTypeName = 'destructor' then
|
||||
Proc := TPasDestructor(
|
||||
Engine.CreateElement(TPasDestructor, CurTokenString, Owner, CurVisibility))
|
||||
Proc := TPasDestructor(CreateElement(TPasDestructor, CurTokenString,
|
||||
Owner, CurVisibility))
|
||||
else
|
||||
Proc := TPasProcedure(
|
||||
Engine.CreateElement(TPasProcedure, CurTokenString, Owner, CurVisibility));
|
||||
Proc.ProcType := TPasProcedureType(
|
||||
Engine.CreateElement(TPasProcedureType, '', Proc, CurVisibility));
|
||||
Proc := TPasProcedure(CreateElement(TPasProcedure, CurTokenString,
|
||||
Owner, CurVisibility));
|
||||
Proc.ProcType := TPasProcedureType(CreateElement(TPasProcedureType, '',
|
||||
Proc, CurVisibility));
|
||||
end;
|
||||
if Owner.ClassType = TPasOverloadedProc then
|
||||
TPasOverloadedProc(Owner).Overloads.Add(Proc)
|
||||
@ -1483,18 +1491,21 @@ var
|
||||
end;
|
||||
|
||||
var
|
||||
s: String;
|
||||
i: Integer;
|
||||
s, SourceFilename: String;
|
||||
i, SourceLinenumber: Integer;
|
||||
VarList: TList;
|
||||
Element: TPasElement;
|
||||
begin
|
||||
// Save current parsing position to get it correct in all cases
|
||||
SourceFilename := Scanner.CurFilename;
|
||||
SourceLinenumber := Scanner.CurRow;
|
||||
|
||||
NextToken;
|
||||
|
||||
if (AObjKind = okClass) and (CurToken = tkOf) then
|
||||
begin
|
||||
Result := TPasClassOfType(
|
||||
Engine.CreateElement(TPasClassOfType, AClassName, Parent));
|
||||
Result := TPasClassOfType(Engine.CreateElement(TPasClassOfType, AClassName,
|
||||
Parent, SourceFilename, SourceLinenumber));
|
||||
ExpectIdentifier;
|
||||
UngetToken; // Only names are allowed as following type
|
||||
TPasClassOfType(Result).DestType := ParseType(Result);
|
||||
@ -1503,8 +1514,8 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
Result := TPasClassType(
|
||||
Engine.CreateElement(TPasClassType, AClassName, Parent));
|
||||
Result := TPasClassType(Engine.CreateElement(TPasClassType, AClassName,
|
||||
Parent, SourceFilename, SourceLinenumber));
|
||||
|
||||
try
|
||||
TPasClassType(Result).ObjKind := AObjKind;
|
||||
@ -1572,8 +1583,8 @@ begin
|
||||
tkProperty:
|
||||
begin
|
||||
ExpectIdentifier;
|
||||
Element := Engine.CreateElement(TPasProperty,
|
||||
CurTokenString, Result, CurVisibility);
|
||||
Element := CreateElement(TPasProperty, CurTokenString, Result,
|
||||
CurVisibility);
|
||||
TPasClassType(Result).Members.Add(Element);
|
||||
NextToken;
|
||||
// !!!: Parse array properties correctly
|
||||
@ -1684,6 +1695,20 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPasParser.CreateElement(AClass: TPTreeElement; const AName: String;
|
||||
AParent: TPasElement): TPasElement;
|
||||
begin
|
||||
Result := Engine.CreateElement(AClass, AName, AParent,
|
||||
Scanner.CurFilename, Scanner.CurRow);
|
||||
end;
|
||||
|
||||
function TPasParser.CreateElement(AClass: TPTreeElement; const AName: String;
|
||||
AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
|
||||
begin
|
||||
Result := Engine.CreateElement(AClass, AName, AParent, AVisibility,
|
||||
Scanner.CurFilename, Scanner.CurRow);
|
||||
end;
|
||||
|
||||
|
||||
function ParseSource(AEngine: TPasTreeContainer;
|
||||
const FPCCommandLine, OSTarget, CPUTarget: String): TPasModule;
|
||||
@ -1787,7 +1812,10 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.3 2003-06-24 12:59:07 michael
|
||||
Revision 1.4 2003-11-22 12:14:14 sg
|
||||
* Added support for source line number information
|
||||
|
||||
Revision 1.3 2003/06/24 12:59:07 michael
|
||||
+ Patches from Matthias Gaertner to fix parsing of LCL
|
||||
|
||||
Revision 1.2 2003/03/27 16:32:48 sg
|
||||
|
||||
Loading…
Reference in New Issue
Block a user