Files
qt-creator/tests/unit/unittest/data/highlightingmarks.cpp
Artem Sokolovskii a013d75728 CppEditor: Change parsing opposite bracket
Fixed behavior:
- when comparing sign was determined as angle bracket
- when in complex combination brackets, an opposite bracket
was detected not correct
- not correct mismatch case highlightning
Added tests for the cases form bug 26395

Fixes: QTCREATORBUG-26400
Fixes: QTCREATORBUG-26395
Change-Id: Ic45566d2677f80fb9a8e4fe830307254dd1db51d
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2021-10-25 14:07:44 +00:00

812 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

auto *Variable = "Variable";
auto *u8Variable = u8"Variable";
auto *rawVariable = R"(Variable)";
auto Character = 'c';
auto integer = 1;
auto numFloat = 1.2f;
int function(int x)
{
return x;
}
struct Foo
{
void memberFunction() {}
};
int functionDeclaration(int x);
struct Foo2
{
void memberFunction();
};
void f()
{
function(1);
}
struct ConversionFunction {
operator Foo();
operator int();
};
void TypeReference()
{
Foo foo;
}
void LocalVariableDeclaration()
{
Foo foo;
foo.memberFunction();
}
void LocalVariableFunctionArgument(Foo &foo)
{
foo.memberFunction();
}
struct Foo3 {
int ClassMember;
void ClassMemberReference()
{
ClassMember++;
}
};
struct Foo4
{
void MemberFunctionReference();
void function()
{
MemberFunctionReference();
}
};
struct Foo5
{
void StaticMethod();
void function()
{
Foo5::StaticMethod();
}
};
enum Enumeration
{
Enumerator
};
void f2()
{
Enumeration enumeration;
enumeration = Enumerator;
}
class ForwardReference;
class Class
{ public:
Class();
~Class();
};
ForwardReference *f3()
{
Class ConstructorReference;
return 0;
}
union Union
{
};
Union UnionDeclarationReference;
namespace NameSpace {
struct StructInNameSpace {};
}
namespace NameSpaceAlias = NameSpace;
using NameSpace::StructInNameSpace;
NameSpace::StructInNameSpace foo6;
class BaseClass {
public:
virtual void VirtualFunction();
virtual void FinalVirtualFunction();
};
void f8()
{
BaseClass NonVirtualFunctionCall;
NonVirtualFunctionCall.VirtualFunction();
BaseClass *NonVirtualFunctionCallPointer = new BaseClass();
NonVirtualFunctionCallPointer->VirtualFunction();
}
class DerivedClass : public BaseClass
{public:
void VirtualFunction() override;
void FinalVirtualFunction() final;
};
void f8(BaseClass *VirtualFunctionCallPointer)
{
VirtualFunctionCallPointer->VirtualFunction();
}
class FinalClass final : public DerivedClass
{
void FinalClassThisCall();
};
void f8(DerivedClass *FinalVirtualFunctionCallPointer)
{
FinalVirtualFunctionCallPointer->FinalVirtualFunction();
}
void f9(BaseClass *NonFinalVirtualFunctionCallPointer)
{
NonFinalVirtualFunctionCallPointer->FinalVirtualFunction();
}
void f10(FinalClass *ClassFinalVirtualFunctionCallPointer)
{
ClassFinalVirtualFunctionCallPointer->VirtualFunction();
}
class Operator {
public:
Operator operator+=(const Operator &first);
};
Operator operator+(const Operator &first, const Operator &second);
void f10()
{
auto PlusOperator = Operator() + Operator();
Operator PlusAssignOperator;
PlusAssignOperator += Operator();
}
/* Comment */
#define PreprocessorDefinition Class
#define MacroDefinition(a,b) ((a)>(b)?(a):(b))
void f11()
{
MacroDefinition(2, 4);
}
#include "highlightingmarks.h"
void f12() {
GOTO_LABEL:
goto GOTO_LABEL;
}
template <class T>
void TemplateFunction(T v)
{
T XXXXX = v;
}
void TemplateReference()
{
TemplateFunction(1);
// std::vector<int> TemplateIntance;
}
template <class T>
class TemplateFoo {};
template <class TemplateTypeParameter = Foo, int NonTypeTemplateParameter = 1, template <class> class TemplateTemplateParameter = TemplateFoo>
void TemplateFunction(TemplateTypeParameter TemplateParameter)
{
TemplateTypeParameter TemplateTypeParameterReference;
auto NonTypeTemplateParameterReference = NonTypeTemplateParameter;
TemplateTemplateParameter<TemplateTypeParameter> TemplateTemplateParameterReference;
}
void FinalClass::FinalClassThisCall()
{
VirtualFunction();
}
void OutputArgument(int &one, const int &two, int *three=0);
void f12b()
{
int One;
OutputArgument(One, 2);
}
#include <highlightingmarks.h>
#define FOREACH(variable, container) \
variable; \
auto x = container;
#define foreach2 FOREACH
void f13()
{
auto container = 1;
foreach2(int index, container);
}
class SecondArgumentInMacroExpansionIsField {
int container = 1;
void f()
{
foreach2(int index, container);
}
};
typedef unsigned uint32;
enum EnumerationType : uint32
{
Other = 0,
};
struct TypeInCast {
void function();
};
void f14()
{
static_cast<void (TypeInCast::*)()>(&TypeInCast::function);
reinterpret_cast<void (TypeInCast::*)()>(&TypeInCast::function);
}
using IntegerAlias = int;
using SecondIntegerAlias = IntegerAlias;
typedef int IntegerTypedef;
using Function = void (*)();
void f15()
{
IntegerAlias integerAlias;
SecondIntegerAlias secondIntegerAlias;
IntegerTypedef integerTypedef;
Function();
}
class FriendFoo
{
public:
friend class FooFriend;
friend bool operator==(const FriendFoo &first, const FriendFoo &second);
};
class FieldInitialization
{
public:
FieldInitialization() :
member(0)
{}
int member;
};
template<class Type>
void TemplateFunctionCall(Type type)
{
type + type;
}
void f16()
{
TemplateFunctionCall(1);
}
template <typename T>
class TemplatedType
{
T value = T();
};
void f17()
{
TemplatedType<int> TemplatedTypeDeclaration;
}
void f18()
{
auto value = 1 + 2;
}
class ScopeClass
{
public:
static void ScopeOperator();
};
void f19()
{
ScopeClass::ScopeOperator();
}
namespace TemplateClassNamespace {
template<class X>
class TemplateClass
{
};
}
void f20()
{
TemplateClassNamespace::TemplateClass<ScopeClass> TemplateClassDefinition;
}
void f21()
{
typedef int TypeDefDeclaration;
TypeDefDeclaration TypeDefDeclarationUsage;
}
typedef int EnumerationTypeDef;
enum Enumeration2 : EnumerationTypeDef {
};
struct Bar {
Bar &operator[](int &key);
};
void argumentToUserDefinedIndexOperator(Bar object, int index = 3)
{
object[index];
}
struct LambdaTester
{
int member = 0;
void func() {
const int var = 42, var2 = 84;
auto lambda = [var, this](int input) {
return var + input + member;
};
lambda(var2);
}
};
void NonConstReferenceArgument(int &argument);
void f22()
{
int x = 1;
NonConstReferenceArgument(x);
}
void ConstReferenceArgument(const int &argument);
void f23()
{
int x = 1;
ConstReferenceArgument(x);
}
void RValueReferenceArgument(int &&argument);
void f24()
{
int x = 1;
RValueReferenceArgument(static_cast<int&&>(x));
}
void NonConstPointerArgument(int *argument);
void f25()
{
int *x;
NonConstPointerArgument(x);
}
void PointerToConstArgument(const int *argument);
void ConstPointerArgument(int *const argument);
void f26()
{
int *x;
PointerToConstArgument(x);
ConstPointerArgument(x);
}
void NonConstReferenceArgumentCallInsideCall(int x, int &argument);
int GetArgument(int x);
void f27()
{
int x = 1;
NonConstReferenceArgumentCallInsideCall(GetArgument(x), x);
}
void f28(int &Reference)
{
NonConstReferenceArgument(Reference);
}
void f29()
{
int x;
NonConstPointerArgument(&x);
}
struct NonConstPointerArgumentAsMemberOfClass
{
int member;
};
void f30()
{
NonConstPointerArgumentAsMemberOfClass instance;
NonConstReferenceArgument(instance.member);
}
struct NonConstReferenceArgumentConstructor
{
NonConstReferenceArgumentConstructor() = default;
NonConstReferenceArgumentConstructor(NonConstReferenceArgumentConstructor &other);
void NonConstReferenceArgumentMember(NonConstReferenceArgumentConstructor &other);
};
void f31()
{
NonConstReferenceArgumentConstructor instance;
NonConstReferenceArgumentConstructor copy(instance);
}
struct NonConstReferenceMemberInitialization
{
NonConstReferenceMemberInitialization(int &foo)
: foo(foo)
{}
int &foo;
};
template<class T> class Coo;
template<class T> class Coo<T*>;
namespace N { void goo(); }
using N::goo;
#if 1
#endif
#include <new>
struct OtherOperator { void operator()(int); };
void g(OtherOperator o, int var)
{
o(var);
}
void NonConstPointerArgument(int &argument);
struct PointerGetterClass
{
int &getter();
};
void f32()
{
PointerGetterClass x;
NonConstPointerArgument(x.getter());
}
namespace N { template <typename T> void SizeIs(); }
using N::SizeIs;
void BaseClass::VirtualFunction() {}
class WithVirtualFunctionDefined {
virtual void VirtualFunctionDefinition() {};
};
namespace NFoo { namespace NBar { namespace NTest { class NamespaceTypeSpelling; } } }
Undeclared u;
#define Q_PROPERTY(arg) static_assert("Q_PROPERTY", #arg); // Keep these in sync with wrappedQtHeaders/QtCore/qobjectdefs.h
#define SIGNAL(arg) #arg
#define SLOT(arg) #arg
class Property {
Q_PROPERTY(const volatile unsigned long long * prop READ getProp WRITE setProp NOTIFY propChanged)
Q_PROPERTY(const QString str READ getStr)
};
struct X {
void operator*(int) {}
};
void operator*(X, float) {}
void CallSite() {
X x;
int y = 10;
float z = 10;
x * y;
x * z;
}
struct Dummy {
Dummy operator<<=(int key);
Dummy operator()(int a);
int& operator[] (unsigned index);
void* operator new(unsigned size);
void operator delete(void* ptr);
void* operator new[](unsigned size);
void operator delete[](void* ptr);
};
void TryOverloadedOperators(Dummy object)
{
object <<= 3;
Dummy stacked;
stacked(4);
stacked[1];
int *i = new int;
Dummy* use_new = new Dummy();
delete use_new;
Dummy* many = new Dummy[10];
delete [] many;
}
enum {
Test = 0
};
namespace {
class B {
struct {
int a;
};
};
}
struct Dummy2 {
Dummy2 operator()();
int operator*();
Dummy2 operator=(int foo);
};
void TryOverloadedOperators2(Dummy object)
{
Dummy2 dummy2;
dummy2();
*dummy2;
dummy2 = 3;
}
int OperatorTest() {
return 1 < 2 ? 20 : 30;
}
int signalSlotTest() {
SIGNAL(something(QString));
SLOT(something(QString));
SIGNAL(something(QString (*func1)(QString)));
1 == 2;
}
class NonConstParameterConstructor
{
NonConstParameterConstructor() = default;
NonConstParameterConstructor(NonConstParameterConstructor &buildDependenciesStorage);
void Call()
{
NonConstParameterConstructor foo;
NonConstParameterConstructor bar(foo);
}
};
class StaticMembersAccess
{
protected:
static int protectedValue;
private:
static int privateValue;
};
template <int i, int j> struct S { };
template <int i> using spec = S<i, 1>;
spec<2> s;
class Property {
Q_PROPERTY(
const
volatile
unsigned
long
long
*
prop
READ
getProp
WRITE
setProp
NOTIFY
propChanged
)
};
void structuredBindingTest() {
const int a[] = {1, 2};
const auto [x, y] = a;
}
#define ASSIGN(decl, ptr) do { decl = *ptr; } while (false)
#define ASSIGN2 ASSIGN
void f4()
{
int *thePointer = 0;
ASSIGN(int i, thePointer);
ASSIGN2(int i, thePointer);
}
const int MyConstant = 8;
void f5()
{
int arr[MyConstant][8];
}
static int GlobalVar = 0;
namespace N { [[deprecated]] void f(); }
template<typename T>
void func(T v);
void f6()
{
GlobalVar = 5;
func(1); // QTCREATORBUG-21856
}
template<typename T>
void func(T v) {
GlobalVar = 5;
}
static std::vector<std::pair<int, int>> pv;
template <class T, long S>
struct vecn
{
T v[S];
};
template <class T, long S>
static inline constexpr vecn<T, S> operator<(vecn<T, S> a, vecn<T, S> b)
{
vecn<T, S> x = vecn<T, S>{};
for(long i = 0; i < S; ++i)
{
x[i] = a[i] < b[i];
}
return x;
}
const char *cyrillic = "б";
struct foo {
#define blubb
};
#define test_micro(A,B) ((A##B>1?A:B))
int a = (a1 > 0);
int func() {
int a = (a1 > 0);
}
namespace std {
template<typename T1, typename T2> struct pair;
template<typename T> struct vector;
}
static std::vector<std::pair<int, int>> pvr;