diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2013-04-03 11:30:06 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2013-04-03 11:30:06 +0200 |
commit | ce2991ee863e2e5faef95462242552515e1cf89c (patch) | |
tree | d0a515758e2f031486e5bf9aa2175ad42801cda2 /idlc | |
parent | 8644d10098a10e02c426a4ae80ce179586f35089 (diff) |
Forbid old-style services/singletons inheriting new-style services
...does not make sense. Adapted some old-style services accordingly, where the
inherited service had been changed to new-style after the fact.
Change-Id: I5f3e4ddf99160778a319062a6c84f83529ff177b
Diffstat (limited to 'idlc')
-rw-r--r-- | idlc/CustomTarget_parser_test.mk | 5 | ||||
-rw-r--r-- | idlc/inc/idlc/astservice.hxx | 9 | ||||
-rw-r--r-- | idlc/source/parser.y | 3 | ||||
-rw-r--r-- | idlc/test/parser/oldstyle.tests | 28 |
4 files changed, 44 insertions, 1 deletions
diff --git a/idlc/CustomTarget_parser_test.mk b/idlc/CustomTarget_parser_test.mk index 1c3e44b2b0ba..6be490aed38b 100644 --- a/idlc/CustomTarget_parser_test.mk +++ b/idlc/CustomTarget_parser_test.mk @@ -51,6 +51,11 @@ $(call gb_CustomTarget_get_target,idlc/parser_test) : \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ -stdin && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ + $(SRCDIR)/idlc/test/parser/oldstyle.tests \ + $(call gb_Executable_get_command,idlc) \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ + -stdin && \ + $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/polystruct.tests \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ diff --git a/idlc/inc/idlc/astservice.hxx b/idlc/inc/idlc/astservice.hxx index 6760462a4c22..d3e0b643b5d9 100644 --- a/idlc/inc/idlc/astservice.hxx +++ b/idlc/inc/idlc/astservice.hxx @@ -29,22 +29,31 @@ public: AstService(const ::rtl::OString& name, AstScope* pScope) : AstDeclaration(NT_service, name, pScope) , AstScope(NT_service) + , m_singleInterfaceBasedService(false) , m_defaultConstructor(false) {} AstService(const NodeType type, const ::rtl::OString& name, AstScope* pScope) : AstDeclaration(type, name, pScope) , AstScope(type) + , m_singleInterfaceBasedService(false) , m_defaultConstructor(false) {} virtual ~AstService() {} virtual sal_Bool dump(RegistryKey& rKey); + void setSingleInterfaceBasedService() + { m_singleInterfaceBasedService = true; } + void setDefaultConstructor(bool b) { m_defaultConstructor = b; } + bool isSingleInterfaceBasedService() const + { return m_singleInterfaceBasedService; } + bool checkLastConstructor() const; private: + bool m_singleInterfaceBasedService; bool m_defaultConstructor; }; diff --git a/idlc/source/parser.y b/idlc/source/parser.y index 8729a63ade7e..e338e57be7aa 100644 --- a/idlc/source/parser.y +++ b/idlc/source/parser.y @@ -1707,7 +1707,7 @@ service_export : pDecl = pScope->lookupByName(*iter); if ( pDecl && (pDecl->getNodeType() == NT_service) ) { - if ( pScope->getScopeNodeType() == NT_singleton && pScope->nMembers() > 0 ) + if ( static_cast< AstService * >(pDecl)->isSingleInterfaceBasedService() || pScope->getScopeNodeType() == NT_singleton && pScope->nMembers() > 0 ) idlc()->error()->error0(EIDL_ILLEGAL_ADD); else if ( idlc()->error()->checkPublished(pDecl) ) { @@ -1907,6 +1907,7 @@ service_interface_dfn: { AstService * s = static_cast< AstService * >(idlc()->scopes()->top()); if (s != 0) { + s->setSingleInterfaceBasedService(); s->setDefaultConstructor(!$4); } } diff --git a/idlc/test/parser/oldstyle.tests b/idlc/test/parser/oldstyle.tests new file mode 100644 index 000000000000..c6692b977d72 --- /dev/null +++ b/idlc/test/parser/oldstyle.tests @@ -0,0 +1,28 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +EXPECT SUCCESS "oldstyle.tests 1": +service S1 {}; +service S2 { service S1; }; + + +EXPECT FAILURE "oldstyle.tests 2": +interface X {}; +service S1: X; +service S2 { service S1; }; + + +EXPECT SUCCESS "oldstyle.tests 3": +service S1 {}; +singleton S2 { service S1; }; + + +EXPECT FAILURE "oldstyle.tests 4": +interface X {}; +service S1: X; +singleton S2 { service S1; }; |