diff --git a/src/plugins/qtscripteditor/parser/javascript.g b/src/plugins/qtscripteditor/parser/javascript.g
index dc23055ae26c6c2f1e265cc60b77d02b9283afd2..f762498ee4c60cd19f3f2edd9e950735be84e791 100644
--- a/src/plugins/qtscripteditor/parser/javascript.g
+++ b/src/plugins/qtscripteditor/parser/javascript.g
@@ -269,6 +269,12 @@ public:
         DiagnosticMessage(Kind kind, int line, int column, const QString &message)
             : kind(kind), line(line), column(column), message(message) {}
 
+        bool isWarning() const
+        { return kind == Warning; }
+
+        bool isError() const
+        { return kind == Error; }
+
         Kind kind;
         int line;
         int column;
@@ -2083,17 +2089,15 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ;
             tk.dval = yylval;
             tk.loc = yylloc;
 
-#if 0
             const QString msg = QString::fromUtf8("Missing `;'");
 
             diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning,
                 yylloc.startLine, yylloc.startColumn, msg));
-#endif
 
             first_token = &token_buffer[0];
             last_token = &token_buffer[1];
 
-            yytoken = T_AUTOMATIC_SEMICOLON;
+            yytoken = T_SEMICOLON;
             yylval = 0;
 
             action = errorState;
@@ -2103,24 +2107,6 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ;
 
         hadErrors = true;
 
-        static int tokens[] = {
-            T_PLUS,
-            T_EQ,
-
-            T_COMMA,
-            T_COLON,
-            T_SEMICOLON,
-
-            T_RPAREN, T_RBRACKET, T_RBRACE,
-
-            T_NUMERIC_LITERAL,
-            T_IDENTIFIER,
-
-            T_LPAREN, T_LBRACKET, T_LBRACE,
-
-            EOF_SYMBOL
-        };
-
         token_buffer[0].token = yytoken;
         token_buffer[0].dval = yylval;
         token_buffer[0].loc = yylloc;
@@ -2139,6 +2125,24 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ;
             goto _Lcheck_token;
         }
 
+        static int tokens[] = {
+            T_PLUS,
+            T_EQ,
+
+            T_COMMA,
+            T_COLON,
+            T_SEMICOLON,
+
+            T_RPAREN, T_RBRACKET, T_RBRACE,
+
+            T_NUMERIC_LITERAL,
+            T_IDENTIFIER,
+
+            T_LPAREN, T_LBRACKET, T_LBRACE,
+
+            EOF_SYMBOL
+        };
+
         for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
             int a = t_action(errorState, *tk);
             if (a > 0 && t_action(a, yytoken)) {
diff --git a/src/plugins/qtscripteditor/parser/javascriptparser.cpp b/src/plugins/qtscripteditor/parser/javascriptparser.cpp
index b1d1508b6042caca5e3e98e04dd40ba9e74ece03..794c416b763c8f3aeca13a92420df57a22c8b7ae 100644
--- a/src/plugins/qtscripteditor/parser/javascriptparser.cpp
+++ b/src/plugins/qtscripteditor/parser/javascriptparser.cpp
@@ -1094,17 +1094,15 @@ case 266: {
             tk.dval = yylval;
             tk.loc = yylloc;
 
-#if 0
             const QString msg = QString::fromUtf8("Missing `;'");
 
             diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning,
                 yylloc.startLine, yylloc.startColumn, msg));
-#endif
 
             first_token = &token_buffer[0];
             last_token = &token_buffer[1];
 
-            yytoken = T_AUTOMATIC_SEMICOLON;
+            yytoken = T_SEMICOLON;
             yylval = 0;
 
             action = errorState;
@@ -1114,24 +1112,6 @@ case 266: {
 
         hadErrors = true;
 
-        static int tokens[] = {
-            T_PLUS,
-            T_EQ,
-
-            T_COMMA,
-            T_COLON,
-            T_SEMICOLON,
-
-            T_RPAREN, T_RBRACKET, T_RBRACE,
-
-            T_NUMERIC_LITERAL,
-            T_IDENTIFIER,
-
-            T_LPAREN, T_LBRACKET, T_LBRACE,
-
-            EOF_SYMBOL
-        };
-
         token_buffer[0].token = yytoken;
         token_buffer[0].dval = yylval;
         token_buffer[0].loc = yylloc;
@@ -1150,6 +1130,24 @@ case 266: {
             goto _Lcheck_token;
         }
 
+        static int tokens[] = {
+            T_PLUS,
+            T_EQ,
+
+            T_COMMA,
+            T_COLON,
+            T_SEMICOLON,
+
+            T_RPAREN, T_RBRACKET, T_RBRACE,
+
+            T_NUMERIC_LITERAL,
+            T_IDENTIFIER,
+
+            T_LPAREN, T_LBRACKET, T_LBRACE,
+
+            EOF_SYMBOL
+        };
+
         for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
             int a = t_action(errorState, *tk);
             if (a > 0 && t_action(a, yytoken)) {
diff --git a/src/plugins/qtscripteditor/parser/javascriptparser_p.h b/src/plugins/qtscripteditor/parser/javascriptparser_p.h
index 17a1f250adcc23c34109c6d5f8d0088acbc51e42..d3b4e70208fe69a4309eca07a3998ad59732e6e3 100644
--- a/src/plugins/qtscripteditor/parser/javascriptparser_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptparser_p.h
@@ -120,6 +120,12 @@ public:
         DiagnosticMessage(Kind kind, int line, int column, const QString &message)
             : kind(kind), line(line), column(column), message(message) {}
 
+        bool isWarning() const
+        { return kind == Warning; }
+
+        bool isError() const
+        { return kind == Error; }
+
         Kind kind;
         int line;
         int column;
diff --git a/src/plugins/qtscripteditor/qtscripteditor.cpp b/src/plugins/qtscripteditor/qtscripteditor.cpp
index e6968645041d390a5da2ef8f6cf0d8ddf79e34a8..916567797ed99ce1da9046d560d103eb6caf40d0 100644
--- a/src/plugins/qtscripteditor/qtscripteditor.cpp
+++ b/src/plugins/qtscripteditor/qtscripteditor.cpp
@@ -86,11 +86,15 @@ protected:
 
     virtual bool visit(FunctionDeclaration *ast)
     {
+        if (! ast->name)
+            return false;
+
         QString text = ast->name->asString();
 
         text += QLatin1Char('(');
         for (FormalParameterList *it = ast->formals; it; it = it->next) {
-            text += it->name->asString();
+            if (it->name)
+                text += it->name->asString();
 
             if (it->next)
                 text += QLatin1String(", ");
@@ -100,7 +104,7 @@ protected:
 
         Declaration d;
         d.text = text;
-        d.startLine= ast->startLine;
+        d.startLine = ast->startLine;
         d.startColumn = ast->startColumn;
         d.endLine = ast->endLine;
         d.endColumn = ast->endColumn;
@@ -112,6 +116,9 @@ protected:
 
     virtual bool visit(VariableDeclaration *ast)
     {
+        if (! ast->name)
+            return false;
+
         Declaration d;
         d.text = ast->name->asString();
         d.startLine= ast->startLine;
@@ -201,20 +208,23 @@ void ScriptEditor::updateDocumentNow()
     lexer.setCode(code, /*line = */ 1);
     driver.setLexer(&lexer);
 
-    parser.parse(&driver);
+    if (parser.parse(&driver)) {
+        JavaScript::AST::Visitor v;
+        driver.ast()->accept(&v);
 
-    FindDeclarations decls;
-    m_declarations = decls.accept(driver.ast());
+        FindDeclarations decls;
+        m_declarations = decls.accept(driver.ast());
 
-    QStringList items;
-    items.append(tr("<Select Symbol>"));
+        QStringList items;
+        items.append(tr("<Select Symbol>"));
 
-    foreach (Declaration decl, m_declarations)
-        items.append(decl.text);
+        foreach (Declaration decl, m_declarations)
+            items.append(decl.text);
 
-    m_methodCombo->clear();
-    m_methodCombo->addItems(items);
-    updateMethodBoxIndex();
+        m_methodCombo->clear();
+        m_methodCombo->addItems(items);
+        updateMethodBoxIndex();
+    }
 
     QList<QTextEdit::ExtraSelection> selections;
 
@@ -229,21 +239,20 @@ void ScriptEditor::updateDocumentNow()
     QTextEdit::ExtraSelection sel;
 
     foreach (const JavaScriptParser::DiagnosticMessage &d, parser.diagnosticMessages()) {
-        const int line = d.line;
+        if (d.isWarning())
+            continue;
 
-        QTextCursor c(document()->findBlockByNumber(line - 1));
-        sel.cursor = c;
+        int line = d.line;
+        int column = d.column;
 
-        if (parser.errorColumnNumber() > 1)
-            sel.cursor.setPosition(c.position() + d.column - 1);
+        if (column == 0)
+            column = 1;
 
-        if (d.kind == JavaScriptParser::DiagnosticMessage::Warning) {
-            sel.format = warningFormat;
-            sel.cursor.movePosition(QTextCursor::StartOfWord);
-        } else {
-            sel.format = errorFormat;
-        }
+        sel.format = errorFormat;
 
+        QTextCursor c(document()->findBlockByNumber(line - 1));
+        sel.cursor = c;
+        sel.cursor.setPosition(c.position() + column - 1);
         sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
 
         selections.append(sel);
@@ -328,7 +337,8 @@ static void indentScriptBlock(const TextEditor::TabSettings &ts,
 {
     typedef typename SharedTools::Indenter<Iterator> Indenter ;
     Indenter &indenter = Indenter::instance();
-    indenter.setIndentSize(ts.m_tabSize);
+    indenter.setTabSize(ts.m_tabSize);
+    indenter.setIndentSize(ts.m_indentSize);
     const TextEditor::TextBlockIterator current(block);
     const int indent = indenter.indentForBottomLine(current, programBegin,
                                                     programEnd, typedChar);