qdoc: Update qdoc's QML parser
Because qdoc is part of qtbase/src/tools, it is not allowed to depend on anything outside of qtbase. But qdoc uses the QML parser from qtdeclarative, so qdoc has its own copy of the QML parser sources. The QML parser has been updated to the current version for Qt 5.2. Task-number: QTBUG-34269 Change-Id: I5ac9c8ff08a3494d5c35a0014a437be88f2dc31d Reviewed-by: Simon Hausmann <simon.hausmann@digia.com> Reviewed-by: Topi Reiniö <topi.reinio@digia.com> Reviewed-by: Jerome Pasion <jerome.pasion@digia.com> Reviewed-by: Nico Vertriest <nico.vertriest@digia.com>
This commit is contained in:
parent
e9fe369321
commit
0b152831cc
@ -65,6 +65,7 @@
|
|||||||
--- context keywords.
|
--- context keywords.
|
||||||
%token T_PUBLIC "public"
|
%token T_PUBLIC "public"
|
||||||
%token T_IMPORT "import"
|
%token T_IMPORT "import"
|
||||||
|
%token T_PRAGMA "pragma"
|
||||||
%token T_AS "as"
|
%token T_AS "as"
|
||||||
%token T_ON "on"
|
%token T_ON "on"
|
||||||
%token T_GET "get"
|
%token T_GET "get"
|
||||||
@ -253,7 +254,8 @@ public:
|
|||||||
AST::VariableDeclarationList *VariableDeclarationList;
|
AST::VariableDeclarationList *VariableDeclarationList;
|
||||||
|
|
||||||
AST::UiProgram *UiProgram;
|
AST::UiProgram *UiProgram;
|
||||||
AST::UiImportList *UiImportList;
|
AST::UiHeaderItemList *UiHeaderItemList;
|
||||||
|
AST::UiPragma *UiPragma;
|
||||||
AST::UiImport *UiImport;
|
AST::UiImport *UiImport;
|
||||||
AST::UiParameterList *UiParameterList;
|
AST::UiParameterList *UiParameterList;
|
||||||
AST::UiPublicMember *UiPublicMember;
|
AST::UiPublicMember *UiPublicMember;
|
||||||
@ -266,6 +268,7 @@ public:
|
|||||||
AST::UiObjectMemberList *UiObjectMemberList;
|
AST::UiObjectMemberList *UiObjectMemberList;
|
||||||
AST::UiArrayMemberList *UiArrayMemberList;
|
AST::UiArrayMemberList *UiArrayMemberList;
|
||||||
AST::UiQualifiedId *UiQualifiedId;
|
AST::UiQualifiedId *UiQualifiedId;
|
||||||
|
AST::UiQualifiedPragmaId *UiQualifiedPragmaId;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -347,6 +350,7 @@ protected:
|
|||||||
{ return location_stack [tos + index - 1]; }
|
{ return location_stack [tos + index - 1]; }
|
||||||
|
|
||||||
AST::UiQualifiedId *reparseAsQualifiedId(AST::ExpressionNode *expr);
|
AST::UiQualifiedId *reparseAsQualifiedId(AST::ExpressionNode *expr);
|
||||||
|
AST::UiQualifiedPragmaId *reparseAsQualifiedPragmaId(AST::ExpressionNode *expr);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Engine *driver;
|
Engine *driver;
|
||||||
@ -486,6 +490,19 @@ AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AST::UiQualifiedPragmaId *Parser::reparseAsQualifiedPragmaId(AST::ExpressionNode *expr)
|
||||||
|
{
|
||||||
|
if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(expr)) {
|
||||||
|
AST::UiQualifiedPragmaId *q = new (pool) AST::UiQualifiedPragmaId(idExpr->name);
|
||||||
|
q->identifierToken = idExpr->identifierToken;
|
||||||
|
|
||||||
|
return q->finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Parser::parse(int startToken)
|
bool Parser::parse(int startToken)
|
||||||
{
|
{
|
||||||
Lexer *lexer = driver->lexer();
|
Lexer *lexer = driver->lexer();
|
||||||
@ -594,38 +611,62 @@ case $rule_number: {
|
|||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
UiProgram: UiImportListOpt UiRootMember ;
|
UiProgram: UiHeaderItemListOpt UiRootMember;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
sym(1).UiProgram = new (pool) AST::UiProgram(sym(1).UiImportList,
|
sym(1).UiProgram = new (pool) AST::UiProgram(sym(1).UiHeaderItemList,
|
||||||
sym(2).UiObjectMemberList->finish());
|
sym(2).UiObjectMemberList->finish());
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
UiImportListOpt: Empty ;
|
UiHeaderItemListOpt: Empty ;
|
||||||
UiImportListOpt: UiImportList ;
|
UiHeaderItemListOpt: UiHeaderItemList ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
sym(1).Node = sym(1).UiImportList->finish();
|
sym(1).Node = sym(1).UiHeaderItemList->finish();
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
UiImportList: UiImport ;
|
UiHeaderItemList: UiPragma ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
sym(1).Node = new (pool) AST::UiImportList(sym(1).UiImport);
|
sym(1).Node = new (pool) AST::UiHeaderItemList(sym(1).UiPragma);
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
UiImportList: UiImportList UiImport ;
|
UiHeaderItemList: UiImport ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
sym(1).Node = new (pool) AST::UiImportList(sym(1).UiImportList, sym(2).UiImport);
|
sym(1).Node = new (pool) AST::UiHeaderItemList(sym(1).UiImport);
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
|
UiHeaderItemList: UiHeaderItemList UiPragma ;
|
||||||
|
/.
|
||||||
|
case $rule_number: {
|
||||||
|
sym(1).Node = new (pool) AST::UiHeaderItemList(sym(1).UiHeaderItemList, sym(2).UiPragma);
|
||||||
|
} break;
|
||||||
|
./
|
||||||
|
|
||||||
|
UiHeaderItemList: UiHeaderItemList UiImport ;
|
||||||
|
/.
|
||||||
|
case $rule_number: {
|
||||||
|
sym(1).Node = new (pool) AST::UiHeaderItemList(sym(1).UiHeaderItemList, sym(2).UiImport);
|
||||||
|
} break;
|
||||||
|
./
|
||||||
|
|
||||||
|
PragmaId: MemberExpression ;
|
||||||
|
|
||||||
ImportId: MemberExpression ;
|
ImportId: MemberExpression ;
|
||||||
|
|
||||||
|
UiPragma: UiPragmaHead T_AUTOMATIC_SEMICOLON ;
|
||||||
|
UiPragma: UiPragmaHead T_SEMICOLON ;
|
||||||
|
/.
|
||||||
|
case $rule_number: {
|
||||||
|
sym(1).UiPragma->semicolonToken = loc(2);
|
||||||
|
} break;
|
||||||
|
./
|
||||||
|
|
||||||
UiImport: UiImportHead T_AUTOMATIC_SEMICOLON ;
|
UiImport: UiImportHead T_AUTOMATIC_SEMICOLON ;
|
||||||
UiImport: UiImportHead T_SEMICOLON ;
|
UiImport: UiImportHead T_SEMICOLON ;
|
||||||
/.
|
/.
|
||||||
@ -666,6 +707,28 @@ case $rule_number: {
|
|||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
|
UiPragmaHead: T_PRAGMA PragmaId ;
|
||||||
|
/.
|
||||||
|
case $rule_number: {
|
||||||
|
AST::UiPragma *node = 0;
|
||||||
|
|
||||||
|
if (AST::UiQualifiedPragmaId *qualifiedId = reparseAsQualifiedPragmaId(sym(2).Expression)) {
|
||||||
|
node = new (pool) AST::UiPragma(qualifiedId);
|
||||||
|
}
|
||||||
|
|
||||||
|
sym(1).Node = node;
|
||||||
|
|
||||||
|
if (node) {
|
||||||
|
node->pragmaToken = loc(1);
|
||||||
|
} else {
|
||||||
|
diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
|
||||||
|
QLatin1String("Expected a qualified name id")));
|
||||||
|
|
||||||
|
return false; // ### remove me
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
./
|
||||||
|
|
||||||
|
|
||||||
UiImportHead: T_IMPORT ImportId ;
|
UiImportHead: T_IMPORT ImportId ;
|
||||||
/.
|
/.
|
||||||
@ -1261,6 +1324,7 @@ case $rule_number: {
|
|||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
|
|
||||||
UiQualifiedId: MemberExpression ;
|
UiQualifiedId: MemberExpression ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
|
@ -821,7 +821,7 @@ void DebuggerStatement::accept0(Visitor *visitor)
|
|||||||
void UiProgram::accept0(Visitor *visitor)
|
void UiProgram::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
if (visitor->visit(this)) {
|
||||||
accept(imports, visitor);
|
accept(headers, visitor);
|
||||||
accept(members, visitor);
|
accept(members, visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -932,16 +932,34 @@ void UiImport::accept0(Visitor *visitor)
|
|||||||
visitor->endVisit(this);
|
visitor->endVisit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UiImportList::accept0(Visitor *visitor)
|
void UiQualifiedPragmaId::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
if (visitor->visit(this)) {
|
||||||
accept(import, visitor);
|
}
|
||||||
|
|
||||||
|
visitor->endVisit(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UiPragma::accept0(Visitor *visitor)
|
||||||
|
{
|
||||||
|
if (visitor->visit(this)) {
|
||||||
|
accept(pragmaType, visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
visitor->endVisit(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UiHeaderItemList::accept0(Visitor *visitor)
|
||||||
|
{
|
||||||
|
if (visitor->visit(this)) {
|
||||||
|
accept(headerItem, visitor);
|
||||||
accept(next, visitor);
|
accept(next, visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
visitor->endVisit(this);
|
visitor->endVisit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void UiSourceElement::accept0(Visitor *visitor)
|
void UiSourceElement::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
if (visitor->visit(this)) {
|
||||||
|
@ -207,18 +207,20 @@ public:
|
|||||||
|
|
||||||
Kind_UiArrayBinding,
|
Kind_UiArrayBinding,
|
||||||
Kind_UiImport,
|
Kind_UiImport,
|
||||||
Kind_UiImportList,
|
|
||||||
Kind_UiObjectBinding,
|
Kind_UiObjectBinding,
|
||||||
Kind_UiObjectDefinition,
|
Kind_UiObjectDefinition,
|
||||||
Kind_UiObjectInitializer,
|
Kind_UiObjectInitializer,
|
||||||
Kind_UiObjectMemberList,
|
Kind_UiObjectMemberList,
|
||||||
Kind_UiArrayMemberList,
|
Kind_UiArrayMemberList,
|
||||||
|
Kind_UiPragma,
|
||||||
Kind_UiProgram,
|
Kind_UiProgram,
|
||||||
Kind_UiParameterList,
|
Kind_UiParameterList,
|
||||||
Kind_UiPublicMember,
|
Kind_UiPublicMember,
|
||||||
Kind_UiQualifiedId,
|
Kind_UiQualifiedId,
|
||||||
|
Kind_UiQualifiedPragmaId,
|
||||||
Kind_UiScriptBinding,
|
Kind_UiScriptBinding,
|
||||||
Kind_UiSourceElement
|
Kind_UiSourceElement,
|
||||||
|
Kind_UiHeaderItemList
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Node()
|
inline Node()
|
||||||
@ -2271,44 +2273,6 @@ public:
|
|||||||
SourceLocation semicolonToken;
|
SourceLocation semicolonToken;
|
||||||
};
|
};
|
||||||
|
|
||||||
class QML_PARSER_EXPORT UiImportList: public Node
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QQMLJS_DECLARE_AST_NODE(UiImportList)
|
|
||||||
|
|
||||||
UiImportList(UiImport *import)
|
|
||||||
: import(import),
|
|
||||||
next(this)
|
|
||||||
{ kind = K; }
|
|
||||||
|
|
||||||
UiImportList(UiImportList *previous, UiImport *import)
|
|
||||||
: import(import)
|
|
||||||
{
|
|
||||||
kind = K;
|
|
||||||
next = previous->next;
|
|
||||||
previous->next = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
UiImportList *finish()
|
|
||||||
{
|
|
||||||
UiImportList *head = next;
|
|
||||||
next = 0;
|
|
||||||
return head;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void accept0(Visitor *visitor);
|
|
||||||
|
|
||||||
virtual SourceLocation firstSourceLocation() const
|
|
||||||
{ return import->firstSourceLocation(); }
|
|
||||||
|
|
||||||
virtual SourceLocation lastSourceLocation() const
|
|
||||||
{ return next ? next->lastSourceLocation() : import->lastSourceLocation(); }
|
|
||||||
|
|
||||||
// attributes
|
|
||||||
UiImport *import;
|
|
||||||
UiImportList *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QML_PARSER_EXPORT UiObjectMember: public Node
|
class QML_PARSER_EXPORT UiObjectMember: public Node
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -2355,21 +2319,131 @@ public:
|
|||||||
UiObjectMember *member;
|
UiObjectMember *member;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class QML_PARSER_EXPORT UiQualifiedPragmaId: public Node
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QQMLJS_DECLARE_AST_NODE(UiQualifiedPragmaId)
|
||||||
|
|
||||||
|
UiQualifiedPragmaId(const QStringRef &name)
|
||||||
|
: next(this), name(name)
|
||||||
|
{ kind = K; }
|
||||||
|
|
||||||
|
UiQualifiedPragmaId(UiQualifiedPragmaId *previous, const QStringRef &name)
|
||||||
|
: name(name)
|
||||||
|
{
|
||||||
|
kind = K;
|
||||||
|
next = previous->next;
|
||||||
|
previous->next = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
UiQualifiedPragmaId *finish()
|
||||||
|
{
|
||||||
|
UiQualifiedPragmaId *head = next;
|
||||||
|
next = 0;
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void accept0(Visitor *visitor);
|
||||||
|
|
||||||
|
virtual SourceLocation firstSourceLocation() const
|
||||||
|
{ return identifierToken; }
|
||||||
|
|
||||||
|
virtual SourceLocation lastSourceLocation() const
|
||||||
|
{ return next ? next->lastSourceLocation() : identifierToken; }
|
||||||
|
|
||||||
|
// attributes
|
||||||
|
UiQualifiedPragmaId *next;
|
||||||
|
QStringRef name;
|
||||||
|
SourceLocation identifierToken;
|
||||||
|
};
|
||||||
|
|
||||||
|
class QML_PARSER_EXPORT UiPragma: public Node
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QQMLJS_DECLARE_AST_NODE(UiPragma)
|
||||||
|
|
||||||
|
UiPragma(UiQualifiedPragmaId *type)
|
||||||
|
: pragmaType(type)
|
||||||
|
{ kind = K; }
|
||||||
|
|
||||||
|
virtual void accept0(Visitor *visitor);
|
||||||
|
|
||||||
|
virtual SourceLocation firstSourceLocation() const
|
||||||
|
{ return pragmaToken; }
|
||||||
|
|
||||||
|
virtual SourceLocation lastSourceLocation() const
|
||||||
|
{ return semicolonToken; }
|
||||||
|
|
||||||
|
// attributes
|
||||||
|
UiQualifiedPragmaId *pragmaType;
|
||||||
|
SourceLocation pragmaToken;
|
||||||
|
SourceLocation semicolonToken;
|
||||||
|
};
|
||||||
|
|
||||||
|
class QML_PARSER_EXPORT UiHeaderItemList: public Node
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QQMLJS_DECLARE_AST_NODE(UiHeaderItemList)
|
||||||
|
|
||||||
|
UiHeaderItemList(UiImport *import)
|
||||||
|
: headerItem(import), next(this)
|
||||||
|
{ kind = K; }
|
||||||
|
|
||||||
|
UiHeaderItemList(UiPragma *pragma)
|
||||||
|
: headerItem(pragma), next(this)
|
||||||
|
{ kind = K; }
|
||||||
|
|
||||||
|
UiHeaderItemList(UiHeaderItemList *previous, UiImport *import)
|
||||||
|
: headerItem(import)
|
||||||
|
{
|
||||||
|
kind = K;
|
||||||
|
next = previous->next;
|
||||||
|
previous->next = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
UiHeaderItemList(UiHeaderItemList *previous, UiPragma *pragma)
|
||||||
|
: headerItem(pragma)
|
||||||
|
{
|
||||||
|
kind = K;
|
||||||
|
next = previous->next;
|
||||||
|
previous->next = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
UiHeaderItemList *finish()
|
||||||
|
{
|
||||||
|
UiHeaderItemList *head = next;
|
||||||
|
next = 0;
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void accept0(Visitor *visitor);
|
||||||
|
|
||||||
|
virtual SourceLocation firstSourceLocation() const
|
||||||
|
{ return headerItem->firstSourceLocation(); }
|
||||||
|
|
||||||
|
virtual SourceLocation lastSourceLocation() const
|
||||||
|
{ return next ? next->lastSourceLocation() : headerItem->lastSourceLocation(); }
|
||||||
|
|
||||||
|
// attributes
|
||||||
|
Node *headerItem;
|
||||||
|
UiHeaderItemList *next;
|
||||||
|
};
|
||||||
|
|
||||||
class QML_PARSER_EXPORT UiProgram: public Node
|
class QML_PARSER_EXPORT UiProgram: public Node
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QQMLJS_DECLARE_AST_NODE(UiProgram)
|
QQMLJS_DECLARE_AST_NODE(UiProgram)
|
||||||
|
|
||||||
UiProgram(UiImportList *imports, UiObjectMemberList *members)
|
UiProgram(UiHeaderItemList *headers, UiObjectMemberList *members)
|
||||||
: imports(imports), members(members)
|
: headers(headers), members(members)
|
||||||
{ kind = K; }
|
{ kind = K; }
|
||||||
|
|
||||||
virtual void accept0(Visitor *visitor);
|
virtual void accept0(Visitor *visitor);
|
||||||
|
|
||||||
virtual SourceLocation firstSourceLocation() const
|
virtual SourceLocation firstSourceLocation() const
|
||||||
{
|
{
|
||||||
if (imports)
|
if (headers)
|
||||||
return imports->firstSourceLocation();
|
return headers->firstSourceLocation();
|
||||||
else if (members)
|
else if (members)
|
||||||
return members->firstSourceLocation();
|
return members->firstSourceLocation();
|
||||||
return SourceLocation();
|
return SourceLocation();
|
||||||
@ -2379,13 +2453,13 @@ public:
|
|||||||
{
|
{
|
||||||
if (members)
|
if (members)
|
||||||
return members->lastSourceLocation();
|
return members->lastSourceLocation();
|
||||||
else if (imports)
|
else if (headers)
|
||||||
return imports->lastSourceLocation();
|
return headers->lastSourceLocation();
|
||||||
return SourceLocation();
|
return SourceLocation();
|
||||||
}
|
}
|
||||||
|
|
||||||
// attributes
|
// attributes
|
||||||
UiImportList *imports;
|
UiHeaderItemList *headers;
|
||||||
UiObjectMemberList *members;
|
UiObjectMemberList *members;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ class NestedExpression;
|
|||||||
|
|
||||||
// ui elements
|
// ui elements
|
||||||
class UiProgram;
|
class UiProgram;
|
||||||
class UiImportList;
|
class UiPragma;
|
||||||
class UiImport;
|
class UiImport;
|
||||||
class UiPublicMember;
|
class UiPublicMember;
|
||||||
class UiParameterList;
|
class UiParameterList;
|
||||||
@ -181,6 +181,8 @@ class UiObjectMember;
|
|||||||
class UiObjectMemberList;
|
class UiObjectMemberList;
|
||||||
class UiArrayMemberList;
|
class UiArrayMemberList;
|
||||||
class UiQualifiedId;
|
class UiQualifiedId;
|
||||||
|
class UiQualifiedPragmaId;
|
||||||
|
class UiHeaderItemList;
|
||||||
|
|
||||||
} } // namespace AST
|
} } // namespace AST
|
||||||
|
|
||||||
|
@ -71,7 +71,8 @@ public:
|
|||||||
|
|
||||||
// Ui
|
// Ui
|
||||||
virtual bool visit(UiProgram *) { return true; }
|
virtual bool visit(UiProgram *) { return true; }
|
||||||
virtual bool visit(UiImportList *) { return true; }
|
virtual bool visit(UiHeaderItemList *) { return true; }
|
||||||
|
virtual bool visit(UiPragma *) { return true; }
|
||||||
virtual bool visit(UiImport *) { return true; }
|
virtual bool visit(UiImport *) { return true; }
|
||||||
virtual bool visit(UiPublicMember *) { return true; }
|
virtual bool visit(UiPublicMember *) { return true; }
|
||||||
virtual bool visit(UiSourceElement *) { return true; }
|
virtual bool visit(UiSourceElement *) { return true; }
|
||||||
@ -84,10 +85,12 @@ public:
|
|||||||
virtual bool visit(UiObjectMemberList *) { return true; }
|
virtual bool visit(UiObjectMemberList *) { return true; }
|
||||||
virtual bool visit(UiArrayMemberList *) { return true; }
|
virtual bool visit(UiArrayMemberList *) { return true; }
|
||||||
virtual bool visit(UiQualifiedId *) { return true; }
|
virtual bool visit(UiQualifiedId *) { return true; }
|
||||||
|
virtual bool visit(UiQualifiedPragmaId *) { return true; }
|
||||||
|
|
||||||
virtual void endVisit(UiProgram *) {}
|
virtual void endVisit(UiProgram *) {}
|
||||||
virtual void endVisit(UiImportList *) {}
|
|
||||||
virtual void endVisit(UiImport *) {}
|
virtual void endVisit(UiImport *) {}
|
||||||
|
virtual void endVisit(UiHeaderItemList *) {}
|
||||||
|
virtual void endVisit(UiPragma *) {}
|
||||||
virtual void endVisit(UiPublicMember *) {}
|
virtual void endVisit(UiPublicMember *) {}
|
||||||
virtual void endVisit(UiSourceElement *) {}
|
virtual void endVisit(UiSourceElement *) {}
|
||||||
virtual void endVisit(UiObjectDefinition *) {}
|
virtual void endVisit(UiObjectDefinition *) {}
|
||||||
@ -99,6 +102,7 @@ public:
|
|||||||
virtual void endVisit(UiObjectMemberList *) {}
|
virtual void endVisit(UiObjectMemberList *) {}
|
||||||
virtual void endVisit(UiArrayMemberList *) {}
|
virtual void endVisit(UiArrayMemberList *) {}
|
||||||
virtual void endVisit(UiQualifiedId *) {}
|
virtual void endVisit(UiQualifiedId *) {}
|
||||||
|
virtual void endVisit(UiQualifiedPragmaId *) {}
|
||||||
|
|
||||||
// QQmlJS
|
// QQmlJS
|
||||||
virtual bool visit(ThisExpression *) { return true; }
|
virtual bool visit(ThisExpression *) { return true; }
|
||||||
|
@ -102,6 +102,7 @@ public:
|
|||||||
~Engine();
|
~Engine();
|
||||||
|
|
||||||
void setCode(const QString &code);
|
void setCode(const QString &code);
|
||||||
|
const QString &code() const { return _code; }
|
||||||
|
|
||||||
void addComment(int pos, int len, int line, int col);
|
void addComment(int pos, int len, int line, int col);
|
||||||
QList<AST::SourceLocation> comments() const;
|
QList<AST::SourceLocation> comments() const;
|
||||||
|
@ -61,8 +61,10 @@
|
|||||||
# if defined(QT_BUILD_QMLDEVTOOLS_LIB) || defined(QT_QMLDEVTOOLS_LIB)
|
# if defined(QT_BUILD_QMLDEVTOOLS_LIB) || defined(QT_QMLDEVTOOLS_LIB)
|
||||||
// QmlDevTools is a static library
|
// QmlDevTools is a static library
|
||||||
# define QML_PARSER_EXPORT
|
# define QML_PARSER_EXPORT
|
||||||
# else
|
# elif defined(QT_BUILD_QML_LIB)
|
||||||
# define QML_PARSER_EXPORT Q_AUTOTEST_EXPORT
|
# define QML_PARSER_EXPORT Q_AUTOTEST_EXPORT
|
||||||
|
# else
|
||||||
|
# define QML_PARSER_EXPORT
|
||||||
# endif
|
# endif
|
||||||
#endif // QT_CREATOR
|
#endif // QT_CREATOR
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -63,12 +63,12 @@ class QQmlJSGrammar
|
|||||||
public:
|
public:
|
||||||
enum VariousConstants {
|
enum VariousConstants {
|
||||||
EOF_SYMBOL = 0,
|
EOF_SYMBOL = 0,
|
||||||
REDUCE_HERE = 104,
|
REDUCE_HERE = 105,
|
||||||
SHIFT_THERE = 103,
|
SHIFT_THERE = 104,
|
||||||
T_AND = 1,
|
T_AND = 1,
|
||||||
T_AND_AND = 2,
|
T_AND_AND = 2,
|
||||||
T_AND_EQ = 3,
|
T_AND_EQ = 3,
|
||||||
T_AS = 92,
|
T_AS = 93,
|
||||||
T_AUTOMATIC_SEMICOLON = 62,
|
T_AUTOMATIC_SEMICOLON = 62,
|
||||||
T_BREAK = 4,
|
T_BREAK = 4,
|
||||||
T_CASE = 5,
|
T_CASE = 5,
|
||||||
@ -90,19 +90,19 @@ public:
|
|||||||
T_EQ = 17,
|
T_EQ = 17,
|
||||||
T_EQ_EQ = 18,
|
T_EQ_EQ = 18,
|
||||||
T_EQ_EQ_EQ = 19,
|
T_EQ_EQ_EQ = 19,
|
||||||
T_ERROR = 96,
|
T_ERROR = 97,
|
||||||
T_FALSE = 83,
|
T_FALSE = 83,
|
||||||
T_FEED_JS_EXPRESSION = 100,
|
T_FEED_JS_EXPRESSION = 101,
|
||||||
T_FEED_JS_PROGRAM = 102,
|
T_FEED_JS_PROGRAM = 103,
|
||||||
T_FEED_JS_SOURCE_ELEMENT = 101,
|
T_FEED_JS_SOURCE_ELEMENT = 102,
|
||||||
T_FEED_JS_STATEMENT = 99,
|
T_FEED_JS_STATEMENT = 100,
|
||||||
T_FEED_UI_OBJECT_MEMBER = 98,
|
T_FEED_UI_OBJECT_MEMBER = 99,
|
||||||
T_FEED_UI_PROGRAM = 97,
|
T_FEED_UI_PROGRAM = 98,
|
||||||
T_FINALLY = 20,
|
T_FINALLY = 20,
|
||||||
T_FOR = 21,
|
T_FOR = 21,
|
||||||
T_FUNCTION = 22,
|
T_FUNCTION = 22,
|
||||||
T_GE = 23,
|
T_GE = 23,
|
||||||
T_GET = 94,
|
T_GET = 95,
|
||||||
T_GT = 24,
|
T_GT = 24,
|
||||||
T_GT_GT = 25,
|
T_GT_GT = 25,
|
||||||
T_GT_GT_EQ = 26,
|
T_GT_GT_EQ = 26,
|
||||||
@ -130,13 +130,14 @@ public:
|
|||||||
T_NOT_EQ_EQ = 46,
|
T_NOT_EQ_EQ = 46,
|
||||||
T_NULL = 81,
|
T_NULL = 81,
|
||||||
T_NUMERIC_LITERAL = 47,
|
T_NUMERIC_LITERAL = 47,
|
||||||
T_ON = 93,
|
T_ON = 94,
|
||||||
T_OR = 48,
|
T_OR = 48,
|
||||||
T_OR_EQ = 49,
|
T_OR_EQ = 49,
|
||||||
T_OR_OR = 50,
|
T_OR_OR = 50,
|
||||||
T_PLUS = 51,
|
T_PLUS = 51,
|
||||||
T_PLUS_EQ = 52,
|
T_PLUS_EQ = 52,
|
||||||
T_PLUS_PLUS = 53,
|
T_PLUS_PLUS = 53,
|
||||||
|
T_PRAGMA = 92,
|
||||||
T_PROPERTY = 66,
|
T_PROPERTY = 66,
|
||||||
T_PUBLIC = 90,
|
T_PUBLIC = 90,
|
||||||
T_QUESTION = 54,
|
T_QUESTION = 54,
|
||||||
@ -149,7 +150,7 @@ public:
|
|||||||
T_RETURN = 59,
|
T_RETURN = 59,
|
||||||
T_RPAREN = 60,
|
T_RPAREN = 60,
|
||||||
T_SEMICOLON = 61,
|
T_SEMICOLON = 61,
|
||||||
T_SET = 95,
|
T_SET = 96,
|
||||||
T_SIGNAL = 67,
|
T_SIGNAL = 67,
|
||||||
T_STAR = 63,
|
T_STAR = 63,
|
||||||
T_STAR_EQ = 64,
|
T_STAR_EQ = 64,
|
||||||
@ -168,15 +169,15 @@ public:
|
|||||||
T_XOR = 79,
|
T_XOR = 79,
|
||||||
T_XOR_EQ = 80,
|
T_XOR_EQ = 80,
|
||||||
|
|
||||||
ACCEPT_STATE = 655,
|
ACCEPT_STATE = 663,
|
||||||
RULE_COUNT = 351,
|
RULE_COUNT = 357,
|
||||||
STATE_COUNT = 656,
|
STATE_COUNT = 664,
|
||||||
TERMINAL_COUNT = 105,
|
TERMINAL_COUNT = 106,
|
||||||
NON_TERMINAL_COUNT = 108,
|
NON_TERMINAL_COUNT = 111,
|
||||||
|
|
||||||
GOTO_INDEX_OFFSET = 656,
|
GOTO_INDEX_OFFSET = 664,
|
||||||
GOTO_INFO_OFFSET = 2970,
|
GOTO_INFO_OFFSET = 3104,
|
||||||
GOTO_CHECK_OFFSET = 2970
|
GOTO_CHECK_OFFSET = 3104
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const spell [];
|
static const char *const spell [];
|
||||||
|
@ -436,6 +436,17 @@ static inline int classify6(const QChar *s, bool qmlMode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (s[1].unicode() == 'r') {
|
||||||
|
if (s[2].unicode() == 'a') {
|
||||||
|
if (s[3].unicode() == 'g') {
|
||||||
|
if (s[4].unicode() == 'm') {
|
||||||
|
if (s[5].unicode() == 'a') {
|
||||||
|
return qmlMode ? Lexer::T_PRAGMA : Lexer::T_IDENTIFIER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (s[0].unicode() == 'r') {
|
else if (s[0].unicode() == 'r') {
|
||||||
if (s[1].unicode() == 'e') {
|
if (s[1].unicode() == 'e') {
|
||||||
|
@ -54,7 +54,7 @@ QT_END_NAMESPACE
|
|||||||
|
|
||||||
using namespace QQmlJS;
|
using namespace QQmlJS;
|
||||||
|
|
||||||
static int regExpFlagFromChar(const QChar &ch)
|
static inline int regExpFlagFromChar(const QChar &ch)
|
||||||
{
|
{
|
||||||
switch (ch.unicode()) {
|
switch (ch.unicode()) {
|
||||||
case 'g': return Lexer::RegExp_Global;
|
case 'g': return Lexer::RegExp_Global;
|
||||||
@ -64,7 +64,7 @@ static int regExpFlagFromChar(const QChar &ch)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char convertHex(ushort c)
|
static inline unsigned char convertHex(ushort c)
|
||||||
{
|
{
|
||||||
if (c >= '0' && c <= '9')
|
if (c >= '0' && c <= '9')
|
||||||
return (c - '0');
|
return (c - '0');
|
||||||
@ -74,12 +74,12 @@ static unsigned char convertHex(ushort c)
|
|||||||
return (c - 'A' + 10);
|
return (c - 'A' + 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QChar convertHex(QChar c1, QChar c2)
|
static inline QChar convertHex(QChar c1, QChar c2)
|
||||||
{
|
{
|
||||||
return QChar((convertHex(c1.unicode()) << 4) + convertHex(c2.unicode()));
|
return QChar((convertHex(c1.unicode()) << 4) + convertHex(c2.unicode()));
|
||||||
}
|
}
|
||||||
|
|
||||||
static QChar convertUnicode(QChar c1, QChar c2, QChar c3, QChar c4)
|
static inline QChar convertUnicode(QChar c1, QChar c2, QChar c3, QChar c4)
|
||||||
{
|
{
|
||||||
return QChar((convertHex(c3.unicode()) << 4) + convertHex(c4.unicode()),
|
return QChar((convertHex(c3.unicode()) << 4) + convertHex(c4.unicode()),
|
||||||
(convertHex(c1.unicode()) << 4) + convertHex(c2.unicode()));
|
(convertHex(c1.unicode()) << 4) + convertHex(c2.unicode()));
|
||||||
@ -259,6 +259,7 @@ int Lexer::lex()
|
|||||||
_parenthesesCount = 0;
|
_parenthesesCount = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case T_ELSE:
|
||||||
case T_DO:
|
case T_DO:
|
||||||
_parenthesesState = BalancedParentheses;
|
_parenthesesState = BalancedParentheses;
|
||||||
break;
|
break;
|
||||||
@ -287,6 +288,7 @@ int Lexer::lex()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case BalancedParentheses:
|
case BalancedParentheses:
|
||||||
|
if (_tokenKind != T_DO && _tokenKind != T_ELSE)
|
||||||
_parenthesesState = IgnoreParentheses;
|
_parenthesesState = IgnoreParentheses;
|
||||||
break;
|
break;
|
||||||
} // switch
|
} // switch
|
||||||
@ -329,6 +331,27 @@ QChar Lexer::decodeUnicodeEscapeCharacter(bool *ok)
|
|||||||
return QChar();
|
return QChar();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QChar Lexer::decodeHexEscapeCharacter(bool *ok)
|
||||||
|
{
|
||||||
|
if (isHexDigit(_codePtr[0]) && isHexDigit(_codePtr[1])) {
|
||||||
|
scanChar();
|
||||||
|
|
||||||
|
const QChar c1 = _char;
|
||||||
|
scanChar();
|
||||||
|
|
||||||
|
const QChar c2 = _char;
|
||||||
|
scanChar();
|
||||||
|
|
||||||
|
if (ok)
|
||||||
|
*ok = true;
|
||||||
|
|
||||||
|
return convertHex(c1, c2);
|
||||||
|
}
|
||||||
|
|
||||||
|
*ok = false;
|
||||||
|
return QChar();
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool isIdentifierStart(QChar ch)
|
static inline bool isIdentifierStart(QChar ch)
|
||||||
{
|
{
|
||||||
// fast path for ascii
|
// fast path for ascii
|
||||||
@ -705,35 +728,29 @@ again:
|
|||||||
scanChar();
|
scanChar();
|
||||||
|
|
||||||
QChar u;
|
QChar u;
|
||||||
bool ok = false;
|
|
||||||
|
|
||||||
switch (_char.unicode()) {
|
switch (_char.unicode()) {
|
||||||
// unicode escape sequence
|
// unicode escape sequence
|
||||||
case 'u':
|
case 'u': {
|
||||||
|
bool ok = false;
|
||||||
u = decodeUnicodeEscapeCharacter(&ok);
|
u = decodeUnicodeEscapeCharacter(&ok);
|
||||||
if (! ok) {
|
if (! ok) {
|
||||||
_errorCode = IllegalUnicodeEscapeSequence;
|
_errorCode = IllegalUnicodeEscapeSequence;
|
||||||
_errorMessage = QCoreApplication::translate("QQmlParser", "Illegal unicode escape sequence");
|
_errorMessage = QCoreApplication::translate("QQmlParser", "Illegal unicode escape sequence");
|
||||||
return T_ERROR;
|
return T_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
} break;
|
||||||
|
|
||||||
// hex escape sequence
|
// hex escape sequence
|
||||||
case 'x':
|
case 'x': {
|
||||||
if (isHexDigit(_codePtr[0]) && isHexDigit(_codePtr[1])) {
|
bool ok = false;
|
||||||
scanChar();
|
u = decodeHexEscapeCharacter(&ok);
|
||||||
|
if (!ok) {
|
||||||
const QChar c1 = _char;
|
_errorCode = IllegalHexadecimalEscapeSequence;
|
||||||
scanChar();
|
_errorMessage = QCoreApplication::translate("QQmlParser", "Illegal hexadecimal escape sequence");
|
||||||
|
return T_ERROR;
|
||||||
const QChar c2 = _char;
|
|
||||||
scanChar();
|
|
||||||
|
|
||||||
u = convertHex(c1, c2);
|
|
||||||
} else {
|
|
||||||
u = _char;
|
|
||||||
}
|
}
|
||||||
break;
|
} break;
|
||||||
|
|
||||||
// single character escape sequence
|
// single character escape sequence
|
||||||
case '\\': u = QLatin1Char('\\'); scanChar(); break;
|
case '\\': u = QLatin1Char('\\'); scanChar(); break;
|
||||||
@ -767,22 +784,11 @@ again:
|
|||||||
return T_ERROR;
|
return T_ERROR;
|
||||||
|
|
||||||
case '\r':
|
case '\r':
|
||||||
if (isLineTerminatorSequence() == 2) {
|
|
||||||
_tokenText += QLatin1Char('\r');
|
|
||||||
u = QLatin1Char('\n');
|
|
||||||
} else {
|
|
||||||
u = QLatin1Char('\r');
|
|
||||||
}
|
|
||||||
scanChar();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '\n':
|
case '\n':
|
||||||
case 0x2028u:
|
case 0x2028u:
|
||||||
case 0x2029u:
|
case 0x2029u:
|
||||||
u = _char;
|
|
||||||
scanChar();
|
scanChar();
|
||||||
break;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// non escape character
|
// non escape character
|
||||||
@ -1033,7 +1039,7 @@ bool Lexer::scanRegExp(RegExpBodyPrefix prefix)
|
|||||||
_patternFlags = 0;
|
_patternFlags = 0;
|
||||||
while (isIdentLetter(_char)) {
|
while (isIdentLetter(_char)) {
|
||||||
int flag = regExpFlagFromChar(_char);
|
int flag = regExpFlagFromChar(_char);
|
||||||
if (flag == 0) {
|
if (flag == 0 || _patternFlags & flag) {
|
||||||
_errorMessage = QCoreApplication::translate("QQmlParser", "Invalid regular expression flag '%0'")
|
_errorMessage = QCoreApplication::translate("QQmlParser", "Invalid regular expression flag '%0'")
|
||||||
.arg(QChar(_char));
|
.arg(QChar(_char));
|
||||||
return false;
|
return false;
|
||||||
|
@ -128,7 +128,8 @@ public:
|
|||||||
IllegalUnicodeEscapeSequence,
|
IllegalUnicodeEscapeSequence,
|
||||||
UnclosedComment,
|
UnclosedComment,
|
||||||
IllegalExponentIndicator,
|
IllegalExponentIndicator,
|
||||||
IllegalIdentifier
|
IllegalIdentifier,
|
||||||
|
IllegalHexadecimalEscapeSequence
|
||||||
};
|
};
|
||||||
|
|
||||||
enum RegExpBodyPrefix {
|
enum RegExpBodyPrefix {
|
||||||
@ -203,6 +204,7 @@ private:
|
|||||||
|
|
||||||
void syncProhibitAutomaticSemicolon();
|
void syncProhibitAutomaticSemicolon();
|
||||||
QChar decodeUnicodeEscapeCharacter(bool *ok);
|
QChar decodeUnicodeEscapeCharacter(bool *ok);
|
||||||
|
QChar decodeHexEscapeCharacter(bool *ok);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Engine *_engine;
|
Engine *_engine;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -112,7 +112,8 @@ public:
|
|||||||
AST::VariableDeclarationList *VariableDeclarationList;
|
AST::VariableDeclarationList *VariableDeclarationList;
|
||||||
|
|
||||||
AST::UiProgram *UiProgram;
|
AST::UiProgram *UiProgram;
|
||||||
AST::UiImportList *UiImportList;
|
AST::UiHeaderItemList *UiHeaderItemList;
|
||||||
|
AST::UiPragma *UiPragma;
|
||||||
AST::UiImport *UiImport;
|
AST::UiImport *UiImport;
|
||||||
AST::UiParameterList *UiParameterList;
|
AST::UiParameterList *UiParameterList;
|
||||||
AST::UiPublicMember *UiPublicMember;
|
AST::UiPublicMember *UiPublicMember;
|
||||||
@ -125,6 +126,7 @@ public:
|
|||||||
AST::UiObjectMemberList *UiObjectMemberList;
|
AST::UiObjectMemberList *UiObjectMemberList;
|
||||||
AST::UiArrayMemberList *UiArrayMemberList;
|
AST::UiArrayMemberList *UiArrayMemberList;
|
||||||
AST::UiQualifiedId *UiQualifiedId;
|
AST::UiQualifiedId *UiQualifiedId;
|
||||||
|
AST::UiQualifiedPragmaId *UiQualifiedPragmaId;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -206,6 +208,7 @@ protected:
|
|||||||
{ return location_stack [tos + index - 1]; }
|
{ return location_stack [tos + index - 1]; }
|
||||||
|
|
||||||
AST::UiQualifiedId *reparseAsQualifiedId(AST::ExpressionNode *expr);
|
AST::UiQualifiedId *reparseAsQualifiedId(AST::ExpressionNode *expr);
|
||||||
|
AST::UiQualifiedPragmaId *reparseAsQualifiedPragmaId(AST::ExpressionNode *expr);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Engine *driver;
|
Engine *driver;
|
||||||
@ -245,9 +248,9 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define J_SCRIPT_REGEXPLITERAL_RULE1 81
|
#define J_SCRIPT_REGEXPLITERAL_RULE1 87
|
||||||
|
|
||||||
#define J_SCRIPT_REGEXPLITERAL_RULE2 82
|
#define J_SCRIPT_REGEXPLITERAL_RULE2 88
|
||||||
|
|
||||||
QT_QML_END_NAMESPACE
|
QT_QML_END_NAMESPACE
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user