diff options
20 files changed, 127 insertions, 43 deletions
diff --git a/configure.json b/configure.json new file mode 100644 index 0000000..b725f49 --- /dev/null +++ b/configure.json @@ -0,0 +1,5 @@ +{ + "subconfigs": [ + "src/xmlpatterns" + ] +} diff --git a/examples/xmlpatterns/xmlpatterns.pro b/examples/xmlpatterns/xmlpatterns.pro index bfc3a3e..b7c65d8 100644 --- a/examples/xmlpatterns/xmlpatterns.pro +++ b/examples/xmlpatterns/xmlpatterns.pro @@ -1,10 +1,10 @@ TEMPLATE = subdirs +QT_FOR_CONFIG += xmlpatterns-private SUBDIRS += xquery qtHaveModule(widgets) { SUBDIRS += recipes - load(qfeatures) - !contains(QT_DISABLED_FEATURES, xmlschema): SUBDIRS += filetree schema + qtConfig(xml-schema): SUBDIRS += filetree schema } EXAMPLE_FILES = \ diff --git a/src/xmlpatterns/api/api.pri b/src/xmlpatterns/api/api.pri index 2192d82..fec6499 100644 --- a/src/xmlpatterns/api/api.pri +++ b/src/xmlpatterns/api/api.pri @@ -50,8 +50,7 @@ SOURCES += $$PWD/qvariableloader.cpp \ $$PWD/qcoloringmessagehandler.cpp \ $$PWD/qcoloroutput.cpp -load(qfeatures) -!contains(QT_DISABLED_FEATURES, xmlschema) { +qtConfig(xml-schema) { HEADERS += $$PWD/qxmlschema.h \ $$PWD/qxmlschema_p.h \ $$PWD/qxmlschemavalidator.h \ diff --git a/src/xmlpatterns/configure.json b/src/xmlpatterns/configure.json new file mode 100644 index 0000000..851ebf8 --- /dev/null +++ b/src/xmlpatterns/configure.json @@ -0,0 +1,20 @@ +{ + "module": "xmlpatterns", + + "features": { + "xml-schema": { + "label": "XML schema support", + "purpose": "Support for XML schema validation", + "output": [ "privateFeature" ] + } + }, + + "summary": [ + { + "section": "QtXmlPatterns", + "entries": [ + "xml-schema" + ] + } + ] +} diff --git a/src/xmlpatterns/expr/qexpressionvariablereference.cpp b/src/xmlpatterns/expr/qexpressionvariablereference.cpp index 67d43f8..ffd5e88 100644 --- a/src/xmlpatterns/expr/qexpressionvariablereference.cpp +++ b/src/xmlpatterns/expr/qexpressionvariablereference.cpp @@ -45,8 +45,8 @@ QT_BEGIN_NAMESPACE using namespace QPatternist; ExpressionVariableReference::ExpressionVariableReference(const VariableSlotID slotP, - const VariableDeclaration::Ptr &varDecl) : VariableReference(slotP) - , m_varDecl(varDecl) + const VariableDeclaration *varDecl) : VariableReference(slotP) + , m_varDecl(varDecl) { } diff --git a/src/xmlpatterns/expr/qexpressionvariablereference_p.h b/src/xmlpatterns/expr/qexpressionvariablereference_p.h index b0d2bb8..ed4047b 100644 --- a/src/xmlpatterns/expr/qexpressionvariablereference_p.h +++ b/src/xmlpatterns/expr/qexpressionvariablereference_p.h @@ -73,7 +73,7 @@ namespace QPatternist { public: ExpressionVariableReference(const VariableSlotID slot, - const VariableDeclaration::Ptr &varDecl); + const VariableDeclaration *varDecl); virtual bool evaluateEBV(const DynamicContext::Ptr &context) const; virtual Item evaluateSingleton(const DynamicContext::Ptr &context) const; @@ -86,9 +86,9 @@ namespace QPatternist virtual ExpressionVisitorResult::Ptr accept(const ExpressionVisitor::Ptr &visitor) const; inline const Expression::Ptr &sourceExpression() const; - inline const VariableDeclaration::Ptr &variableDeclaration() const; + inline const VariableDeclaration *variableDeclaration() const; private: - const VariableDeclaration::Ptr m_varDecl; + const VariableDeclaration *m_varDecl; }; inline const Expression::Ptr &ExpressionVariableReference::sourceExpression() const @@ -96,7 +96,7 @@ namespace QPatternist return m_varDecl->expression(); } - inline const VariableDeclaration::Ptr &ExpressionVariableReference::variableDeclaration() const + inline const VariableDeclaration *ExpressionVariableReference::variableDeclaration() const { return m_varDecl; } diff --git a/src/xmlpatterns/expr/qtemplateparameterreference.cpp b/src/xmlpatterns/expr/qtemplateparameterreference.cpp index 61501e8..441f9e3 100644 --- a/src/xmlpatterns/expr/qtemplateparameterreference.cpp +++ b/src/xmlpatterns/expr/qtemplateparameterreference.cpp @@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE using namespace QPatternist; -TemplateParameterReference::TemplateParameterReference(const VariableDeclaration::Ptr &varDecl) : m_varDecl(varDecl) +TemplateParameterReference::TemplateParameterReference(const VariableDeclaration *varDecl) : m_varDecl(varDecl) { } diff --git a/src/xmlpatterns/expr/qtemplateparameterreference_p.h b/src/xmlpatterns/expr/qtemplateparameterreference_p.h index 61707b0..d9e1722 100644 --- a/src/xmlpatterns/expr/qtemplateparameterreference_p.h +++ b/src/xmlpatterns/expr/qtemplateparameterreference_p.h @@ -67,7 +67,7 @@ namespace QPatternist class TemplateParameterReference : public EmptyContainer { public: - TemplateParameterReference(const VariableDeclaration::Ptr &varDecl); + TemplateParameterReference(const VariableDeclaration *varDecl); virtual bool evaluateEBV(const DynamicContext::Ptr &context) const; virtual Item evaluateSingleton(const DynamicContext::Ptr &context) const; @@ -78,10 +78,10 @@ namespace QPatternist virtual Properties properties() const; inline const Expression::Ptr &sourceExpression() const; - inline const VariableDeclaration::Ptr &variableDeclaration() const; + inline const VariableDeclaration *variableDeclaration() const; private: - const VariableDeclaration::Ptr m_varDecl; + const VariableDeclaration *m_varDecl; }; inline const Expression::Ptr &TemplateParameterReference::sourceExpression() const @@ -89,7 +89,7 @@ namespace QPatternist return m_varDecl->expression(); } - inline const VariableDeclaration::Ptr &TemplateParameterReference::variableDeclaration() const + inline const VariableDeclaration *TemplateParameterReference::variableDeclaration() const { return m_varDecl; } diff --git a/src/xmlpatterns/parser/qquerytransformparser.cpp b/src/xmlpatterns/parser/qquerytransformparser.cpp index 93c7d15..73a3560 100644 --- a/src/xmlpatterns/parser/qquerytransformparser.cpp +++ b/src/xmlpatterns/parser/qquerytransformparser.cpp @@ -1098,7 +1098,7 @@ static Expression::Ptr resolveVariable(const QXmlName &name, * mechanism must. */ case VariableDeclaration::ExpressionVariable: { - retval = create(new ExpressionVariableReference(var->slot, var), sourceLocator, parseInfo); + retval = create(new ExpressionVariableReference(var->slot, var.data()), sourceLocator, parseInfo); break; } case VariableDeclaration::FunctionArgument: @@ -1113,7 +1113,7 @@ static Expression::Ptr resolveVariable(const QXmlName &name, } case VariableDeclaration::TemplateParameter: { - retval = create(new TemplateParameterReference(var), sourceLocator, parseInfo); + retval = create(new TemplateParameterReference(var.data()), sourceLocator, parseInfo); break; } case VariableDeclaration::ExternalVariable: diff --git a/src/xmlpatterns/parser/querytransformparser.ypp b/src/xmlpatterns/parser/querytransformparser.ypp index c1f5302..338bfe4 100644 --- a/src/xmlpatterns/parser/querytransformparser.ypp +++ b/src/xmlpatterns/parser/querytransformparser.ypp @@ -1027,7 +1027,7 @@ static Expression::Ptr resolveVariable(const QXmlName &name, * mechanism must. */ case VariableDeclaration::ExpressionVariable: { - retval = create(new ExpressionVariableReference(var->slot, var), sourceLocator, parseInfo); + retval = create(new ExpressionVariableReference(var->slot, var.data()), sourceLocator, parseInfo); break; } case VariableDeclaration::FunctionArgument: @@ -1042,7 +1042,7 @@ static Expression::Ptr resolveVariable(const QXmlName &name, } case VariableDeclaration::TemplateParameter: { - retval = create(new TemplateParameterReference(var), sourceLocator, parseInfo); + retval = create(new TemplateParameterReference(var.data()), sourceLocator, parseInfo); break; } case VariableDeclaration::ExternalVariable: diff --git a/src/xmlpatterns/qtokenautomaton/README b/src/xmlpatterns/qtokenautomaton/README index 8c5e552..32c348f 100644 --- a/src/xmlpatterns/qtokenautomaton/README +++ b/src/xmlpatterns/qtokenautomaton/README @@ -56,8 +56,16 @@ Using it is approached as follows: --schema qtokenautomaton.xsd yourFile.xml` 3. Produce the C++ files by invoking the stylesheet with an XSL-T 2.0 - processor[1]. For instance, with the implementation Saxon, this would be: - `java net.sf.saxon.Transform -xsl:qautomaton2cpp.xsl yourFile.xml` + processor[1], for example Saxon. + + If the Java SDK is installed, it can be invoked by: + java net.sf.saxon.Transform -xsl:qautomaton2cpp.xsl yourFile.xml + + Debian provides a command line utility saxonb-xslt for this: + sudo apt-get install libsaxonb-java + saxonb-xslt -ext:on -xsl:qautomaton2cpp.xsl -s:yourFile.xml + + The script regenerate.sh is provided to do this. 4. Include the produced C++ files with your build system. diff --git a/src/xmlpatterns/qtokenautomaton/regenerate.sh b/src/xmlpatterns/qtokenautomaton/regenerate.sh new file mode 100755 index 0000000..23b49b1 --- /dev/null +++ b/src/xmlpatterns/qtokenautomaton/regenerate.sh @@ -0,0 +1,38 @@ +#/bin/sh -x + +############################################################################# +## +## Copyright (C) 2016 The Qt Company Ltd. +## Contact: http://www.qt.io/licensing/ +## +## This file is part of the build tools of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:LGPL21$ +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see http://www.qt.io/terms-conditions. For further +## information use the contact form at http://www.qt.io/contact-us. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 2.1 or version 3 as published by the Free +## Software Foundation and appearing in the file LICENSE.LGPLv21 and +## LICENSE.LGPLv3 included in the packaging of this file. Please review the +## following information to ensure the GNU Lesser General Public License +## requirements will be met: https://www.gnu.org/licenses/lgpl.html and +## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +## +## As a special exception, The Qt Company gives you certain additional +## rights. These rights are described in The Qt Company LGPL Exception +## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +## +## $QT_END_LICENSE$ +## +############################################################################# + +cd $(dirname "$0")/.. +saxonb-xslt -ext:on -xsl:qtokenautomaton/qautomaton2cpp.xsl -s:schema/tokens.xml -o:schema/qxsdschematoken.cpp +saxonb-xslt -ext:on -xsl:qtokenautomaton/qautomaton2cpp.xsl -s:parser/qxslttokenlookup.xml -o:parser/qxslttokenlookup.cpp diff --git a/src/xmlpatterns/schema/qxsdtypechecker.cpp b/src/xmlpatterns/schema/qxsdtypechecker.cpp index 2e4ce8e..d6b224f 100644 --- a/src/xmlpatterns/schema/qxsdtypechecker.cpp +++ b/src/xmlpatterns/schema/qxsdtypechecker.cpp @@ -37,6 +37,8 @@ ** ****************************************************************************/ +#include <QtMath> + #include "qxsdtypechecker_p.h" #include "qabstractdatetime_p.h" @@ -150,13 +152,12 @@ static int fractionDigitsForDecimal(const QString &lexicalValue) { // we use the lexical value here, as the conversion to double might strip // away decimal positions - - QString trimmedValue(lexicalValue.trimmed()); - const int pos = trimmedValue.indexOf(QLatin1Char('.')); - if (pos == -1) // no '.' -> 0 fraction digits + bool ok = false; + double dbl = lexicalValue.toDouble(&ok); + if (!ok) return 0; - else - return (trimmedValue.length() - pos - 1); + dbl = dbl - qFloor(dbl); + return QString::number(dbl).length() - 2; } XsdTypeChecker::XsdTypeChecker(const XsdSchemaContext::Ptr &context, const QVector<QXmlName> &namespaceBindings, const QSourceLocation &location) diff --git a/src/xmlpatterns/xmlpatterns.pro b/src/xmlpatterns/xmlpatterns.pro index 1b53673..5244bb1 100644 --- a/src/xmlpatterns/xmlpatterns.pro +++ b/src/xmlpatterns/xmlpatterns.pro @@ -19,8 +19,7 @@ include($$PWD/janitors/janitors.pri) include($$PWD/parser/parser.pri) include($$PWD/projection/projection.pri) -load(qfeatures) -!contains(QT_DISABLED_FEATURES, xmlschema) { +qtConfig(xml-schema) { include($$PWD/schema/schema.pri) } include($$PWD/type/type.pri) diff --git a/sync.profile b/sync.profile index 675c687..45a2b44 100644 --- a/sync.profile +++ b/sync.profile @@ -3,13 +3,3 @@ ); %moduleheaders = ( # restrict the module headers to those found in relative path ); -# Module dependencies. -# Every module that is required to build this module should have one entry. -# Each of the module version specifiers can take one of the following values: -# - A specific Git revision. -# - any git symbolic ref resolvable from the module's repository (e.g. "refs/heads/master" to track master branch) -# - an empty string to use the same branch under test (dependencies will become "refs/heads/master" if we are in the master branch) -# -%dependencies = ( - "qtbase" => "", -); diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index df80f80..aba49b6 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -1,4 +1,5 @@ TEMPLATE=subdirs +QT_FOR_CONFIG += xmlpatterns-private SUBDIRS=\ checkxmlfiles \ cmake \ @@ -30,8 +31,7 @@ SUBDIRS=\ xmlpatternsxqts \ xmlpatternsxslts \ -load(qfeatures) -!contains(QT_DISABLED_FEATURES, xmlschema) { +qtConfig(xml-schema) { SUBDIRS += qxmlschema \ qxmlschemavalidator \ xmlpatternsschema \ diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml new file mode 100644 index 0000000..55c2ee8 --- /dev/null +++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<tns:number xmlns:tns="http://www.example.org/FractionDigitsTest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/FractionDigitsTest FractionDigitsTest.xsd"> + <tns:value>1234.560000</tns:value> +</tns:number> diff --git a/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd new file mode 100644 index 0000000..b8f266a --- /dev/null +++ b/tests/auto/xmlpatternsvalidator/files/fractiondigits.xsd @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/FractionDigitsTest" xmlns:tns="http://www.example.org/FractionDigitsTest" elementFormDefault="qualified"> + <element name="number" type="tns:NumberType" /> + <complexType name="NumberType"> + <sequence> + <element name="value"> + <simpleType> + <restriction base="decimal"> + <fractionDigits value="2"/> + </restriction> + </simpleType> + </element> + </sequence> + </complexType> +</schema> diff --git a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp index 8e86dd9..8a11418 100644 --- a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp +++ b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp @@ -227,6 +227,11 @@ void tst_XmlPatternsValidator::xsdSupport_data() const << (QStringList() << path + QLatin1String("substitution-group-invalid.xml") << path + QLatin1String("substitution-group.xsd")) << QString(); + QTest::newRow("QTBUG-58245 fraction digits shouldn't take trailing 0 into account") + << 0 + << (QStringList() << path + QLatin1String("fractiondigits.xml") + << path + QLatin1String("fractiondigits.xsd")) + << QString(); } QTEST_MAIN(tst_XmlPatternsValidator) diff --git a/tools/tools.pro b/tools/tools.pro index 92bbaca..df3f095 100644 --- a/tools/tools.pro +++ b/tools/tools.pro @@ -1,9 +1,9 @@ TEMPLATE = subdirs +QT_FOR_CONFIG += xmlpatterns-private -load(qfeatures) !android|android_app { SUBDIRS += xmlpatterns - !contains(QT_DISABLED_FEATURES, xmlschema) { + qtConfig(xml-schema) { SUBDIRS += xmlpatternsvalidator } } |