forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSourceManager.cpp
87 lines (66 loc) · 2.87 KB
/
SourceManager.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "swift/Basic/SourceManager.h"
#include "llvm/Support/MemoryBuffer.h"
#include "gtest/gtest.h"
#include <vector>
using namespace swift;
using namespace llvm;
static std::vector<SourceLoc> tokenize(SourceManager &SM, StringRef Source) {
unsigned ID = SM.addMemBufferCopy(Source);
const MemoryBuffer *Buf = SM.getLLVMSourceMgr().getMemoryBuffer(ID);
SourceLoc BeginLoc(SMLoc::getFromPointer(Buf->getBuffer().begin()));
std::vector<SourceLoc> Result;
Result.push_back(BeginLoc);
for (unsigned i = 1, e = Source.size(); i != e; ++i) {
if (Source[i - 1] == ' ')
Result.push_back(BeginLoc.getAdvancedLoc(i));
}
return Result;
}
TEST(SourceManager, IsBeforeInBuffer) {
SourceManager SM;
auto Locs = tokenize(SM, "aaa bbb ccc ddd");
EXPECT_TRUE(SM.isBeforeInBuffer(Locs[0], Locs[1]));
EXPECT_TRUE(SM.isBeforeInBuffer(Locs[1], Locs[2]));
EXPECT_TRUE(SM.isBeforeInBuffer(Locs[2], Locs[3]));
EXPECT_TRUE(SM.isBeforeInBuffer(Locs[0], Locs[3]));
EXPECT_TRUE(SM.isBeforeInBuffer(Locs[0], Locs[0].getAdvancedLoc(1)));
EXPECT_TRUE(SM.isBeforeInBuffer(Locs[0].getAdvancedLoc(1), Locs[1]));
}
TEST(SourceManager, RangeContainsTokenLoc) {
SourceManager SM;
auto Locs = tokenize(SM, "aaa bbb ccc ddd");
SourceRange R_aa(Locs[0], Locs[0]);
SourceRange R_ab(Locs[0], Locs[1]);
SourceRange R_ac(Locs[0], Locs[2]);
SourceRange R_bc(Locs[1], Locs[2]);
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_aa, Locs[0]));
EXPECT_FALSE(SM.rangeContainsTokenLoc(R_aa, Locs[0].getAdvancedLoc(1)));
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_ab, Locs[0]));
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_ab, Locs[0].getAdvancedLoc(1)));
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_ab, Locs[1]));
EXPECT_FALSE(SM.rangeContainsTokenLoc(R_ab, Locs[1].getAdvancedLoc(1)));
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_ac, Locs[0]));
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_ac, Locs[0].getAdvancedLoc(1)));
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_ac, Locs[1]));
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_ac, Locs[1].getAdvancedLoc(1)));
EXPECT_TRUE(SM.rangeContainsTokenLoc(R_ac, Locs[2]));
EXPECT_FALSE(SM.rangeContainsTokenLoc(R_ac, Locs[2].getAdvancedLoc(1)));
EXPECT_FALSE(SM.rangeContainsTokenLoc(R_bc, Locs[0]));
EXPECT_FALSE(SM.rangeContainsTokenLoc(R_bc, Locs[0].getAdvancedLoc(1)));
}
TEST(SourceManager, RangeContains) {
SourceManager SM;
auto Locs = tokenize(SM, "aaa bbb ccc ddd");
SourceRange R_aa(Locs[0], Locs[0]);
SourceRange R_ab(Locs[0], Locs[1]);
SourceRange R_ac(Locs[0], Locs[2]);
SourceRange R_ad(Locs[0], Locs[3]);
SourceRange R_bc(Locs[1], Locs[2]);
EXPECT_TRUE(SM.rangeContains(R_ab, R_aa));
EXPECT_TRUE(SM.rangeContains(R_ac, R_aa));
EXPECT_TRUE(SM.rangeContains(R_ac, R_ab));
EXPECT_TRUE(SM.rangeContains(R_ad, R_ab));
EXPECT_TRUE(SM.rangeContains(R_ad, R_ac));
EXPECT_TRUE(SM.rangeContains(R_ac, R_bc));
EXPECT_TRUE(SM.rangeContains(R_ad, R_bc));
}