1/**
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef ES2PANDA_LEXER_TOKEN_SOURCE_LOCATION_H
17#define ES2PANDA_LEXER_TOKEN_SOURCE_LOCATION_H
18
19#include <macros.h>
20#include <util/ustring.h>
21
22#include <cstddef>
23#include <cstdint>
24#include <vector>
25
26namespace panda::es2panda::lexer {
27
28enum class SourceLocationFlag {
29    VALID_SOURCE_LOCATION,
30    INVALID_SOURCE_LOCATION
31};
32
33class SourcePosition {
34public:
35    explicit SourcePosition() noexcept = default;
36    explicit SourcePosition(size_t i, size_t l) noexcept : index(i), line(l) {}
37    DEFAULT_COPY_SEMANTIC(SourcePosition);
38    DEFAULT_MOVE_SEMANTIC(SourcePosition);
39    ~SourcePosition() = default;
40
41    size_t index {};
42    size_t line {};
43};
44
45class SourceRange {
46public:
47    explicit SourceRange() noexcept = default;
48    SourceRange(SourcePosition s, SourcePosition e) noexcept : start(s), end(e) {}
49    DEFAULT_COPY_SEMANTIC(SourceRange);
50    DEFAULT_MOVE_SEMANTIC(SourceRange);
51    ~SourceRange() = default;
52
53    SourcePosition start {};
54    SourcePosition end {};
55};
56
57class SourceLocation {
58public:
59    explicit SourceLocation() noexcept = default;
60    explicit SourceLocation(size_t l, size_t c) noexcept : line(l), col(c) {}
61    DEFAULT_COPY_SEMANTIC(SourceLocation);
62    DEFAULT_MOVE_SEMANTIC(SourceLocation);
63    ~SourceLocation() = default;
64
65    size_t line {};
66    size_t col {};
67};
68
69class Range {
70public:
71    explicit Range(size_t bS) noexcept : byteSize(bS) {}
72
73    DEFAULT_COPY_SEMANTIC(Range);
74    DEFAULT_MOVE_SEMANTIC(Range);
75    ~Range() = default;
76
77    size_t byteSize {};
78    size_t cnt {1};
79};
80
81class OffsetEntry {
82public:
83    explicit OffsetEntry(size_t l) : lineStart(l), offset_(l) {};
84
85    DEFAULT_COPY_SEMANTIC(OffsetEntry);
86    DEFAULT_MOVE_SEMANTIC(OffsetEntry);
87    ~OffsetEntry() = default;
88
89    void AddCol(size_t offset);
90
91    std::vector<Range> ranges {};
92    size_t lineStart {};
93
94private:
95    size_t offset_ {};
96};
97
98class LineIndex {
99public:
100    explicit LineIndex(const util::StringView &source) noexcept;
101    explicit LineIndex() noexcept = default;
102    DEFAULT_COPY_SEMANTIC(LineIndex);
103    DEFAULT_MOVE_SEMANTIC(LineIndex);
104    ~LineIndex() = default;
105
106    SourceLocation GetLocation(SourcePosition pos) noexcept;
107
108private:
109    std::vector<OffsetEntry> entrys_;
110};
111
112}  // namespace panda::es2panda::lexer
113
114#endif
115