Git: Do not invoke git for details about empty change

Change-Id: I2a7b36063ad3c67d3a1fbe999659dc0051723b10
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Petar Perisin <petar.perisin@gmail.com>
CppTools: Fix MSVC compilation

Change-Id: I7b3c52a6eb70a0e2d7f2785fac71cb3ac68769d8
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Refix MSVC compilation

SemanticInfo has moved from CppEditor to CppTools and is now exported,
so this workaround is no longer needed (and it breaks linkage)

Change-Id: Ic9ba017bcb06be85fdccef27e63091415494bb21
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Remove superfluous comments from completion tests

Change-Id: I2526daeaf54f7f8d4b808cf556cff9242adaa391
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Cleanup completion tests #2

Change-Id: I3c5f42de464a5607f1caa6a48d881c5a4a113ec3
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Generalize data-driven test_completion

Change-Id: I409a00b869a95dff2d69c9744da75c324c82776a
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Minor optimization in CppCompletionAssistant

Change-Id: Ieb452713e9e09fce107520c4fd2a401007802e89
Reviewed-by: Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Braces cleanup in CppCompletionAssistant

Change-Id: I3dea8a8bdd4ae71b48926ec3332ef00cf5ad4303
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Reorder completion tests

For reasonable diff on following commit

Change-Id: I97e121355279f9166cea2f500cf2d4df5fafaa32
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Make completion tests data-driven

Mostly done using the following Ruby script:

Fname = 'src/plugins/cpptools/cppcompletion_test.cpp'
s = File.read(Fname)
mod = s.gsub(/(?<declaration>void CppToolsPlugin::test_(?<test_name>[^(]+)\(\)\n\{)(?<body>.*?\n)\}/m) { |func|
  match = $~
  declaration = match['declaration']
  body = match['body']
  test_name = match['test_name'].sub('_data', '')
  final = body.gsub(/(?:completions.clear\(\);\s+)?(?: +)[^\n]* =\n(?<code>.*?);\s*(?<completions>(?:completions.append\(QLatin1String\("[^"]*"\)\);\s*)*)QTest::newRow\("case: (?<name>.+?)"\)\s*<< code << _\("(?<prefix>[^"]+)"\) << completions;/m) {
    m = $~
    res = "    QTest::newRow(\"#{test_name}: #{m['name']}\") << _(\n#{m['code'].rstrip}\n        ) << _(\"#{m['prefix']}\") << (QStringList()"
    m['completions'].scan(/completions.append\((.+)\);/) { |comp|
      res << "\n            << #{comp[0]}"
    }
    res + ');'
  }.gsub(/(?: +)[^\n]* =\n(?<code>.*?);\n\s*CompletionTestCase test\(.+?, "(?<prefix>.+?)"\);\s*QStringList expected;\s*(?<completions>(?:expected.append\(QLatin1String\("[^"]*"\)\);\s*)*)const QStringList completions = test.getCompletions\(\);\s*QCOMPARE\(completions, expected\);/m) {
    m = $~
    res = "    QTest::newRow(\"#{test_name}\") << _(\n#{m['code'].rstrip}\n        ) << _(\"#{m['prefix']}\") << (QStringList()"
    m['completions'].scan(/expected.append\((.+)\);/) { |comp|
      res << "\n            << #{comp[0]}"
    }
    res + ');'
  }.gsub(/(?: +)[^\n]* =\n(?<code>.*?);\n\s*CompletionTestCase test\(.+?(?:, (?<prefix>".+?"))?\);\s*(?:const )?QStringList completions = test.getCompletions\(\);\s*QCOMPARE\(completions.size\(\), \d+\);(?<completions>(?:\s*QVERIFY\(completions.contains\([^\n]+\);)*)\n/m) { |mm|
    m = $~
    res = "    QTest::newRow(\"#{test_name}\") << _(\n#{m['code'].rstrip}\n        ) << _(#{m['prefix']}) << (QStringList()"
    m['completions'].scan(/QVERIFY\(completions.contains\((.+?)\)\);/) { |comp|
      res << "\n            << #{comp[0]}"
    }
    res + ");\n"
  }.gsub(/(?: +)[^\n]* =\n(?<code>.*?);\n\s*CompletionTestCase test\(.+?(?:, (?<prefix>".+?"))?\);\s*bool replaceAccessOperator = false;\s*const QStringList completions = test.getCompletions\(\&replaceAccessOperator\);\s*QCOMPARE\(completions.size\(\), \d+\);(?<completions>(?:\s*QVERIFY\(completions.contains\([^\n]+\);)*)\s*QVERIFY\((?<replace>!?)[^)]*\);\n/m) { |mm|
    m = $~
    res = "    QTest::newRow(\"#{test_name}\") << _(\n#{m['code'].rstrip}\n        ) << _(#{m['prefix']}) << (QStringList()"
    m['completions'].scan(/QVERIFY\(completions.contains\((.+?)\)\);/) { |comp|
      res << "\n            << #{comp[0]}"
    }
    res + ")\n        << #{m['replace'].empty?};\n"
  }
  if final == body or final['QTest::addColumn']
    declaration + final + "}"
  else
    final
  end
}.gsub(/QTest::newRow\("([^"]+)"/) { |m|
  name = $1
  if name.size > 73
    space = name[0..73].rindex(/[ _]/)
    "QTest::newRow(\"#{name[0..space]}\"\n                  \"#{name[space+1..-1]}\""
  else
    m
  end
}.gsub(/\s+QTest::newRow/, "\n\n    QTest::newRow")
if mod != s
    File.open(Fname, 'wt').write(mod)
end

Change-Id: Id6bfb03cdf31ac27b36028fcdc861c340a5398f4
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
CppTools: Fix indentation for some completion tests

Change-Id: I9a5bf4705da5ca88776dec70057da2c64e4c1494
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
TextEditor: Add an explicit include for QScopedPointer in CodeAssistant

+ Sort the includes

Change-Id: Ia6a5afdaa42c24c9ec0f66748aec1b6224561ab7
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>