forked from qt-creator/qt-creator
Clang: Fix adding completion snippets after {
...e.g. as in "void f() {".
The criteria whether to change snippets got invalidated with
commit 8d0391a4f9
Clang: Treat brace initialization as constructor completion
as the completion operator might be T_LBRACE now instead of T_EOF_SYMBOL
for normal completions.
This fixes the plugin test ClangCodeCompletionTest::testCompleteGlobals.
Add also unit tests.
Change-Id: I85cf522b9b307359c5c3e25198dd228cbb68ded0
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
@@ -262,6 +262,7 @@ IAssistProposal *ClangCompletionAssistProcessor::startCompletionHelper()
|
|||||||
analyzer.analyze();
|
analyzer.analyze();
|
||||||
m_completionOperator = analyzer.completionOperator();
|
m_completionOperator = analyzer.completionOperator();
|
||||||
m_positionForProposal = analyzer.positionForProposal();
|
m_positionForProposal = analyzer.positionForProposal();
|
||||||
|
m_addSnippets = analyzer.addSnippets();
|
||||||
|
|
||||||
QByteArray modifiedFileContent;
|
QByteArray modifiedFileContent;
|
||||||
|
|
||||||
@@ -285,7 +286,6 @@ IAssistProposal *ClangCompletionAssistProcessor::startCompletionHelper()
|
|||||||
analyzer.positionEndOfExpression());
|
analyzer.positionEndOfExpression());
|
||||||
Q_FALLTHROUGH();
|
Q_FALLTHROUGH();
|
||||||
case ClangCompletionContextAnalyzer::PassThroughToLibClang: {
|
case ClangCompletionContextAnalyzer::PassThroughToLibClang: {
|
||||||
m_addSnippets = m_completionOperator == T_EOF_SYMBOL;
|
|
||||||
m_sentRequestType = NormalCompletion;
|
m_sentRequestType = NormalCompletion;
|
||||||
m_requestSent = sendCompletionRequest(analyzer.positionForClang(),
|
m_requestSent = sendCompletionRequest(analyzer.positionForClang(),
|
||||||
modifiedFileContent);
|
modifiedFileContent);
|
||||||
|
@@ -169,6 +169,7 @@ void ClangCompletionContextAnalyzer::handleFunctionCall(int afterOperatorPositio
|
|||||||
m_positionForProposal,
|
m_positionForProposal,
|
||||||
functionNameStart);
|
functionNameStart);
|
||||||
} else { // e.g. "(" without any function name in front
|
} else { // e.g. "(" without any function name in front
|
||||||
|
m_addSnippets = true;
|
||||||
m_positionForProposal = afterOperatorPosition;
|
m_positionForProposal = afterOperatorPosition;
|
||||||
setActionAndClangPosition(PassThroughToLibClang, afterOperatorPosition);
|
setActionAndClangPosition(PassThroughToLibClang, afterOperatorPosition);
|
||||||
}
|
}
|
||||||
@@ -179,6 +180,8 @@ void ClangCompletionContextAnalyzer::handleFunctionCall(int afterOperatorPositio
|
|||||||
bool ClangCompletionContextAnalyzer::handleNonFunctionCall(int position)
|
bool ClangCompletionContextAnalyzer::handleNonFunctionCall(int position)
|
||||||
{
|
{
|
||||||
if (isTokenForPassThrough(m_completionOperator)) {
|
if (isTokenForPassThrough(m_completionOperator)) {
|
||||||
|
if (m_completionOperator == T_EOF_SYMBOL)
|
||||||
|
m_addSnippets = true;
|
||||||
setActionAndClangPosition(PassThroughToLibClang, position);
|
setActionAndClangPosition(PassThroughToLibClang, position);
|
||||||
return true;
|
return true;
|
||||||
} else if (m_completionOperator == T_DOXY_COMMENT) {
|
} else if (m_completionOperator == T_DOXY_COMMENT) {
|
||||||
|
@@ -58,6 +58,7 @@ public:
|
|||||||
int positionForClang() const { return m_positionForClang; }
|
int positionForClang() const { return m_positionForClang; }
|
||||||
int functionNameStart() const { return m_functionNameStart; }
|
int functionNameStart() const { return m_functionNameStart; }
|
||||||
int positionEndOfExpression() const { return m_positionEndOfExpression; }
|
int positionEndOfExpression() const { return m_positionEndOfExpression; }
|
||||||
|
bool addSnippets() const { return m_addSnippets; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ClangCompletionContextAnalyzer();
|
ClangCompletionContextAnalyzer();
|
||||||
@@ -84,6 +85,7 @@ private:
|
|||||||
int m_positionForClang = -1;
|
int m_positionForClang = -1;
|
||||||
int m_functionNameStart = -1;
|
int m_functionNameStart = -1;
|
||||||
int m_positionEndOfExpression = -1;
|
int m_positionEndOfExpression = -1;
|
||||||
|
bool m_addSnippets = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
@@ -92,25 +92,29 @@ MATCHER(IsPassThroughToClang, std::string(negation ? "isn't" : "is") + " passed
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Offsets are relative to positionInText
|
// Offsets are relative to positionInText
|
||||||
MATCHER_P4(HasResult,
|
MATCHER_P5(HasResult,
|
||||||
completionAction,
|
completionAction,
|
||||||
positionForClangOffset,
|
positionForClangOffset,
|
||||||
positionForProposalOffset,
|
positionForProposalOffset,
|
||||||
positionInText,
|
positionInText,
|
||||||
|
addSnippets,
|
||||||
std::string(negation ? "hasn't" : "has")
|
std::string(negation ? "hasn't" : "has")
|
||||||
+ " result of completion action " + PrintToString(completionAction)
|
+ " result of completion action " + PrintToString(completionAction)
|
||||||
+ " and offset for clang " + PrintToString(positionForClangOffset)
|
+ " and offset for clang " + PrintToString(positionForClangOffset)
|
||||||
+ " and offset for proprosal " + PrintToString(positionForProposalOffset))
|
+ " and offset for proprosal " + PrintToString(positionForProposalOffset)
|
||||||
|
+ " and addSnippets " + PrintToString(addSnippets))
|
||||||
{
|
{
|
||||||
const int actualPositionForClangOffset = arg.positionForClang() - positionInText;
|
const int actualPositionForClangOffset = arg.positionForClang() - positionInText;
|
||||||
const int actualPositionForProposalOffset = arg.positionForProposal() - positionInText;
|
const int actualPositionForProposalOffset = arg.positionForProposal() - positionInText;
|
||||||
|
|
||||||
if (arg.completionAction() != completionAction
|
if (arg.completionAction() != completionAction
|
||||||
|| actualPositionForClangOffset != positionForClangOffset
|
|| actualPositionForClangOffset != positionForClangOffset
|
||||||
|| actualPositionForProposalOffset != positionForProposalOffset) {
|
|| actualPositionForProposalOffset != positionForProposalOffset
|
||||||
|
|| addSnippets != arg.addSnippets()) {
|
||||||
*result_listener << "completion action is " << PrintToString(arg.completionAction())
|
*result_listener << "completion action is " << PrintToString(arg.completionAction())
|
||||||
<< " and offset for clang is " << PrintToString(actualPositionForClangOffset)
|
<< " and offset for clang is " << PrintToString(actualPositionForClangOffset)
|
||||||
<< " and offset for proprosal is " << PrintToString(actualPositionForProposalOffset);
|
<< " and offset for proprosal is " << PrintToString(actualPositionForProposalOffset)
|
||||||
|
<< " and addSnippets is " << PrintToString(arg.addSnippets());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,24 +122,28 @@ MATCHER_P4(HasResult,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Offsets are relative to positionInText
|
// Offsets are relative to positionInText
|
||||||
MATCHER_P4(HasResultWithoutClangDifference,
|
MATCHER_P5(HasResultWithoutClangDifference,
|
||||||
completionAction,
|
completionAction,
|
||||||
positionForClangOffset,
|
positionForClangOffset,
|
||||||
positionForProposalOffset,
|
positionForProposalOffset,
|
||||||
positionInText,
|
positionInText,
|
||||||
|
addSnippets,
|
||||||
std::string(negation ? "hasn't" : "has")
|
std::string(negation ? "hasn't" : "has")
|
||||||
+ " result of completion action " + PrintToString(completionAction)
|
+ " result of completion action " + PrintToString(completionAction)
|
||||||
+ " and offset for clang " + PrintToString(positionForClangOffset)
|
+ " and offset for clang " + PrintToString(positionForClangOffset)
|
||||||
+ " and offset for proprosal " + PrintToString(positionForProposalOffset))
|
+ " and offset for proprosal " + PrintToString(positionForProposalOffset)
|
||||||
|
+ " and addSnippets " + PrintToString(addSnippets))
|
||||||
{
|
{
|
||||||
const int actualPositionForProposalOffset = arg.positionForProposal() - positionInText;
|
const int actualPositionForProposalOffset = arg.positionForProposal() - positionInText;
|
||||||
|
|
||||||
if (arg.completionAction() != completionAction
|
if (arg.completionAction() != completionAction
|
||||||
|| arg.positionForClang() != positionForClangOffset
|
|| arg.positionForClang() != positionForClangOffset
|
||||||
|| actualPositionForProposalOffset != positionForProposalOffset) {
|
|| actualPositionForProposalOffset != positionForProposalOffset
|
||||||
|
|| addSnippets != arg.addSnippets()) {
|
||||||
*result_listener << "completion action is " << PrintToString(arg.completionAction())
|
*result_listener << "completion action is " << PrintToString(arg.completionAction())
|
||||||
<< " and offset for clang is " << PrintToString(arg.positionForClang())
|
<< " and offset for clang is " << PrintToString(arg.positionForClang())
|
||||||
<< " and offset for proprosal is " << PrintToString(actualPositionForProposalOffset);
|
<< " and offset for proprosal is " << PrintToString(actualPositionForProposalOffset)
|
||||||
|
<< " and addSnippets is " << PrintToString(arg.addSnippets());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,224 +176,224 @@ TEST_F(ClangCompletionContextAnalyzer, WordsBeforeCursor)
|
|||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("foo bar@");
|
auto analyzer = runAnalyzer("foo bar@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AfterSpace)
|
TEST_F(ClangCompletionContextAnalyzer, AfterSpace)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("foo @");
|
auto analyzer = runAnalyzer("foo @");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AfterQualification)
|
TEST_F(ClangCompletionContextAnalyzer, AfterQualification)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer(" Foo::@");
|
auto analyzer = runAnalyzer(" Foo::@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AtEndOfDotMember)
|
TEST_F(ClangCompletionContextAnalyzer, AtEndOfDotMember)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("o.mem@");
|
auto analyzer = runAnalyzer("o.mem@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AtEndOfDotMemberWithSpaceInside)
|
TEST_F(ClangCompletionContextAnalyzer, AtEndOfDotMemberWithSpaceInside)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("o. mem@");
|
auto analyzer = runAnalyzer("o. mem@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AtBeginOfDotMember)
|
TEST_F(ClangCompletionContextAnalyzer, AtBeginOfDotMember)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("o.@mem");
|
auto analyzer = runAnalyzer("o.@mem");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AtBeginOfDotMemberWithSpaceInside)
|
TEST_F(ClangCompletionContextAnalyzer, AtBeginOfDotMemberWithSpaceInside)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("o. @mem");
|
auto analyzer = runAnalyzer("o. @mem");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AtEndOfArrow)
|
TEST_F(ClangCompletionContextAnalyzer, AtEndOfArrow)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("o->mem@");
|
auto analyzer = runAnalyzer("o->mem@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AtEndOfArrowWithSpaceInside)
|
TEST_F(ClangCompletionContextAnalyzer, AtEndOfArrowWithSpaceInside)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("o-> mem@");
|
auto analyzer = runAnalyzer("o-> mem@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AtBeginOfArrow)
|
TEST_F(ClangCompletionContextAnalyzer, AtBeginOfArrow)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("o->@mem");
|
auto analyzer = runAnalyzer("o->@mem");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AtBeginOfArrowWithSpaceInside)
|
TEST_F(ClangCompletionContextAnalyzer, AtBeginOfArrowWithSpaceInside)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("o-> @mem");
|
auto analyzer = runAnalyzer("o-> @mem");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneAtCall)
|
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneAtCall)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("f(@");
|
auto analyzer = runAnalyzer("f(@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ArgumentTwoAtCall)
|
TEST_F(ClangCompletionContextAnalyzer, ArgumentTwoAtCall)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("f(1,@");
|
auto analyzer = runAnalyzer("f(1,@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -2, -2, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -2, -2, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ArgumentTwoWithSpaceAtCall)
|
TEST_F(ClangCompletionContextAnalyzer, ArgumentTwoWithSpaceAtCall)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("f(1, @");
|
auto analyzer = runAnalyzer("f(1, @");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, WhitespaceAfterFunctionName)
|
TEST_F(ClangCompletionContextAnalyzer, WhitespaceAfterFunctionName)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("foo (@");
|
auto analyzer = runAnalyzer("foo (@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ConstructorCallWithBraceInitializer)
|
TEST_F(ClangCompletionContextAnalyzer, ConstructorCallWithBraceInitializer)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("f{@");
|
auto analyzer = runAnalyzer("f{@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ArgumentTwoWithSpaceAtConstructorCallWithBraceInitializer)
|
TEST_F(ClangCompletionContextAnalyzer, ArgumentTwoWithSpaceAtConstructorCallWithBraceInitializer)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("f{1, @");
|
auto analyzer = runAnalyzer("f{1, @");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, WhitespaceBeforeConstructorCallWithBraceInitializer)
|
TEST_F(ClangCompletionContextAnalyzer, WhitespaceBeforeConstructorCallWithBraceInitializer)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("foo {@");
|
auto analyzer = runAnalyzer("foo {@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, OpenFunctionScopeNotAConstructor)
|
TEST_F(ClangCompletionContextAnalyzer, OpenFunctionScopeNotAConstructor)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("foo() {@");
|
auto analyzer = runAnalyzer("foo() {@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AfterOpeningParenthesis)
|
TEST_F(ClangCompletionContextAnalyzer, AfterOpeningParenthesis)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("(@");
|
auto analyzer = runAnalyzer("(@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneAtSignal)
|
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneAtSignal)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("SIGNAL(@");
|
auto analyzer = runAnalyzer("SIGNAL(@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::CompleteSignal, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::CompleteSignal, 0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneWithLettersAtSignal)
|
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneWithLettersAtSignal)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("SIGNAL(foo@");
|
auto analyzer = runAnalyzer("SIGNAL(foo@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::CompleteSignal, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::CompleteSignal, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneAtSlot)
|
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneAtSlot)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("SLOT(@");
|
auto analyzer = runAnalyzer("SLOT(@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::CompleteSlot, -0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::CompleteSlot, -0, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneWithLettersAtSlot)
|
TEST_F(ClangCompletionContextAnalyzer, ArgumentOneWithLettersAtSlot)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("SLOT(foo@");
|
auto analyzer = runAnalyzer("SLOT(foo@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::CompleteSlot, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::CompleteSlot, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, DoxygenWithBackslash)
|
TEST_F(ClangCompletionContextAnalyzer, DoxygenWithBackslash)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("//! \\@");
|
auto analyzer = runAnalyzer("//! \\@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteDoxygenKeyword, -1, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteDoxygenKeyword, -1, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, DoxygenWithAt)
|
TEST_F(ClangCompletionContextAnalyzer, DoxygenWithAt)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("//! @@");
|
auto analyzer = runAnalyzer("//! @@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteDoxygenKeyword, -1, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteDoxygenKeyword, -1, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, DoxygenWithParameter)
|
TEST_F(ClangCompletionContextAnalyzer, DoxygenWithParameter)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("//! \\par@");
|
auto analyzer = runAnalyzer("//! \\par@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteDoxygenKeyword, -1, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteDoxygenKeyword, -1, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, Preprocessor)
|
TEST_F(ClangCompletionContextAnalyzer, Preprocessor)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("#@");
|
auto analyzer = runAnalyzer("#@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompletePreprocessorDirective, -1, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompletePreprocessorDirective, -1, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, PreprocessorIf)
|
TEST_F(ClangCompletionContextAnalyzer, PreprocessorIf)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("#if@");
|
auto analyzer = runAnalyzer("#if@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompletePreprocessorDirective, -1, -2, positionInText));
|
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompletePreprocessorDirective, -1, -2, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, LocalInclude)
|
TEST_F(ClangCompletionContextAnalyzer, LocalInclude)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("#include \"foo@\"");
|
auto analyzer = runAnalyzer("#include \"foo@\"");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteIncludePath, -1, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteIncludePath, -1, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, GlobalInclude)
|
TEST_F(ClangCompletionContextAnalyzer, GlobalInclude)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("#include <foo@>");
|
auto analyzer = runAnalyzer("#include <foo@>");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteIncludePath, -1, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteIncludePath, -1, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, GlocalIncludeWithDirectory)
|
TEST_F(ClangCompletionContextAnalyzer, GlocalIncludeWithDirectory)
|
||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("#include <foo/@>");
|
auto analyzer = runAnalyzer("#include <foo/@>");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteIncludePath, -1, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResultWithoutClangDifference(CCA::CompleteIncludePath, -1, 0, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AfterQuote)
|
TEST_F(ClangCompletionContextAnalyzer, AfterQuote)
|
||||||
@@ -463,7 +471,7 @@ TEST_F(ClangCompletionContextAnalyzer, AfterOneLineCommentLine)
|
|||||||
auto analyzer = runAnalyzer("// comment\n"
|
auto analyzer = runAnalyzer("// comment\n"
|
||||||
"@");
|
"@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AfterEmptyOneLineComment)
|
TEST_F(ClangCompletionContextAnalyzer, AfterEmptyOneLineComment)
|
||||||
@@ -471,7 +479,7 @@ TEST_F(ClangCompletionContextAnalyzer, AfterEmptyOneLineComment)
|
|||||||
auto analyzer = runAnalyzer("//\n"
|
auto analyzer = runAnalyzer("//\n"
|
||||||
"@");
|
"@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AfterOneLineDoxygenComment1)
|
TEST_F(ClangCompletionContextAnalyzer, AfterOneLineDoxygenComment1)
|
||||||
@@ -479,7 +487,7 @@ TEST_F(ClangCompletionContextAnalyzer, AfterOneLineDoxygenComment1)
|
|||||||
auto analyzer = runAnalyzer("/// comment\n"
|
auto analyzer = runAnalyzer("/// comment\n"
|
||||||
"@");
|
"@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, AfterOneLineDoxygenComment2)
|
TEST_F(ClangCompletionContextAnalyzer, AfterOneLineDoxygenComment2)
|
||||||
@@ -487,7 +495,7 @@ TEST_F(ClangCompletionContextAnalyzer, AfterOneLineDoxygenComment2)
|
|||||||
auto analyzer = runAnalyzer("//! comment \n"
|
auto analyzer = runAnalyzer("//! comment \n"
|
||||||
"@");
|
"@");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, BeginEndComment)
|
TEST_F(ClangCompletionContextAnalyzer, BeginEndComment)
|
||||||
@@ -529,7 +537,7 @@ TEST_F(ClangCompletionContextAnalyzer, TemplatedFunctionSecondArgument)
|
|||||||
{
|
{
|
||||||
auto analyzer = runAnalyzer("f < decltype(bar -> member) > (1, @");
|
auto analyzer = runAnalyzer("f < decltype(bar -> member) > (1, @");
|
||||||
|
|
||||||
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -3, -3, positionInText));
|
ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -3, -3, positionInText, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangCompletionContextAnalyzer, FunctionNameStartPosition)
|
TEST_F(ClangCompletionContextAnalyzer, FunctionNameStartPosition)
|
||||||
|
Reference in New Issue
Block a user