idl/inc/parser.hxx | 9 + idl/inc/slot.hxx | 2 idl/source/objects/bastype.cxx | 19 +-- idl/source/prj/parser.cxx | 207 +++++++++++++++++++++++++++++++++-------- 4 files changed, 182 insertions(+), 55 deletions(-)
New commits: commit 3e53c6ba9313dae334c0b4db78c911fa960a9fe2 Author: Noel Grandin <[email protected]> Date: Fri Mar 11 14:05:30 2016 +0200 move the attribute parsing code to SvParser and simplify considerably Change-Id: I2a4af15e77904b62abc81dad78a2990e2eab05f0 diff --git a/idl/inc/parser.hxx b/idl/inc/parser.hxx index d4d6abb..cc2696b 100644 --- a/idl/inc/parser.hxx +++ b/idl/inc/parser.hxx @@ -30,6 +30,7 @@ class SvMetaTypeEnum; class SvStringHashEntry; class SvMetaType; class SvMetaClass; +class SvBOOL; class SvIdlParser { @@ -44,16 +45,19 @@ public: void ReadInclude( SvMetaModule& rModule ); void ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMetaTypeType ); void ReadInterfaceOrShellEntry( SvMetaClass& rClass ); - bool ReadInterfaceOrShellSlot( SvMetaSlot& rSlot ); + bool ReadSlot( SvMetaSlot& rSlot ); void ReadInterfaceOrShellMethod( SvMetaAttribute& rAttr ); void ReadItem(); void ReadStruct(); void ReadEnum(); void ReadEnumValue( SvMetaTypeEnum& rEnum ); void ReadSlotId(SvIdentifier& rSlotId); + void ReadSlotAttribute( SvMetaSlot& rSlot ); SvMetaClass* ReadKnownClass(); SvMetaType* ReadKnownType(); void Read(char cChar); + bool ReadIfBoolAttribute( SvBOOL&, SvStringHashEntry* pName); + bool ReadIfIdAttribute( SvIdentifier& rIdentifier, SvStringHashEntry* pName ); bool ReadIf(char cChar); void ReadDelimiter(); bool ReadIfDelimiter(); diff --git a/idl/inc/slot.hxx b/idl/inc/slot.hxx index 93f127d..bb80784 100644 --- a/idl/inc/slot.hxx +++ b/idl/inc/slot.hxx @@ -25,6 +25,7 @@ class SvMetaSlot : public SvMetaAttribute { +public: tools::SvRef<SvMetaType> aSlotType; tools::SvRef<SvMetaSlot> aMethod; SvIdentifier aGroupId; @@ -69,7 +70,6 @@ class SvMetaSlot : public SvMetaAttribute bool IsVariable() const; bool IsMethod() const; -protected: void SetToggle( bool bSet ) { aToggle = bSet; } void SetAutoUpdate( bool bSet ) { aAutoUpdate = bSet; } void SetAsynchron( bool bSet ) { aAsynchron = bSet; } diff --git a/idl/source/objects/bastype.cxx b/idl/source/objects/bastype.cxx index 08c59f9..adff4d5 100644 --- a/idl/source/objects/bastype.cxx +++ b/idl/source/objects/bastype.cxx @@ -35,24 +35,17 @@ bool SvBOOL::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm ) if( rTok.Is( pName ) ) { - bool bOk = true; - bool bBracket = rInStm.ReadIf( '(' ); - if( bBracket || rInStm.ReadIf( '=' ) ) + if( rInStm.ReadIf( '=' ) ) { rTok = rInStm.GetToken(); - if( rTok.IsBool() ) - { - *this = rTok.GetBool(); - - rInStm.GetToken_Next(); - } - if( bOk && bBracket ) - bOk = rInStm.ReadIf( ')' ); + if( !rTok.IsBool() ) + throw SvParseException(rInStm, "xxx"); + *this = rTok.GetBool(); + rInStm.GetToken_Next(); } else *this = true; //default action set to TRUE - if( bOk ) - return true; + return true; } rInStm.Seek( nTokPos ); return false; diff --git a/idl/source/prj/parser.cxx b/idl/source/prj/parser.cxx index 1438bec..849bf4c 100644 --- a/idl/source/prj/parser.cxx +++ b/idl/source/prj/parser.cxx @@ -114,7 +114,7 @@ void SvIdlParser::ReadModuleElement( SvMetaModule& rModule ) { tools::SvRef<SvMetaSlot> xSlot( new SvMetaSlot() ); - if( xSlot->ReadSvIdl( rBase, rInStm ) ) + if (ReadSlot(*xSlot)) { if( xSlot->Test( rInStm ) ) { @@ -311,7 +311,7 @@ void SvIdlParser::ReadInterfaceOrShellEntry(SvMetaClass& rClass) if( !pType || pType->IsItem() ) { xAttr = new SvMetaSlot( pType ); - bOk = ReadInterfaceOrShellSlot(static_cast<SvMetaSlot&>(*xAttr)); + bOk = ReadSlot(static_cast<SvMetaSlot&>(*xAttr)); } else { @@ -332,7 +332,7 @@ void SvIdlParser::ReadInterfaceOrShellEntry(SvMetaClass& rClass) } } -bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot) +bool SvIdlParser::ReadSlot(SvMetaSlot& rSlot) { sal_uInt32 nTokPos = rInStm.Tell(); bool bOk = true; @@ -351,7 +351,7 @@ bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot) while( nBeginPos != rInStm.Tell() ) { nBeginPos = rInStm.Tell(); - rSlot.ReadAttributesSvIdl( rBase, rInStm ); + ReadSlotAttribute(rSlot); ReadIfDelimiter(); } Read( ']' ); @@ -379,6 +379,98 @@ bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot) return bOk; } +void SvIdlParser::ReadSlotAttribute( SvMetaSlot& rSlot ) +{ + bool bOk = false; + bOk |= ReadIfBoolAttribute(rSlot.aPseudoSlots, SvHash_PseudoSlots() ); + bOk |= ReadIfIdAttribute(rSlot.aGroupId, SvHash_GroupId() ); + bOk |= ReadIfIdAttribute(rSlot.aExecMethod, SvHash_ExecMethod() ); + bOk |= ReadIfIdAttribute(rSlot.aStateMethod, SvHash_StateMethod() ); + bOk |= ReadStringSvIdl( SvHash_DisableFlags(), rInStm, rSlot.aDisableFlags ); + bOk |= ReadIfBoolAttribute(rSlot.aReadOnlyDoc, SvHash_ReadOnlyDoc() ); + bOk |= ReadIfBoolAttribute(rSlot.aExport, SvHash_Export() ); + + bOk |= ReadIfBoolAttribute(rSlot.aToggle, SvHash_Toggle() ); + bOk |= ReadIfBoolAttribute(rSlot.aAutoUpdate, SvHash_AutoUpdate() ); + bOk |= ReadIfBoolAttribute(rSlot.aAsynchron, SvHash_Asynchron() ); + bOk |= ReadIfBoolAttribute(rSlot.aRecordAbsolute, SvHash_RecordAbsolute() ); + + if( ReadIfBoolAttribute(rSlot.aRecordPerItem, SvHash_RecordPerItem()) ) + { + if (rSlot.aRecordPerSet.IsSet() || rSlot.aNoRecord.IsSet()) + throw SvParseException(rInStm, "conflicting attributes"); + rSlot.SetRecordPerItem( rSlot.aRecordPerItem ); + bOk = true; + } + if( ReadIfBoolAttribute(rSlot.aRecordPerSet, SvHash_RecordPerSet() ) ) + { + if (rSlot.aRecordPerItem.IsSet() || rSlot.aNoRecord.IsSet()) + throw SvParseException(rInStm, "conflicting attributes"); + rSlot.SetRecordPerSet( rSlot.aRecordPerSet ); + bOk = true; + } + if( ReadIfBoolAttribute(rSlot.aNoRecord, SvHash_NoRecord() ) ) + { + if (rSlot.aRecordPerItem.IsSet() || rSlot.aRecordPerSet.IsSet()) + throw SvParseException(rInStm, "conflicting attributes"); + rSlot.SetNoRecord( rSlot.aNoRecord ); + bOk = true; + } + + bOk |= ReadIfIdAttribute(rSlot.aPseudoPrefix, SvHash_PseudoPrefix() ); + bOk |= ReadIfBoolAttribute(rSlot.aMenuConfig, SvHash_MenuConfig() ); + bOk |= ReadIfBoolAttribute(rSlot.aToolBoxConfig, SvHash_ToolBoxConfig() ); + bOk |= ReadIfBoolAttribute(rSlot.aAccelConfig, SvHash_AccelConfig() ); + + bOk |= ReadIfBoolAttribute(rSlot.aFastCall, SvHash_FastCall() ); + bOk |= ReadIfBoolAttribute(rSlot.aContainer, SvHash_Container() ); + bOk |= ReadIfBoolAttribute(rSlot.aImageRotation, SvHash_ImageRotation() ); + bOk |= ReadIfBoolAttribute(rSlot.aImageReflection, SvHash_ImageReflection() ); + + if( bOk ) + return; + + if( !rSlot.aSlotType.Is() ) + { + sal_uInt32 nTokPos = rInStm.Tell(); + SvToken& rTok = rInStm.GetToken_Next(); + if( rTok.Is( SvHash_SlotType() ) ) + { + if( rInStm.ReadIf( '=' ) ) + { + rSlot.aSlotType = rBase.ReadKnownType( rInStm ); + if( !rSlot.aSlotType.Is() ) + throw SvParseException( rInStm, "SlotType with unknown item type" ); + if( !rSlot.aSlotType->IsItem() ) + throw SvParseException( rInStm, "the SlotType is not a item" ); + return; + } + } + rInStm.Seek( nTokPos ); + + } + if( !rSlot.aMethod.Is() ) + { + SvToken& rTok = rInStm.GetToken(); + if( rTok.IsIdentifier() ) + { + rSlot.aMethod = new SvMetaSlot(); + sal_uInt32 nTokPos = rInStm.Tell(); + if( rSlot.aMethod->ReadSvIdl( rBase, rInStm ) ) + { + if( rSlot.aMethod->IsMethod() ) + { + rSlot.aMethod->SetSlotId( rSlot.GetSlotId() ); + if( rSlot.aMethod->Test( rInStm ) ) + return; + } + rInStm.Seek( nTokPos ); + } + rSlot.aMethod.Clear(); + } + } +} + void SvIdlParser::ReadInterfaceOrShellMethod( SvMetaAttribute& rAttr ) { rAttr.SetName( ReadIdentifier() ); @@ -435,6 +527,49 @@ SvMetaType * SvIdlParser::ReadKnownType() throw SvParseException( rInStm, "wrong typedef: "); } +bool SvIdlParser::ReadIfBoolAttribute( SvBOOL& rBool, SvStringHashEntry * pName ) +{ + sal_uInt32 nTokPos = rInStm.Tell(); + SvToken& rTok = rInStm.GetToken_Next(); + + if( rTok.Is( pName ) ) + { + if( rInStm.ReadIf( '=' ) ) + { + rTok = rInStm.GetToken(); + if( !rTok.IsBool() ) + throw SvParseException(rInStm, "xxx"); + rBool = rTok.GetBool(); + rInStm.GetToken_Next(); + } + else + rBool = true; //default action set to TRUE + return true; + } + rInStm.Seek( nTokPos ); + return false; +} + +bool SvIdlParser::ReadIfIdAttribute( SvIdentifier& rIdentifier, SvStringHashEntry * pName ) +{ + sal_uInt32 nTokPos = rInStm.Tell(); + SvToken& rTok = rInStm.GetToken_Next(); + + if( rTok.Is( pName ) ) + { + if( rInStm.ReadIf( '=' ) ) + { + rTok = rInStm.GetToken(); + if( !rTok.IsIdentifier() ) + throw SvParseException(rInStm, "expected identifier"); + rIdentifier.setString(rTok.GetString()); + rInStm.GetToken_Next(); + } + return true; + } + rInStm.Seek( nTokPos ); + return false; +} void SvIdlParser::ReadDelimiter() { commit 5a39ad3b259a20fa1c78e34ca9146dcec7fe90b0 Author: Noel Grandin <[email protected]> Date: Fri Mar 11 10:38:44 2016 +0200 move the method param parsing code into SvParser Change-Id: I5718c309acd213f94e96efc2e9a98ab0344fe341 diff --git a/idl/inc/parser.hxx b/idl/inc/parser.hxx index 7f6186c..d4d6abb 100644 --- a/idl/inc/parser.hxx +++ b/idl/inc/parser.hxx @@ -45,11 +45,12 @@ public: void ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMetaTypeType ); void ReadInterfaceOrShellEntry( SvMetaClass& rClass ); bool ReadInterfaceOrShellSlot( SvMetaSlot& rSlot ); - void ReadInterfaceOrShellMethodOrAttribute( SvMetaAttribute& rAttr ); + void ReadInterfaceOrShellMethod( SvMetaAttribute& rAttr ); void ReadItem(); void ReadStruct(); void ReadEnum(); void ReadEnumValue( SvMetaTypeEnum& rEnum ); + void ReadSlotId(SvIdentifier& rSlotId); SvMetaClass* ReadKnownClass(); SvMetaType* ReadKnownType(); void Read(char cChar); diff --git a/idl/source/prj/parser.cxx b/idl/source/prj/parser.cxx index a71e367..1438bec 100644 --- a/idl/source/prj/parser.cxx +++ b/idl/source/prj/parser.cxx @@ -316,7 +316,7 @@ void SvIdlParser::ReadInterfaceOrShellEntry(SvMetaClass& rClass) else { xAttr = new SvMetaAttribute( pType ); - ReadInterfaceOrShellMethodOrAttribute(*xAttr); + ReadInterfaceOrShellMethod(*xAttr); bOk = true; } if( bOk ) @@ -354,7 +354,7 @@ bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot) rSlot.ReadAttributesSvIdl( rBase, rInStm ); ReadIfDelimiter(); } - bOk = ReadIf( ']' ); + Read( ']' ); } } else @@ -379,17 +379,13 @@ bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot) return bOk; } -void SvIdlParser::ReadInterfaceOrShellMethodOrAttribute( SvMetaAttribute& rAttr ) +void SvIdlParser::ReadInterfaceOrShellMethod( SvMetaAttribute& rAttr ) { rAttr.SetName( ReadIdentifier() ); - rAttr.aSlotId.setString( ReadIdentifier() ); - sal_uLong n; - if( !rBase.FindId( rAttr.aSlotId.getString(), &n ) ) - throw SvParseException( rInStm, "no value for identifier <" + rAttr.aSlotId.getString() + "> " ); - rAttr.aSlotId.SetValue(n); + ReadSlotId( rAttr.aSlotId ); - Read( '(' ); // read method arguments + Read( '(' ); tools::SvRef<SvMetaType> xT(new SvMetaType() ); xT->SetRef(rAttr.GetType() ); rAttr.aType = xT; @@ -398,12 +394,11 @@ void SvIdlParser::ReadInterfaceOrShellMethodOrAttribute( SvMetaAttribute& rAttr { while (true) { - tools::SvRef<SvMetaAttribute> xAttr( new SvMetaAttribute() ); - if( !xAttr->ReadSvIdl( rBase, rInStm ) ) - throw SvParseException(rInStm, "ReadSvIdl in method argument parsing failed"); - if( !xAttr->Test( rInStm ) ) - throw SvParseException(rInStm, "test in method argument parsing failed"); - rAttr.aType->GetAttrList().push_back( xAttr ); + tools::SvRef<SvMetaAttribute> xParamAttr( new SvMetaAttribute() ); + xParamAttr->aType = ReadKnownType(); + xParamAttr->SetName( ReadIdentifier() ); + ReadSlotId(xParamAttr->aSlotId); + rAttr.aType->GetAttrList().push_back( xParamAttr ); if (!ReadIfDelimiter()) break; } @@ -411,6 +406,15 @@ void SvIdlParser::ReadInterfaceOrShellMethodOrAttribute( SvMetaAttribute& rAttr } } +void SvIdlParser::ReadSlotId(SvIdentifier& rSlotId) +{ + rSlotId.setString( ReadIdentifier() ); + sal_uLong n; + if( !rBase.FindId( rSlotId.getString(), &n ) ) + throw SvParseException( rInStm, "no value for identifier <" + rSlotId.getString() + "> " ); + rSlotId.SetValue(n); +} + SvMetaClass * SvIdlParser::ReadKnownClass() { OString aName(ReadIdentifier()); @@ -470,9 +474,8 @@ OString SvIdlParser::ReadString() void SvIdlParser::Read(char cChar) { - if( !(rInStm.GetToken().IsChar() && rInStm.GetToken().GetChar() == cChar ) ) + if( !ReadIf(cChar) ) throw SvParseException(rInStm, "expected char '" + OString(cChar) + "'"); - rInStm.GetToken_Next(); } bool SvIdlParser::ReadIf(char cChar) commit dc1df1b8f92b873b0776bff4ca3da79af05392ba Author: Noel Grandin <[email protected]> Date: Tue Jun 21 14:13:53 2016 +0200 simplify parser Change-Id: If6b9ed2a0cb373c8bec5d3ff20488f5ee00231ff diff --git a/idl/source/prj/parser.cxx b/idl/source/prj/parser.cxx index cb2cd8b..a71e367 100644 --- a/idl/source/prj/parser.cxx +++ b/idl/source/prj/parser.cxx @@ -182,10 +182,8 @@ void SvIdlParser::ReadStruct() xStruct->SetType( MetaTypeType::Struct ); xStruct->SetName( ReadIdentifier() ); Read( '{' ); - sal_uInt32 nBeginPos = 0; // can not happen with Tell - while( nBeginPos != rInStm.Tell() ) + while( true ) { - nBeginPos = rInStm.Tell(); tools::SvRef<SvMetaAttribute> xAttr( new SvMetaAttribute() ); xAttr->aType = ReadKnownType(); xAttr->SetName(ReadIdentifier()); @@ -293,25 +291,20 @@ void SvIdlParser::ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMet void SvIdlParser::ReadInterfaceOrShellEntry(SvMetaClass& rClass) { - sal_uInt32 nTokPos = rInStm.Tell(); - SvToken& rTok = rInStm.GetToken_Next(); - - if( rTok.Is( SvHash_import() ) ) + if( ReadIf( SvHash_import() ) ) { SvMetaClass * pClass = ReadKnownClass(); SvClassElement aEle(pClass); - rTok = rInStm.GetToken(); + SvToken& rTok = rInStm.GetToken(); if( rTok.IsString() ) { aEle.SetPrefix( rTok.GetString() ); rInStm.GetToken_Next(); } rClass.aClassElementList.push_back( aEle ); - return; } else { - rInStm.Seek( nTokPos ); SvMetaType * pType = rBase.ReadKnownType( rInStm ); tools::SvRef<SvMetaAttribute> xAttr; bool bOk = false; @@ -335,10 +328,8 @@ void SvIdlParser::ReadInterfaceOrShellEntry(SvMetaClass& rClass) if( !xAttr->GetSlotId().IsSet() ) xAttr->SetSlotId( SvIdentifier(rBase.GetUniqueId()) ); rClass.aAttrList.push_back( xAttr ); - return; } } - rInStm.Seek( nTokPos ); } bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot) @@ -402,20 +393,22 @@ void SvIdlParser::ReadInterfaceOrShellMethodOrAttribute( SvMetaAttribute& rAttr tools::SvRef<SvMetaType> xT(new SvMetaType() ); xT->SetRef(rAttr.GetType() ); rAttr.aType = xT; - sal_uInt32 nBeginPos = 0; // can not happen with Tell - while( nBeginPos != rInStm.Tell() ) + rAttr.aType->SetType( MetaTypeType::Method ); + if (!ReadIf(')')) { - nBeginPos = rInStm.Tell(); - tools::SvRef<SvMetaAttribute> xAttr( new SvMetaAttribute() ); - if( xAttr->ReadSvIdl( rBase, rInStm ) ) + while (true) { - if( xAttr->Test( rInStm ) ) - rAttr.aType->GetAttrList().push_back( xAttr ); + tools::SvRef<SvMetaAttribute> xAttr( new SvMetaAttribute() ); + if( !xAttr->ReadSvIdl( rBase, rInStm ) ) + throw SvParseException(rInStm, "ReadSvIdl in method argument parsing failed"); + if( !xAttr->Test( rInStm ) ) + throw SvParseException(rInStm, "test in method argument parsing failed"); + rAttr.aType->GetAttrList().push_back( xAttr ); + if (!ReadIfDelimiter()) + break; } - ReadIfDelimiter(); + Read(')'); } - Read( ')' ); - rAttr.aType->SetType( MetaTypeType::Method ); } SvMetaClass * SvIdlParser::ReadKnownClass() @@ -433,9 +426,7 @@ SvMetaType * SvIdlParser::ReadKnownType() for( const auto& aType : rBase.GetTypeList() ) { if( aType->GetName() == aName ) - { return aType; - } } throw SvParseException( rInStm, "wrong typedef: "); } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
