|
From: <na...@us...> - 2010-10-04 13:23:28
|
Revision: 930
http://instantobjects.svn.sourceforge.net/instantobjects/revision/?rev=930&view=rev
Author: nandod
Date: 2010-10-04 13:23:21 +0000 (Mon, 04 Oct 2010)
Log Message:
-----------
+ Support for class-level RTTI attributes in model files (meaning they are now ignored by the parser instead of raising Invalid class typecast exceptions).
Modified Paths:
--------------
trunk/Source/Core/InstantCode.pas
Modified: trunk/Source/Core/InstantCode.pas
===================================================================
--- trunk/Source/Core/InstantCode.pas 2010-10-01 17:57:28 UTC (rev 929)
+++ trunk/Source/Core/InstantCode.pas 2010-10-04 13:23:21 UTC (rev 930)
@@ -495,12 +495,18 @@
TInstantCodeContainerMethodFlag = (mfIndex, mfValue, mfResult);
TInstantCodeContainerMethodFlags = set of TInstantCodeContainerMethodFlag;
- TInstantCodeRttiAttribute = class(TInstantCodeMember)
+ TInstantCodeMemberRttiAttribute = class(TInstantCodeMember)
protected
class function InternalAtInstance(Reader: TInstantCodeReader; out Name: string): Boolean; override;
procedure InternalRead(Reader: TInstantCodeReader); override;
end;
+ TInstantCodeClassRttiAttribute = class(TInstantCodeType)
+ protected
+ class function InternalAtInstance(Reader: TInstantCodeReader; out Name: string): Boolean; override;
+ procedure InternalRead(Reader: TInstantCodeReader); override;
+ end;
+
TInstantCodeAttributeTailor = class(TObject)
private
FAddMethod: TInstantCodeMethod;
@@ -2865,14 +2871,14 @@
TInstantCodeField.AtInstance(Reader) or
TInstantCodeMethod.AtInstance(Reader) or
TInstantCodeProperty.AtInstance(Reader) or
- TInstantCodeRttiAttribute.AtInstance(Reader);
+ TInstantCodeMemberRttiAttribute.AtInstance(Reader);
end;
procedure TInstantCodeMembers.InternalRead(Reader: TInstantCodeReader);
begin
ReadObjects(Reader,
[TInstantCodeField, TInstantCodeMethod, TInstantCodeProperty,
- TInstantCodeRttiAttribute]);
+ TInstantCodeMemberRttiAttribute]);
end;
procedure TInstantCodeMembers.InternalWrite(Writer: TInstantCodeWriter);
@@ -3294,10 +3300,8 @@
FTypeLink.Name := Value;
end;
-{ TInstantCodeRttiAttribute }
-
-class function TInstantCodeRttiAttribute.InternalAtInstance(
- Reader: TInstantCodeReader; out Name: string): Boolean;
+function _RttiAttributeAtInstance(Reader: TInstantCodeReader;
+ out Name: string): Boolean;
begin
Result := Reader.ReadChar = '[';
if Result then
@@ -3306,13 +3310,11 @@
Name := '';
end;
-procedure TInstantCodeRttiAttribute.InternalRead(Reader: TInstantCodeReader);
+procedure _RttiAttributeRead(Reader: TInstantCodeReader);
var
BracketCount: Integer;
C: Char;
begin
- inherited;
-
BracketCount := 0;
repeat
C := Reader.ReadChar;
@@ -3323,6 +3325,33 @@
until BracketCount = 0;
end;
+{ TInstantCodeMemberRttiAttribute }
+
+class function TInstantCodeMemberRttiAttribute.InternalAtInstance(
+ Reader: TInstantCodeReader; out Name: string): Boolean;
+begin
+ Result := _RttiAttributeAtInstance(Reader, Name);
+end;
+
+procedure TInstantCodeMemberRttiAttribute.InternalRead(Reader: TInstantCodeReader);
+begin
+ _RttiAttributeRead(Reader);
+end;
+
+{ TInstantCodeClassRttiAttribute }
+
+class function TInstantCodeClassRttiAttribute.InternalAtInstance(
+ Reader: TInstantCodeReader; out Name: string): Boolean;
+begin
+ Result := _RttiAttributeAtInstance(Reader, Name);
+end;
+
+procedure TInstantCodeClassRttiAttribute.InternalRead(
+ Reader: TInstantCodeReader);
+begin
+ _RttiAttributeRead(Reader);
+end;
+
{ TInstantCodeAttributeTailor }
procedure TInstantCodeAttributeTailor.AddCountProp;
@@ -5795,7 +5824,7 @@
ReadObjects(Reader, [TInstantCodeRecord, TInstantCodeClassRef,
TInstantCodeClassForward, TInstantCodeClass, TInstantCodeInterface,
TInstantCodeDispInterface, TInstantCodeEnum, TInstantCodeSet,
- TInstantCodeTypeDef, TInstantCodeProcType, TInstantCodeRttiAttribute,
+ TInstantCodeTypeDef, TInstantCodeProcType, TInstantCodeClassRttiAttribute,
TInstantCodeUnknownType]);
end;
|