diff --git a/components/chelper/cparsertypes.pas b/components/chelper/cparsertypes.pas index 2c55d92ad..371053da5 100755 --- a/components/chelper/cparsertypes.pas +++ b/components/chelper/cparsertypes.pas @@ -28,7 +28,7 @@ uses const Err_Ident = 'Identifier'; - Err_Expect = '%s, excepted, but "%s" found'; + Err_Expect = 'Token "%s" excepted, but "%s" found'; Err_BadPrecompile = 'Bad precompile directive'; type @@ -322,7 +322,7 @@ type TCustomEntityProc = function (Parent: TEntity; Parser: TTextParser): TEntity; procedure ErrorExpect(Parser: TTextParser; const Expect: AnsiString); -function ConsumeToken(Parser: TTextParser; const Token: AnsiString): Boolean; +function ConsumeToken(Parser: TTextParser; const Token: AnsiString; const comment: string = ''): Boolean; function ConsumeIdentifier(Parser: TTextParser; var Id: AnsiString): Boolean; function ParseCType(Parser: TTextParser): TEntity; @@ -424,6 +424,7 @@ end; function ErrExpectStr(const Expected, Found: AnsiString): AnsiString; begin + //todo: duplication ? Result := Format(Err_Expect, [Expected, Found]); end; @@ -1556,14 +1557,15 @@ end; procedure ErrorExpect(Parser:TTextParser;const Expect:AnsiString); begin - Parser.SetError('expected: "'+ Expect + '" but "'+Parser.Token+'" found'); + //todo: duplication ? + Parser.SetError( ErrExpectStr( Expect, Parser.Token) ); end; -function ConsumeToken(Parser:TTextParser;const Token:AnsiString):Boolean; +function ConsumeToken(Parser:TTextParser;const Token: AnsiString; const comment: string):Boolean; begin Result:=Parser.Token=Token; if Result then Parser.NextToken - else Parser.SetError('Token expected: '+Token); + else Parser.SetError( ErrExpectStr( Token, Parser.Token)+comment); end; function ConsumeIdentifier(Parser: TTextParser; var Id: AnsiString): Boolean; diff --git a/components/chelper/objcparsing.pas b/components/chelper/objcparsing.pas index 69f1d3704..a4912a442 100644 --- a/components/chelper/objcparsing.pas +++ b/components/chelper/objcparsing.pas @@ -71,6 +71,8 @@ type public scope : TObjCScope; v : TVarFuncEntity; + bits : TExpression; + isbitted : Boolean; destructor Destroy; override; end; @@ -179,6 +181,8 @@ var iv : TObjCInstVar; s : AnsiString; scope : TObjCScope; + isbitted : Boolean; + bits : TExpression; begin Result:=True; if AParser.Token<>'{' then Exit; @@ -201,10 +205,21 @@ begin AParser.NextToken; end else begin v:=TVarFuncEntity.Create(AParser.TokenPos); - if not ParseNames(AParser, v.RetType, v.Names, [';']) then Exit; + if not ParseNames(AParser, v.RetType, v.Names, [';',':']) then Exit; + + if AParser.Token=':' then begin + AParser.NextToken; + isbitted:=True; + bits:=ParseCExpr(AParser); + end else begin + isbitted:=false; + bits:=nil; + end; iv:=TObjCInstVar.Create(v.Offset); iv.v:=v; iv.scope:=scope; + iv.isbitted:=isbitted; + iv.bits:=bits; Vars.Add(iv); if AParser.Token=';' then AParser.NextToken; end; @@ -219,6 +234,7 @@ var itf : TObjCInterface; i : Integer; nm : AnsiString; + ent : TEntity; begin Result:=nil; if AParser.Token<>'@interface' then Exit; @@ -258,6 +274,14 @@ begin AParser.NextToken; end; + { todo: typedef could be found within class + while APArser.Token='typedef' do begin + ent := ParseTypeDef(APArser ); + if not Assigned(ent) then Exit; + itf.Vars.Add(ent); + end; + } + ParseInstVars(AParser, itf.Vars); end; @@ -428,6 +452,7 @@ begin if ConsumeToken(AParser,'...') then m.VarParams:=True else ErrorExpect(AParser, '...'); end; + if not ConsumeToken(AParser, ';') then Exit; Result:=m; @@ -506,6 +531,7 @@ end; destructor TObjCInstVar.Destroy; begin v.Free; + bits.Free; inherited Destroy; end;