mirror of
https://github.com/dart-lang/sdk
synced 2024-10-15 00:10:36 +00:00
c47f15d144
Change-Id: Iaa43d3776f1dde10eefc6b951816a12abd5a3ce2 Bug: https://github.com/flutter/flutter/issues/100751 TEST=Added kernel_test.cc, and tested before and after the switch Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/268841 Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
97 lines
3.7 KiB
C++
97 lines
3.7 KiB
C++
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#include <type_traits>
|
|
|
|
#include "platform/globals.h"
|
|
|
|
#include "vm/kernel.h"
|
|
#include "vm/object.h"
|
|
#include "vm/unit_test.h"
|
|
|
|
namespace dart {
|
|
|
|
const dart::TypedData& CreateLineStartsData() {
|
|
const intptr_t raw_line_starts_data[] = {
|
|
0, 8, 12, 17, 18, 20, 23, 30, 31, 33,
|
|
};
|
|
const intptr_t length = std::extent<decltype(raw_line_starts_data)>::value;
|
|
ASSERT(length > 0);
|
|
const TypedData& line_starts_data = TypedData::Handle(
|
|
TypedData::New(kTypedDataUint16ArrayCid, length, Heap::kOld));
|
|
for (intptr_t i = 0; i < length; ++i) {
|
|
line_starts_data.SetUint16(i << 1,
|
|
static_cast<int16_t>(raw_line_starts_data[i]));
|
|
}
|
|
return line_starts_data;
|
|
}
|
|
|
|
ISOLATE_UNIT_TEST_CASE(KernelLineStartsReader_MaxPosition) {
|
|
kernel::KernelLineStartsReader reader(CreateLineStartsData(), thread->zone());
|
|
EXPECT_EQ(33u, reader.MaxPosition());
|
|
}
|
|
|
|
void ExpectLocationForPosition(const kernel::KernelLineStartsReader& reader,
|
|
intptr_t position,
|
|
intptr_t expected_line,
|
|
intptr_t expected_col) {
|
|
intptr_t line;
|
|
intptr_t col;
|
|
EXPECT_EQ(true, reader.LocationForPosition(position, &line, &col));
|
|
EXPECT_EQ(expected_line, line);
|
|
EXPECT_EQ(expected_col, col);
|
|
}
|
|
|
|
ISOLATE_UNIT_TEST_CASE(KernelLineStartsReader_LocationForPosition) {
|
|
kernel::KernelLineStartsReader reader(CreateLineStartsData(), thread->zone());
|
|
ExpectLocationForPosition(reader, 0, 1, 1);
|
|
ExpectLocationForPosition(reader, 4, 1, 5);
|
|
ExpectLocationForPosition(reader, 8, 2, 1);
|
|
ExpectLocationForPosition(reader, 14, 3, 3);
|
|
ExpectLocationForPosition(reader, 17, 4, 1);
|
|
ExpectLocationForPosition(reader, 19, 5, 2);
|
|
ExpectLocationForPosition(reader, 22, 6, 3);
|
|
ExpectLocationForPosition(reader, 29, 7, 7);
|
|
ExpectLocationForPosition(reader, 30, 8, 1);
|
|
ExpectLocationForPosition(reader, 32, 9, 2);
|
|
ExpectLocationForPosition(reader, 33, 10, 1);
|
|
|
|
intptr_t line;
|
|
intptr_t col;
|
|
EXPECT_EQ(false, reader.LocationForPosition(-1, &line, &col));
|
|
EXPECT_EQ(false, reader.LocationForPosition(34, &line, &col));
|
|
}
|
|
|
|
void ExpectTokenRangeAtLine(const kernel::KernelLineStartsReader& reader,
|
|
intptr_t line,
|
|
intptr_t expected_first_token,
|
|
intptr_t expected_last_token) {
|
|
TokenPosition first_token = TokenPosition::Synthetic(0);
|
|
TokenPosition last_token = TokenPosition::Synthetic(0);
|
|
EXPECT_EQ(true, reader.TokenRangeAtLine(line, &first_token, &last_token));
|
|
EXPECT_EQ(expected_first_token, first_token.Serialize());
|
|
EXPECT_EQ(expected_last_token, last_token.Serialize());
|
|
}
|
|
|
|
ISOLATE_UNIT_TEST_CASE(KernelLineStartsReader_TokenRangeAtLine) {
|
|
kernel::KernelLineStartsReader reader(CreateLineStartsData(), thread->zone());
|
|
ExpectTokenRangeAtLine(reader, 1, 0, 7);
|
|
ExpectTokenRangeAtLine(reader, 2, 8, 11);
|
|
ExpectTokenRangeAtLine(reader, 3, 12, 16);
|
|
ExpectTokenRangeAtLine(reader, 4, 17, 17);
|
|
ExpectTokenRangeAtLine(reader, 5, 18, 19);
|
|
ExpectTokenRangeAtLine(reader, 6, 20, 22);
|
|
ExpectTokenRangeAtLine(reader, 7, 23, 29);
|
|
ExpectTokenRangeAtLine(reader, 8, 30, 30);
|
|
ExpectTokenRangeAtLine(reader, 9, 31, 32);
|
|
ExpectTokenRangeAtLine(reader, 10, 33, 33);
|
|
|
|
TokenPosition first_token = TokenPosition::Synthetic(0);
|
|
TokenPosition last_token = TokenPosition::Synthetic(0);
|
|
EXPECT_EQ(false, reader.TokenRangeAtLine(0, &first_token, &last_token));
|
|
EXPECT_EQ(false, reader.TokenRangeAtLine(11, &first_token, &last_token));
|
|
}
|
|
|
|
} // namespace dart
|