1/**
2 * Copyright (c) 2021-2024 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 ark::es2panda::lexer {
27class SourcePosition {
28public:
29    explicit SourcePosition() noexcept = default;
30    explicit SourcePosition(size_t i, size_t l) noexcept : index(i), line(l) {}
31    DEFAULT_COPY_SEMANTIC(SourcePosition);
32    DEFAULT_MOVE_SEMANTIC(SourcePosition);
33    ~SourcePosition() = default;
34
35    // NOLINTBEGIN(misc-non-private-member-variables-in-classes)
36    size_t index {};
37    size_t line {};
38    // NOLINTEND(misc-non-private-member-variables-in-classes)
39};
40
41class SourceRange {
42public:
43    explicit SourceRange() noexcept = default;
44    SourceRange(SourcePosition s, SourcePosition e) noexcept : start(s), end(e) {}
45    DEFAULT_COPY_SEMANTIC(SourceRange);
46    DEFAULT_MOVE_SEMANTIC(SourceRange);
47    ~SourceRange() = default;
48
49    // NOLINTBEGIN(misc-non-private-member-variables-in-classes)
50    SourcePosition start {};
51    SourcePosition end {};
52    // NOLINTEND(misc-non-private-member-variables-in-classes)
53};
54
55class SourceLocation {
56public:
57    explicit SourceLocation() noexcept = default;
58    explicit SourceLocation(size_t l, size_t c) noexcept : line(l), col(c) {}
59    DEFAULT_COPY_SEMANTIC(SourceLocation);
60    DEFAULT_MOVE_SEMANTIC(SourceLocation);
61    ~SourceLocation() = default;
62
63    // NOLINTBEGIN(misc-non-private-member-variables-in-classes)
64    size_t line {};
65    size_t col {};
66    // NOLINTEND(misc-non-private-member-variables-in-classes)
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    // NOLINTBEGIN(misc-non-private-member-variables-in-classes)
78    size_t byteSize {};
79    size_t cnt {1};
80    // NOLINTEND(misc-non-private-member-variables-in-classes)
81};
82
83class OffsetEntry {
84public:
85    explicit OffsetEntry(size_t l) : lineStart(l), offset_(l) {};
86
87    DEFAULT_COPY_SEMANTIC(OffsetEntry);
88    DEFAULT_MOVE_SEMANTIC(OffsetEntry);
89    ~OffsetEntry() = default;
90
91    void AddCol(size_t offset);
92
93    // NOLINTBEGIN(misc-non-private-member-variables-in-classes)
94    std::vector<Range> ranges {};
95    size_t lineStart {};
96    // NOLINTEND(misc-non-private-member-variables-in-classes)
97
98private:
99    size_t offset_ {};
100};
101
102class LineIndex {
103public:
104    explicit LineIndex(const util::StringView &source) noexcept;
105    NO_COPY_SEMANTIC(LineIndex);
106    NO_MOVE_SEMANTIC(LineIndex);
107    ~LineIndex() = default;
108
109    SourceLocation GetLocation(SourcePosition pos) const noexcept;
110
111private:
112    std::vector<OffsetEntry> entries_;
113};
114}  // namespace ark::es2panda::lexer
115
116#endif
117