[Libreoffice-commits] core.git: 4 commits - idl/inc idl/source
Noel Grandin
noel at peralex.com
Mon Feb 15 13:47:58 UTC 2016
idl/inc/object.hxx | 10 -
idl/inc/parser.hxx | 18 +-
idl/inc/types.hxx | 8
idl/source/objects/object.cxx | 28 ---
idl/source/objects/types.cxx | 30 ---
idl/source/prj/command.cxx | 3
idl/source/prj/database.cxx | 25 --
idl/source/prj/parser.cxx | 358 ++++++++++++++++++++++++------------------
8 files changed, 234 insertions(+), 246 deletions(-)
New commits:
commit 645394f02334548d6158187308cffd65b0b4ec77
Author: Noel Grandin <noel at peralex.com>
Date: Mon Feb 15 15:36:14 2016 +0200
cid#1352218 and cid#1352216 in .SDI parser
Change-Id: I273d80b4e9fb45955c5496cf5559df5dd4b057b0
diff --git a/idl/inc/parser.hxx b/idl/inc/parser.hxx
index ccd2f64..2258369 100644
--- a/idl/inc/parser.hxx
+++ b/idl/inc/parser.hxx
@@ -36,9 +36,9 @@ class SvIdlParser
SvTokenStream & rInStm;
public:
SvIdlParser( SvIdlDataBase& rBase_, SvTokenStream & rInStrm_) : rBase(rBase_), rInStm(rInStrm_) {}
- bool ReadSvIdl( bool bImported, const OUString & rPath );
- bool ReadModuleHeader(SvMetaModule& rModule);
- bool ReadModuleBody(SvMetaModule& rModule);
+ void ReadSvIdl( bool bImported, const OUString & rPath );
+ void ReadModuleHeader(SvMetaModule& rModule);
+ void ReadModuleBody(SvMetaModule& rModule);
void ReadModuleElement( SvMetaModule& rModule );
void ReadInclude( SvMetaModule& rModule );
void ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMetaTypeType );
diff --git a/idl/source/prj/command.cxx b/idl/source/prj/command.cxx
index 3b44679..c12c1e7 100644
--- a/idl/source/prj/command.cxx
+++ b/idl/source/prj/command.cxx
@@ -126,8 +126,7 @@ bool ReadIdl( SvIdlWorkingBase * pDataBase, const SvCommand & rCommand )
SvTokenStream aTokStm( aFileName );
try {
SvIdlParser aParser(*pDataBase, aTokStm);
- if( !aParser.ReadSvIdl( false, rCommand.aPath ) )
- return false;
+ aParser.ReadSvIdl( false, rCommand.aPath );
} catch (const SvParseException& ex) {
pDataBase->SetError(ex.aError);
pDataBase->WriteError(aTokStm);
diff --git a/idl/source/prj/parser.cxx b/idl/source/prj/parser.cxx
index cdd80df..8f368b4 100644
--- a/idl/source/prj/parser.cxx
+++ b/idl/source/prj/parser.cxx
@@ -26,63 +26,38 @@
#include <globals.hxx>
#include <osl/file.hxx>
-bool SvIdlParser::ReadSvIdl( bool bImported, const OUString & rPath )
+void SvIdlParser::ReadSvIdl( bool bImported, const OUString & rPath )
{
rBase.SetPath(rPath); // only valid for this iteration
- bool bOk = true;
SvToken& rTok = rInStm.GetToken();
- while( bOk )
+ while( true )
{
rTok = rInStm.GetToken();
if( rTok.IsEof() )
- return true;
+ return;
if( rTok.Is( SvHash_module() ) )
{
tools::SvRef<SvMetaModule> aModule = new SvMetaModule( bImported );
- if( ReadModuleHeader(*aModule) )
- rBase.GetModuleList().push_back( aModule );
- else
- bOk = false;
+ ReadModuleHeader(*aModule);
+ rBase.GetModuleList().push_back( aModule );
}
- else
- bOk = false;
- }
- if( !bOk || !rTok.IsEof() )
- {
- // error treatment
- rBase.WriteError( rInStm );
- return false;
}
- return true;
}
-bool SvIdlParser::ReadModuleHeader(SvMetaModule& rModule)
+void SvIdlParser::ReadModuleHeader(SvMetaModule& rModule)
{
- sal_uInt32 nTokPos = rInStm.Tell();
- SvToken& rTok = rInStm.GetToken_Next();
- bool bOk = true;
-
- rTok = rInStm.GetToken_Next();
- if( !rTok.IsIdentifier() )
- {
- rInStm.Seek( nTokPos );
- return false;
- }
+ rInStm.GetToken_Next();
+ OString aName = ReadIdentifier();
rBase.Push( &rModule ); // onto the context stack
- rModule.SetName( rTok.GetString() );
- bOk = ReadModuleBody(rModule);
+ rModule.SetName( aName );
+ ReadModuleBody(rModule);
rBase.GetStack().pop_back(); // remove from stack
- if( !bOk )
- rInStm.Seek( nTokPos );
- return bOk;
}
-bool SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
+void SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
{
- sal_uInt32 nTokPos = rInStm.Tell();
- bool bOk = true;
if( rInStm.ReadIf( '[' ) )
{
while( true )
@@ -100,7 +75,7 @@ bool SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
}
if( !rInStm.ReadIf( '{' ) )
- return bOk;
+ return;
sal_uInt32 nBeginPos = 0;
while( nBeginPos != rInStm.Tell() )
@@ -110,10 +85,6 @@ bool SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
rInStm.ReadIfDelimiter();
}
ReadChar( '}' );
-
- if( !bOk )
- rInStm.Seek( nTokPos );
- return bOk;
}
void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
commit f7520bbc80b571a15adca5279cc7fc5e8965e53c
Author: Noel Grandin <noel at peralex.com>
Date: Mon Feb 15 14:22:36 2016 +0200
move interface/shell parsing to SvIdlParser
Change-Id: I95cce21c6c9beb5637dd4f4a769f455eaacbec2b
diff --git a/idl/inc/object.hxx b/idl/inc/object.hxx
index 3967fa9..12f5af2 100644
--- a/idl/inc/object.hxx
+++ b/idl/inc/object.hxx
@@ -48,9 +48,11 @@ public:
class SvMetaClass : public SvMetaType
{
+public:
+ tools::SvRef<SvMetaClass> aSuperClass;
+private:
SvRefMemberList<SvMetaAttribute *> aAttrList;
std::vector<SvClassElement> aClassElementList;
- tools::SvRef<SvMetaClass> aSuperClass;
bool TestAttribute( SvIdlDataBase & rBase, SvTokenStream & rInStm,
SvMetaAttribute & rAttr ) const;
@@ -70,15 +72,13 @@ class SvMetaClass : public SvMetaType
SvMetaClassList & rClassList,
const OString& rPrefix, SvIdlDataBase& rBase );
-protected:
- virtual void ReadContextSvIdl( SvIdlDataBase &,
- SvTokenStream & rInStm ) override;
public:
SvMetaClass();
+ virtual void ReadContextSvIdl( SvIdlDataBase &,
+ SvTokenStream & rInStm ) override;
void FillClasses( SvMetaClassList & rList );
- virtual bool ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm ) override;
virtual void WriteSfx( SvIdlDataBase & rBase, SvStream & rOutStm ) override;
};
diff --git a/idl/inc/parser.hxx b/idl/inc/parser.hxx
index 8418d0b..ccd2f64 100644
--- a/idl/inc/parser.hxx
+++ b/idl/inc/parser.hxx
@@ -21,6 +21,7 @@
#define INCLUDED_IDL_INC_PARSER_HXX
#include <rtl/ustring.hxx>
+#include <types.hxx>
class SvTokenStream;
class SvIdlDataBase;
@@ -40,6 +41,7 @@ public:
bool ReadModuleBody(SvMetaModule& rModule);
void ReadModuleElement( SvMetaModule& rModule );
void ReadInclude( SvMetaModule& rModule );
+ void ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMetaTypeType );
void ReadItem();
void ReadStruct();
void ReadEnum();
diff --git a/idl/source/objects/object.cxx b/idl/source/objects/object.cxx
index c5c3589..711ca195 100644
--- a/idl/source/objects/object.cxx
+++ b/idl/source/objects/object.cxx
@@ -99,34 +99,6 @@ void SvMetaClass::ReadContextSvIdl( SvIdlDataBase & rBase,
rInStm.Seek( nTokPos );
}
-bool SvMetaClass::ReadSvIdl( SvIdlDataBase & rBase, SvTokenStream & rInStm )
-{
- sal_uLong nTokPos = rInStm.Tell();
- if( SvMetaType::ReadHeaderSvIdl( rBase, rInStm ) &&
- (GetMetaTypeType() == MetaTypeType::Interface || GetMetaTypeType() == MetaTypeType::Shell) )
- {
- bool bOk = true;
- if( rInStm.ReadIf( ':' ) )
- {
- aSuperClass = rBase.ReadKnownClass( rInStm );
- bOk = aSuperClass.Is();
- if( !bOk )
- {
- throw SvParseException( rInStm, "unknown super class" );
- }
- }
- if( bOk )
- {
- rBase.Write(OString('.'));
- bOk = SvMetaObject::ReadSvIdl( rBase, rInStm );
- }
- if( bOk )
- return bOk;
- }
- rInStm.Seek( nTokPos );
- return false;
-}
-
bool SvMetaClass::TestAttribute( SvIdlDataBase & rBase, SvTokenStream & rInStm,
SvMetaAttribute & rAttr ) const
{
diff --git a/idl/source/prj/parser.cxx b/idl/source/prj/parser.cxx
index f2bc458..cdd80df 100644
--- a/idl/source/prj/parser.cxx
+++ b/idl/source/prj/parser.cxx
@@ -118,16 +118,13 @@ bool SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
{
- if( rInStm.GetToken().Is( SvHash_interface() )
- || rInStm.GetToken().Is( SvHash_shell() ) )
+ if( rInStm.GetToken().Is( SvHash_interface() ) )
{
- tools::SvRef<SvMetaClass> aClass( new SvMetaClass() );
- if( aClass->ReadSvIdl( rBase, rInStm ) )
- {
- rModule.aClassList.push_back( aClass );
- // announce globally
- rBase.GetClassList().push_back( aClass );
- }
+ ReadInterfaceOrShell(rModule, MetaTypeType::Interface);
+ }
+ else if( rInStm.GetToken().Is( SvHash_shell() ) )
+ {
+ ReadInterfaceOrShell(rModule, MetaTypeType::Shell);
}
else if( rInStm.GetToken().Is( SvHash_enum() ) )
{
@@ -254,20 +251,6 @@ void SvIdlParser::ReadItem()
rBase.GetTypeList().push_back( xItem );
}
-SvMetaType * SvIdlParser::ReadKnownType()
-{
- OString aName = ReadIdentifier();
- for( const auto& aType : rBase.GetTypeList() )
- {
- if( aType->GetName().equals(aName) )
- {
- return aType;
- }
- }
- throw SvParseException( rInStm, "wrong typedef: ");
-}
-
-
void SvIdlParser::ReadEnum()
{
rInStm.GetToken_Next();
@@ -316,14 +299,52 @@ void SvIdlParser::ReadEnumValue( SvMetaTypeEnum& rEnum )
rEnum.aEnumValueList.push_back( aEnumVal );
}
+void SvIdlParser::ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMetaTypeType )
+{
+ tools::SvRef<SvMetaClass> aClass( new SvMetaClass() );
+ rInStm.GetToken_Next();
-void SvIdlParser::ReadChar(char cChar)
+ aClass->SetType( aMetaTypeType );
+
+ aClass->SetName( ReadIdentifier() );
+
+ if( rInStm.ReadIf( ':' ) )
+ {
+ aClass->aSuperClass = rBase.ReadKnownClass( rInStm );
+ if( !aClass->aSuperClass.Is() )
+ throw SvParseException( rInStm, "unknown super class" );
+ }
+ if( rInStm.ReadIf( '{' ) )
+ {
+ sal_uInt32 nBeginPos = 0; // can not happen with Tell
+ while( nBeginPos != rInStm.Tell() )
+ {
+ nBeginPos = rInStm.Tell();
+ aClass->ReadContextSvIdl( rBase, rInStm );
+ rInStm.ReadIfDelimiter();
+ }
+ ReadChar( '}' );
+ }
+ rModule.aClassList.push_back( aClass );
+ // announce globally
+ rBase.GetClassList().push_back( aClass );
+}
+
+SvMetaType * SvIdlParser::ReadKnownType()
{
- if( !rInStm.ReadIf( cChar ) )
- throw SvParseException(rInStm, "expected char '" + OString(cChar) + "'");
+ OString aName = ReadIdentifier();
+ for( const auto& aType : rBase.GetTypeList() )
+ {
+ if( aType->GetName().equals(aName) )
+ {
+ return aType;
+ }
+ }
+ throw SvParseException( rInStm, "wrong typedef: ");
}
+
void SvIdlParser::ReadDelimiter()
{
if( !rInStm.ReadIfDelimiter() )
@@ -346,6 +367,12 @@ OString SvIdlParser::ReadString()
return rTok.GetString();
}
+void SvIdlParser::ReadChar(char cChar)
+{
+ if( !rInStm.ReadIf( cChar ) )
+ throw SvParseException(rInStm, "expected char '" + OString(cChar) + "'");
+}
+
void SvIdlParser::ReadToken(SvStringHashEntry* entry)
{
if( !rInStm.GetToken().Is(entry) )
commit ac432839329866659e339b582d31a1980c035c2e
Author: Noel Grandin <noel at peralex.com>
Date: Fri Feb 12 13:09:24 2016 +0200
move item and struct parsing into SvIdlParser
Change-Id: I1ba88bca82b5b251ed34330ab5e0cb8bd88a5815
diff --git a/idl/inc/parser.hxx b/idl/inc/parser.hxx
index 9284096..8418d0b 100644
--- a/idl/inc/parser.hxx
+++ b/idl/inc/parser.hxx
@@ -26,6 +26,8 @@ class SvTokenStream;
class SvIdlDataBase;
class SvMetaModule;
class SvMetaTypeEnum;
+class SvStringHashEntry;
+class SvMetaType;
class SvIdlParser
{
@@ -38,12 +40,16 @@ public:
bool ReadModuleBody(SvMetaModule& rModule);
void ReadModuleElement( SvMetaModule& rModule );
void ReadInclude( SvMetaModule& rModule );
+ void ReadItem();
+ void ReadStruct();
void ReadEnum();
void ReadEnumValue( SvMetaTypeEnum& rEnum );
+ SvMetaType* ReadKnownType();
void ReadChar(char cChar);
void ReadDelimiter();
OString ReadIdentifier();
OString ReadString();
+ void ReadToken(SvStringHashEntry*);
};
#endif // INCLUDED_IDL_INC_PARSER_HXX
diff --git a/idl/inc/types.hxx b/idl/inc/types.hxx
index 47c5672..3be88e1b 100644
--- a/idl/inc/types.hxx
+++ b/idl/inc/types.hxx
@@ -30,13 +30,12 @@ typedef SvRefMemberList< SvMetaSlot* > SvSlotElementList;
class SvMetaAttribute : public SvMetaReference
{
- tools::SvRef<SvMetaType> aType;
- SvIdentifier aSlotId;
-
protected:
virtual void ReadAttributesSvIdl( SvIdlDataBase & rBase,
SvTokenStream & rInStm ) override;
public:
+ tools::SvRef<SvMetaType> aType;
+ SvIdentifier aSlotId;
SvMetaAttribute();
SvMetaAttribute( SvMetaType * );
@@ -81,6 +80,7 @@ public:
MetaTypeType GetMetaTypeType() const { return nType; }
SvMetaType * GetBaseType() const;
SvMetaType * GetReturnType() const;
+ void SetItem(bool b) { bIsItem = b; }
bool IsItem() const { return bIsItem; }
virtual bool ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm ) override;
@@ -101,8 +101,6 @@ class SvMetaEnumValue : public SvMetaObject
{
public:
SvMetaEnumValue();
-
- virtual bool ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm ) override;
};
class SvMetaTypeEnum : public SvMetaType
diff --git a/idl/source/objects/types.cxx b/idl/source/objects/types.cxx
index c5c799d..1317410 100644
--- a/idl/source/objects/types.cxx
+++ b/idl/source/objects/types.cxx
@@ -74,7 +74,7 @@ bool SvMetaAttribute::ReadSvIdl( SvIdlDataBase & rBase,
bOk = true;
SvToken& rTok = rInStm.GetToken();
- if( bOk && rTok.IsChar() && rTok.GetChar() == '(' )
+ if( rTok.IsChar() && rTok.GetChar() == '(' )
{
tools::SvRef<SvMetaType> xT(new SvMetaType() );
xT->SetRef( GetType() );
@@ -164,7 +164,7 @@ SvMetaType * SvMetaType::GetReturnType() const
return static_cast<SvMetaType *>(GetRef());
}
-bool SvMetaType::ReadHeaderSvIdl( SvIdlDataBase & rBase,
+bool SvMetaType::ReadHeaderSvIdl( SvIdlDataBase & ,
SvTokenStream & rInStm )
{
bool bOk = false;
@@ -181,26 +181,6 @@ bool SvMetaType::ReadHeaderSvIdl( SvIdlDataBase & rBase,
SetType( MetaTypeType::Shell );
bOk = ReadNamesSvIdl( rInStm );
}
- else if( rTok.Is( SvHash_struct() ) )
- {
- SetType( MetaTypeType::Struct );
- bOk = ReadNamesSvIdl( rInStm );
- }
- else if( rTok.Is( SvHash_enum() ) )
- {
- SetType( MetaTypeType::Enum );
- bOk = ReadNameSvIdl( rInStm );
- }
- else if( rTok.Is( SvHash_item() ) )
- {
- bIsItem = true;
-
- SvMetaType * pType = rBase.ReadKnownType( rInStm );
- if( !pType )
- throw SvParseException( rInStm, "wrong typedef: ");
- SetRef( pType );
- bOk = ReadNameSvIdl( rInStm );
- }
if( !bOk )
rInStm.Seek( nTokPos );
return bOk;
@@ -344,12 +324,6 @@ SvMetaEnumValue::SvMetaEnumValue()
{
}
-bool SvMetaEnumValue::ReadSvIdl( SvIdlDataBase & ,
- SvTokenStream & rInStm )
-{
- return ReadNameSvIdl( rInStm );
-}
-
SvMetaTypeEnum::SvMetaTypeEnum()
{
}
diff --git a/idl/source/prj/database.cxx b/idl/source/prj/database.cxx
index 96c4e3a..00f2ab1 100644
--- a/idl/source/prj/database.cxx
+++ b/idl/source/prj/database.cxx
@@ -274,34 +274,15 @@ SvMetaType * SvIdlDataBase::ReadKnownType( SvTokenStream & rInStm )
sal_uInt32 nTokPos = rInStm.Tell();
SvToken& rTok = rInStm.GetToken_Next();
- if( rTok.HasHash() )
- {
- sal_uInt32 nBeginPos = 0; // can not happen with Tell
- while( nBeginPos != rInStm.Tell() )
- {
- nBeginPos = rInStm.Tell();
- }
- }
-
if( rTok.IsIdentifier() )
{
OString aName = rTok.GetString();
- SvRefMemberList<SvMetaType *> & rList = GetTypeList();
- SvRefMemberList<SvMetaType *>::const_iterator it = rList.begin();
- SvMetaType * pType = nullptr;
- while( it != rList.end() )
+ for( const auto& aType : GetTypeList() )
{
- if( (*it)->GetName().equals(aName) )
+ if( aType->GetName().equals(aName) )
{
- pType = *it;
- break;
+ return aType;
}
- ++it;
- }
- if( pType )
- {
- // is exactly this type
- return pType;
}
}
rInStm.Seek( nTokPos );
diff --git a/idl/source/prj/parser.cxx b/idl/source/prj/parser.cxx
index 3f8f09d..f2bc458 100644
--- a/idl/source/prj/parser.cxx
+++ b/idl/source/prj/parser.cxx
@@ -133,16 +133,13 @@ void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
{
ReadEnum();
}
- else if( rInStm.GetToken().Is( SvHash_item() )
- || rInStm.GetToken().Is( SvHash_struct() ) )
+ else if( rInStm.GetToken().Is( SvHash_item() ) )
{
- tools::SvRef<SvMetaType> xItem(new SvMetaType() );
-
- if( xItem->ReadSvIdl( rBase, rInStm ) )
- {
- // announce globally
- rBase.GetTypeList().push_back( xItem );
- }
+ ReadItem();
+ }
+ else if( rInStm.GetToken().Is( SvHash_struct() ) )
+ {
+ ReadStruct();
}
else if( rInStm.GetToken().Is( SvHash_include() ) )
{
@@ -215,10 +212,66 @@ void SvIdlParser::ReadInclude( SvMetaModule& rModule )
rInStm.Seek( nTokPos );
}
+void SvIdlParser::ReadStruct()
+{
+ ReadToken( SvHash_struct() );
+ rInStm.GetToken_Next();
+ tools::SvRef<SvMetaType> xStruct(new SvMetaType() );
+ xStruct->SetType( MetaTypeType::Struct );
+ xStruct->SetName( ReadIdentifier() );
+ ReadChar( '{' );
+ sal_uInt32 nBeginPos = 0; // can not happen with Tell
+ while( nBeginPos != rInStm.Tell() )
+ {
+ nBeginPos = rInStm.Tell();
+ tools::SvRef<SvMetaAttribute> xAttr( new SvMetaAttribute() );
+ xAttr->aType = ReadKnownType();
+ xAttr->SetName(ReadIdentifier());
+ xAttr->aSlotId.setString(ReadIdentifier());
+ sal_uLong n;
+ if( !rBase.FindId( xAttr->aSlotId.getString(), &n ) )
+ throw SvParseException( rInStm, "no value for identifier <" + xAttr->aSlotId.getString() + "> " );
+ xAttr->aSlotId.SetValue(n);
+ xStruct->GetAttrList().push_back( xAttr );
+ rInStm.ReadIfDelimiter();
+ if ( rInStm.GetToken().IsChar() && rInStm.GetToken().GetChar() == '}')
+ break;
+ }
+ ReadChar( '}' );
+ // announce globally
+ rBase.GetTypeList().push_back( xStruct );
+}
+
+void SvIdlParser::ReadItem()
+{
+ ReadToken( SvHash_item() );
+ rInStm.GetToken_Next();
+ tools::SvRef<SvMetaType> xItem(new SvMetaType() );
+ xItem->SetItem(true);
+ xItem->SetRef( ReadKnownType() );
+ xItem->SetName( ReadIdentifier() );
+ // announce globally
+ rBase.GetTypeList().push_back( xItem );
+}
+
+SvMetaType * SvIdlParser::ReadKnownType()
+{
+ OString aName = ReadIdentifier();
+ for( const auto& aType : rBase.GetTypeList() )
+ {
+ if( aType->GetName().equals(aName) )
+ {
+ return aType;
+ }
+ }
+ throw SvParseException( rInStm, "wrong typedef: ");
+}
+
+
void SvIdlParser::ReadEnum()
{
- tools::SvRef<SvMetaTypeEnum> xEnum( new SvMetaTypeEnum() );
rInStm.GetToken_Next();
+ tools::SvRef<SvMetaTypeEnum> xEnum( new SvMetaTypeEnum() );
xEnum->SetType( MetaTypeType::Enum );
xEnum->SetName( ReadIdentifier() );
@@ -249,25 +302,18 @@ static OString getCommonSubPrefix(const OString &rA, const OString &rB)
void SvIdlParser::ReadEnumValue( SvMetaTypeEnum& rEnum )
{
- sal_uInt32 nTokPos = rInStm.Tell();
-
tools::SvRef<SvMetaEnumValue> aEnumVal = new SvMetaEnumValue();
- bool bOk = aEnumVal->ReadSvIdl( rBase, rInStm );
- if( bOk )
+ aEnumVal->SetName( ReadIdentifier() );
+ if( rEnum.aEnumValueList.empty() )
{
- if( rEnum.aEnumValueList.empty() )
- {
- // the first
- rEnum.aPrefix = aEnumVal->GetName();
- }
- else
- {
- rEnum.aPrefix = getCommonSubPrefix(rEnum.aPrefix, aEnumVal->GetName());
- }
- rEnum.aEnumValueList.push_back( aEnumVal );
+ // the first
+ rEnum.aPrefix = aEnumVal->GetName();
}
- if( !bOk )
- rInStm.Seek( nTokPos );
+ else
+ {
+ rEnum.aPrefix = getCommonSubPrefix(rEnum.aPrefix, aEnumVal->GetName());
+ }
+ rEnum.aEnumValueList.push_back( aEnumVal );
}
@@ -300,4 +346,10 @@ OString SvIdlParser::ReadString()
return rTok.GetString();
}
+void SvIdlParser::ReadToken(SvStringHashEntry* entry)
+{
+ if( !rInStm.GetToken().Is(entry) )
+ throw SvParseException("expected " + entry->GetName(), rInStm.GetToken());
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit d4a10f00c96c2fc4be2755873f6b26e72a996ca6
Author: Noel Grandin <noel at peralex.com>
Date: Fri Feb 12 10:41:48 2016 +0200
move include parsing into own method
Change-Id: Id3ce7ce651f541106cf60116f717e6ffd805db24
diff --git a/idl/inc/parser.hxx b/idl/inc/parser.hxx
index 67f63e3..9284096 100644
--- a/idl/inc/parser.hxx
+++ b/idl/inc/parser.hxx
@@ -37,11 +37,13 @@ public:
bool ReadModuleHeader(SvMetaModule& rModule);
bool ReadModuleBody(SvMetaModule& rModule);
void ReadModuleElement( SvMetaModule& rModule );
- void ReadEnum(SvMetaTypeEnum& rEnum);
+ void ReadInclude( SvMetaModule& rModule );
+ void ReadEnum();
void ReadEnumValue( SvMetaTypeEnum& rEnum );
void ReadChar(char cChar);
void ReadDelimiter();
OString ReadIdentifier();
+ OString ReadString();
};
#endif // INCLUDED_IDL_INC_PARSER_HXX
diff --git a/idl/source/prj/parser.cxx b/idl/source/prj/parser.cxx
index 2593c290..3f8f09d 100644
--- a/idl/source/prj/parser.cxx
+++ b/idl/source/prj/parser.cxx
@@ -118,7 +118,6 @@ bool SvIdlParser::ReadModuleBody(SvMetaModule& rModule)
void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
{
- sal_uInt32 nTokPos = rInStm.Tell();
if( rInStm.GetToken().Is( SvHash_interface() )
|| rInStm.GetToken().Is( SvHash_shell() ) )
{
@@ -132,11 +131,7 @@ void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
}
else if( rInStm.GetToken().Is( SvHash_enum() ) )
{
- tools::SvRef<SvMetaTypeEnum> aEnum( new SvMetaTypeEnum() );
-
- ReadEnum(*aEnum);
- // announce globally
- rBase.GetTypeList().push_back( aEnum );
+ ReadEnum();
}
else if( rInStm.GetToken().Is( SvHash_item() )
|| rInStm.GetToken().Is( SvHash_struct() ) )
@@ -151,58 +146,7 @@ void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
}
else if( rInStm.GetToken().Is( SvHash_include() ) )
{
- bool bOk = false;
- rInStm.GetToken_Next();
- SvToken& rTok = rInStm.GetToken_Next();
- if( rTok.IsString() )
- {
- OUString aFullName(OStringToOUString(rTok.GetString(), RTL_TEXTENCODING_ASCII_US));
- rBase.StartNewFile( aFullName );
- osl::FileBase::RC searchError = osl::File::searchFileURL(aFullName, rBase.GetPath(), aFullName);
- if( osl::FileBase::E_None != searchError )
- {
- OStringBuffer aStr("cannot find file:");
- aStr.append(OUStringToOString(aFullName, RTL_TEXTENCODING_UTF8));
- throw SvParseException(aStr.makeStringAndClear(), rTok);
- }
- osl::FileBase::getSystemPathFromFileURL( aFullName, aFullName );
- rBase.AddDepFile( aFullName );
- SvTokenStream aTokStm( aFullName );
-
- if( SVSTREAM_OK != aTokStm.GetStream().GetError() )
- {
- OStringBuffer aStr("cannot open file: ");
- aStr.append(OUStringToOString(aFullName, RTL_TEXTENCODING_UTF8));
- throw SvParseException(aStr.makeStringAndClear(), rTok);
- }
- // rescue error from old file
- SvIdlError aOldErr = rBase.GetError();
- // reset error
- rBase.SetError( SvIdlError() );
-
- try {
- SvIdlParser aIncludeParser( rBase, aTokStm );
- sal_uInt32 nBeginPos = 0xFFFFFFFF; // can not happen with Tell
- while( nBeginPos != aTokStm.Tell() )
- {
- nBeginPos = aTokStm.Tell();
- aIncludeParser.ReadModuleElement(rModule);
- aTokStm.ReadIfDelimiter();
- }
- } catch (const SvParseException& ex) {
- rBase.SetError(ex.aError);
- rBase.WriteError(aTokStm);
- }
- bOk = aTokStm.GetToken().IsEof();
- if( !bOk )
- {
- rBase.WriteError( aTokStm );
- }
- // recover error from old file
- rBase.SetError( aOldErr );
- }
- if( !bOk )
- rInStm.Seek( nTokPos );
+ ReadInclude(rModule);
}
else
{
@@ -219,39 +163,90 @@ void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
}
}
-void SvIdlParser::ReadEnum(SvMetaTypeEnum& rEnum)
+void SvIdlParser::ReadInclude( SvMetaModule& rModule )
+{
+ sal_uInt32 nTokPos = rInStm.Tell();
+ bool bOk = false;
+ rInStm.GetToken_Next();
+ OUString aFullName(OStringToOUString(ReadString(), RTL_TEXTENCODING_ASCII_US));
+ rBase.StartNewFile( aFullName );
+ osl::FileBase::RC searchError = osl::File::searchFileURL(aFullName, rBase.GetPath(), aFullName);
+ if( osl::FileBase::E_None != searchError )
+ {
+ OStringBuffer aStr("cannot find file:");
+ aStr.append(OUStringToOString(aFullName, RTL_TEXTENCODING_UTF8));
+ throw SvParseException(aStr.makeStringAndClear(), rInStm.GetToken());
+ }
+ osl::FileBase::getSystemPathFromFileURL( aFullName, aFullName );
+ rBase.AddDepFile( aFullName );
+ SvTokenStream aTokStm( aFullName );
+ if( SVSTREAM_OK != aTokStm.GetStream().GetError() )
+ {
+ OStringBuffer aStr("cannot open file: ");
+ aStr.append(OUStringToOString(aFullName, RTL_TEXTENCODING_UTF8));
+ throw SvParseException(aStr.makeStringAndClear(), rInStm.GetToken());
+ }
+ // rescue error from old file
+ SvIdlError aOldErr = rBase.GetError();
+ // reset error
+ rBase.SetError( SvIdlError() );
+
+ try {
+ SvIdlParser aIncludeParser( rBase, aTokStm );
+ sal_uInt32 nBeginPos = 0xFFFFFFFF; // can not happen with Tell
+ while( nBeginPos != aTokStm.Tell() )
+ {
+ nBeginPos = aTokStm.Tell();
+ aIncludeParser.ReadModuleElement(rModule);
+ aTokStm.ReadIfDelimiter();
+ }
+ } catch (const SvParseException& ex) {
+ rBase.SetError(ex.aError);
+ rBase.WriteError(aTokStm);
+ }
+ bOk = aTokStm.GetToken().IsEof();
+ if( !bOk )
+ {
+ rBase.WriteError( aTokStm );
+ }
+ // recover error from old file
+ rBase.SetError( aOldErr );
+ if( !bOk )
+ rInStm.Seek( nTokPos );
+}
+
+void SvIdlParser::ReadEnum()
{
+ tools::SvRef<SvMetaTypeEnum> xEnum( new SvMetaTypeEnum() );
rInStm.GetToken_Next();
- rEnum.SetType( MetaTypeType::Enum );
- rEnum.SetName( ReadIdentifier() );
+ xEnum->SetType( MetaTypeType::Enum );
+ xEnum->SetName( ReadIdentifier() );
ReadChar('{');
while( true )
{
- ReadEnumValue( rEnum );
+ ReadEnumValue( *xEnum );
if( !rInStm.ReadIfDelimiter() )
break;
}
ReadChar( '}' );
+ // announce globally
+ rBase.GetTypeList().push_back( xEnum );
}
-namespace
+static OString getCommonSubPrefix(const OString &rA, const OString &rB)
{
- OString getCommonSubPrefix(const OString &rA, const OString &rB)
+ sal_Int32 nMax = std::min(rA.getLength(), rB.getLength());
+ sal_Int32 nI = 0;
+ while (nI < nMax)
{
- sal_Int32 nMax = std::min(rA.getLength(), rB.getLength());
- sal_Int32 nI = 0;
- while (nI < nMax)
- {
- if (rA[nI] != rB[nI])
- break;
- ++nI;
- }
- return rA.copy(0, nI);
+ if (rA[nI] != rB[nI])
+ break;
+ ++nI;
}
+ return rA.copy(0, nI);
}
-
void SvIdlParser::ReadEnumValue( SvMetaTypeEnum& rEnum )
{
sal_uInt32 nTokPos = rInStm.Tell();
@@ -296,4 +291,13 @@ OString SvIdlParser::ReadIdentifier()
throw SvParseException("expected identifier", rTok);
return rTok.GetString();
}
+
+OString SvIdlParser::ReadString()
+{
+ SvToken& rTok = rInStm.GetToken_Next();
+ if( !rTok.IsString() )
+ throw SvParseException("expected string", rTok);
+ return rTok.GetString();
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list