diff --git a/generator/parser/binder.cpp b/generator/parser/binder.cpp index 80a20201d..d9708807b 100644 --- a/generator/parser/binder.cpp +++ b/generator/parser/binder.cpp @@ -175,7 +175,7 @@ CodeModel::ClassType Binder::decode_class_type(std::size_t index) const case Token_union: return CodeModel::Union; default: - warnHere(); + warnHere(index); std::cerr << "** WARNING unrecognized class type" << std::endl; } return CodeModel::Class; @@ -255,7 +255,7 @@ void Binder::declare_symbol(SimpleDeclarationAST *node, InitDeclaratorAST *init_ NameAST *id = declarator->id; if (! declarator->id) { - warnHere(); + warnHere(declarator->start_token, declarator->end_token); std::cerr << "** WARNING expected a declarator id" << std::endl; return; } @@ -265,7 +265,7 @@ void Binder::declare_symbol(SimpleDeclarationAST *node, InitDeclaratorAST *init_ if (! symbolScope) { name_cc.run(id); - warnHere(); + warnHere(declarator->start_token, declarator->end_token); std::cerr << "** WARNING scope not found for symbol: " << qPrintable(name_cc.name()) << std::endl; return; @@ -374,8 +374,8 @@ void Binder::visitFunctionDefinition(FunctionDefinitionAST *node) declarator = declarator->sub_declarator; //Q_ASSERT(declarator->id); if (!declarator->id) { - warnHere(); - std::cerr << "** SHIT " << qPrintable(name_cc.name()) << std::endl + warnHere(declarator->start_token, declarator->end_token); + std::cerr << "** SHIT" << std::endl << "\tdefinition *ignored*" << std::endl; return; @@ -385,7 +385,7 @@ void Binder::visitFunctionDefinition(FunctionDefinitionAST *node) ScopeModelItem functionScope = finder.resolveScope(declarator->id, scope); if (! functionScope) { - warnHere(); + warnHere(declarator->start_token, declarator->end_token); name_cc.run(declarator->id); std::cerr << "** WARNING scope not found for function definition: " << qPrintable(name_cc.name()) << std::endl @@ -571,7 +571,7 @@ void Binder::visitTypedef(TypedefAST *node) if (alias_name.isEmpty ()) { - warnHere(); + warnHere(init_declarator->start_token, init_declarator->end_token); std::cerr << "** WARNING anonymous typedef not supported! ``"; Token const &tk = _M_token_stream->token ((int) node->start_token); Token const &end_tk = _M_token_stream->token ((int) node->end_token); @@ -682,7 +682,6 @@ void Binder::visitClassSpecifier(ClassSpecifierAST *node) } Q_ASSERT(node->name != 0 && node->name->unqualified_name != 0); - ScopeModelItem scope = currentScope(); ClassModelItem old = changeCurrentClass(_M_model->create()); @@ -837,14 +836,25 @@ void Binder::visitQProperty(QPropertyAST *node) _M_current_class->addPropertyDeclaration(property); } -void Binder::warnHere() const +void Binder::warnHere(int startToken, int endToken) const { - ScopeModelItem scope = currentScope(); - QString fileName = scope ? scope->fileName() : QString(""); - if (fileName != _M_lastWarnedFile) { - _M_lastWarnedFile = fileName; - std::cerr << "In file " << fileName.toLatin1().constData() << ":" << std::endl; + int startLine, endLine; + int startColumn, endColumn; + QString firstFileName, secondFileName; + _M_location.positionAt(_M_token_stream->position(startToken), &startLine, &startColumn, &firstFileName); + _M_location.positionAt(_M_token_stream->position(endToken == -1 ? startToken : endToken), + &endLine, + &endColumn, + &secondFileName); + + assert (firstFileName == secondFileName); + if (firstFileName != _M_lastWarnedFile) + { + _M_lastWarnedFile = firstFileName; + std::cerr << std::endl << "In file " << firstFileName.toLatin1().constData() << ":" << std::endl; } + + std::cerr << "lines " << std::to_string(startLine) << "-" << std::to_string(endLine) << std::endl; } void Binder::applyStorageSpecifiers(const ListNode *it, MemberModelItem item) diff --git a/generator/parser/binder.h b/generator/parser/binder.h index e39210f86..83bc9568b 100644 --- a/generator/parser/binder.h +++ b/generator/parser/binder.h @@ -86,7 +86,7 @@ class Binder: protected DefaultVisitor virtual void visitForwardDeclarationSpecifier(ForwardDeclarationSpecifierAST *); virtual void visitQEnums(QEnumsAST *); - void warnHere() const; + void warnHere(int startToken, int endToken = -1) const; private: diff --git a/generator/parser/parser.cpp b/generator/parser/parser.cpp index 429a02d19..1d8d50ae9 100644 --- a/generator/parser/parser.cpp +++ b/generator/parser/parser.cpp @@ -1389,9 +1389,25 @@ bool Parser::parseEnumSpecifier(TypeSpecifierAST *&node) CHECK(Token_enum); + if (token_stream.lookAhead() == Token_class) + { + token_stream.nextToken(); + } + NameAST *name = 0; parseName(name); + if(token_stream.lookAhead() == ':') + { + token_stream.nextToken(); + TypeSpecifierAST *ast = 0; + if (!parseSimpleTypeSpecifier(ast)) + { + token_stream.rewind((int) start); + return false; + } + } + if (token_stream.lookAhead() != '{') { token_stream.rewind((int) start); @@ -1796,12 +1812,17 @@ bool Parser::parseForwardDeclarationSpecifier(TypeSpecifierAST *&node) std::size_t start = token_stream.cursor(); int kind = token_stream.lookAhead(); - if (kind != Token_class && kind != Token_struct && kind != Token_union) + if (kind != Token_class && kind != Token_struct && kind != Token_union && kind != Token_enum) return false; std::size_t class_key = token_stream.cursor(); token_stream.nextToken(); + if (kind == Token_enum && token_stream.lookAhead() == Token_class) + { + token_stream.nextToken(); + } + NameAST *name = 0; if (!parseName(name, false)) { token_stream.rewind((int) start); diff --git a/generator/typesystem_core.xml b/generator/typesystem_core.xml index f52cb2e5f..3a076fb79 100644 --- a/generator/typesystem_core.xml +++ b/generator/typesystem_core.xml @@ -649,6 +649,7 @@ + @@ -760,6 +761,9 @@ + + + @@ -1954,7 +1958,9 @@ + + diff --git a/generator/typesystem_gui.xml b/generator/typesystem_gui.xml index 8b138187a..4b1c638d7 100644 --- a/generator/typesystem_gui.xml +++ b/generator/typesystem_gui.xml @@ -190,6 +190,7 @@ + @@ -256,6 +257,7 @@ + diff --git a/generator/typesystem_network.xml b/generator/typesystem_network.xml index 5696d50b6..f626f1393 100644 --- a/generator/typesystem_network.xml +++ b/generator/typesystem_network.xml @@ -44,6 +44,7 @@ + @@ -210,6 +211,7 @@ + diff --git a/generator/typesystem_qml.xml b/generator/typesystem_qml.xml index 3a1dec853..ebc664fd7 100644 --- a/generator/typesystem_qml.xml +++ b/generator/typesystem_qml.xml @@ -13,6 +13,7 @@ +