forked from qt-creator/qt-creator
Report the syntax errors.
This commit is contained in:
@@ -34,6 +34,7 @@
|
|||||||
%impl glslparser.cpp
|
%impl glslparser.cpp
|
||||||
%parser GLSLParserTable
|
%parser GLSLParserTable
|
||||||
%token_prefix T_
|
%token_prefix T_
|
||||||
|
%expect 1
|
||||||
|
|
||||||
%token ADD_ASSIGN "+="
|
%token ADD_ASSIGN "+="
|
||||||
%token AMPERSAND "&"
|
%token AMPERSAND "&"
|
||||||
@@ -316,6 +317,24 @@ private:
|
|||||||
inline int tokenKind(int index) const { return _tokens.at(index).kind; }
|
inline int tokenKind(int index) const { return _tokens.at(index).kind; }
|
||||||
void reduce(int ruleno);
|
void reduce(int ruleno);
|
||||||
|
|
||||||
|
void warning(int line, const QString &message)
|
||||||
|
{
|
||||||
|
DiagnosticMessage m;
|
||||||
|
m.setKind(DiagnosticMessage::Warning);
|
||||||
|
m.setLine(line);
|
||||||
|
m.setMessage(message);
|
||||||
|
_engine->addDiagnosticMessage(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
void error(int line, const QString &message)
|
||||||
|
{
|
||||||
|
DiagnosticMessage m;
|
||||||
|
m.setKind(DiagnosticMessage::Error);
|
||||||
|
m.setLine(line);
|
||||||
|
m.setMessage(message);
|
||||||
|
_engine->addDiagnosticMessage(m);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T *makeAstNode()
|
T *makeAstNode()
|
||||||
{
|
{
|
||||||
@@ -530,8 +549,17 @@ TranslationUnit *Parser::parse()
|
|||||||
}
|
}
|
||||||
} while (action);
|
} while (action);
|
||||||
|
|
||||||
fprintf(stderr, "unexpected token `%s' at line %d\n", yytoken != -1 ? spell[yytoken] : "",
|
const int line = _tokens[yyloc].line + 1;
|
||||||
_tokens[yyloc].line + 1);
|
QString message = QLatin1String("Syntax error");
|
||||||
|
if (yytoken != -1) {
|
||||||
|
const QLatin1String s(yytoken != -1 ? spell[yytoken] : "");
|
||||||
|
message = QString("Unexpected token `%1'").arg(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
error(line, message);
|
||||||
|
|
||||||
|
// fprintf(stderr, "unexpected token `%s' at line %d\n", yytoken != -1 ? spell[yytoken] : "",
|
||||||
|
// _tokens[yyloc].line + 1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,6 +99,11 @@ MemoryPool *Engine::pool()
|
|||||||
return &_pool;
|
return &_pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<DiagnosticMessage> Engine::diagnosticMessages() const
|
||||||
|
{
|
||||||
|
return _diagnosticMessages;
|
||||||
|
}
|
||||||
|
|
||||||
void Engine::clearDiagnosticMessages()
|
void Engine::clearDiagnosticMessages()
|
||||||
{
|
{
|
||||||
_diagnosticMessages.clear();
|
_diagnosticMessages.clear();
|
||||||
|
|||||||
@@ -400,3 +400,21 @@ int Lexer::findKeyword(const char *word, int length) const
|
|||||||
}
|
}
|
||||||
return t & ~Variant_Mask;
|
return t & ~Variant_Mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Lexer::warning(int line, const QString &message)
|
||||||
|
{
|
||||||
|
DiagnosticMessage m;
|
||||||
|
m.setKind(DiagnosticMessage::Warning);
|
||||||
|
m.setLine(line);
|
||||||
|
m.setMessage(message);
|
||||||
|
_engine->addDiagnosticMessage(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lexer::error(int line, const QString &message)
|
||||||
|
{
|
||||||
|
DiagnosticMessage m;
|
||||||
|
m.setKind(DiagnosticMessage::Error);
|
||||||
|
m.setLine(line);
|
||||||
|
m.setMessage(message);
|
||||||
|
_engine->addDiagnosticMessage(m);
|
||||||
|
}
|
||||||
|
|||||||
@@ -109,6 +109,9 @@ private:
|
|||||||
void yyinp();
|
void yyinp();
|
||||||
int yylex_helper(const char **position, int *line);
|
int yylex_helper(const char **position, int *line);
|
||||||
|
|
||||||
|
void warning(int line, const QString &message);
|
||||||
|
void error(int line, const QString &message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Engine *_engine;
|
Engine *_engine;
|
||||||
const char *_source;
|
const char *_source;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
#line 212 "./glsl.g"
|
#line 213 "./glsl.g"
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
**
|
**
|
||||||
@@ -107,6 +107,24 @@ private:
|
|||||||
inline int tokenKind(int index) const { return _tokens.at(index).kind; }
|
inline int tokenKind(int index) const { return _tokens.at(index).kind; }
|
||||||
void reduce(int ruleno);
|
void reduce(int ruleno);
|
||||||
|
|
||||||
|
void warning(int line, const QString &message)
|
||||||
|
{
|
||||||
|
DiagnosticMessage m;
|
||||||
|
m.setKind(DiagnosticMessage::Warning);
|
||||||
|
m.setLine(line);
|
||||||
|
m.setMessage(message);
|
||||||
|
_engine->addDiagnosticMessage(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
void error(int line, const QString &message)
|
||||||
|
{
|
||||||
|
DiagnosticMessage m;
|
||||||
|
m.setKind(DiagnosticMessage::Error);
|
||||||
|
m.setLine(line);
|
||||||
|
m.setMessage(message);
|
||||||
|
_engine->addDiagnosticMessage(m);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T *makeAstNode()
|
T *makeAstNode()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -256,6 +256,33 @@ void GLSLTextEditor::updateDocumentNow()
|
|||||||
Engine engine;
|
Engine engine;
|
||||||
Parser parser(&engine, preprocessedCode.constData(), preprocessedCode.size(), variant);
|
Parser parser(&engine, preprocessedCode.constData(), preprocessedCode.size(), variant);
|
||||||
TranslationUnit *ast = parser.parse();
|
TranslationUnit *ast = parser.parse();
|
||||||
|
|
||||||
|
QTextCharFormat errorFormat;
|
||||||
|
errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
|
||||||
|
errorFormat.setUnderlineColor(Qt::red);
|
||||||
|
|
||||||
|
QTextCharFormat warningFormat;
|
||||||
|
warningFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
|
||||||
|
warningFormat.setUnderlineColor(Qt::darkYellow);
|
||||||
|
|
||||||
|
QList<QTextEdit::ExtraSelection> sels;
|
||||||
|
|
||||||
|
foreach (const DiagnosticMessage &m, engine.diagnosticMessages()) {
|
||||||
|
if (! m.line())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
QTextCursor cursor(document()->findBlockByNumber(m.line() - 1));
|
||||||
|
cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
|
||||||
|
|
||||||
|
QTextEdit::ExtraSelection sel;
|
||||||
|
sel.cursor = cursor;
|
||||||
|
sel.format = m.isError() ? errorFormat : warningFormat;
|
||||||
|
sel.format.setToolTip(m.message());
|
||||||
|
sels.append(sel);
|
||||||
|
}
|
||||||
|
|
||||||
|
setExtraSelections(CodeWarningsSelection, sels);
|
||||||
|
|
||||||
// ### process the ast
|
// ### process the ast
|
||||||
(void) ast;
|
(void) ast;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user