summaryrefslogtreecommitdiff
path: root/idlc
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2013-04-03 11:30:06 +0200
committerStephan Bergmann <sbergman@redhat.com>2013-04-03 11:30:06 +0200
commitce2991ee863e2e5faef95462242552515e1cf89c (patch)
treed0a515758e2f031486e5bf9aa2175ad42801cda2 /idlc
parent8644d10098a10e02c426a4ae80ce179586f35089 (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.mk5
-rw-r--r--idlc/inc/idlc/astservice.hxx9
-rw-r--r--idlc/source/parser.y3
-rw-r--r--idlc/test/parser/oldstyle.tests28
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; };