diff --git a/tools/ide_query/OWNERS b/tools/ide_query/OWNERS new file mode 100644 index 0000000000..914a9a2ee0 --- /dev/null +++ b/tools/ide_query/OWNERS @@ -0,0 +1,4 @@ +ialiyev@google.com +ivankirichenko@google.com +kadircet@google.com +michaelmerg@google.com diff --git a/tools/ide_query/prober_scripts/cpp/Android.bp b/tools/ide_query/prober_scripts/cpp/Android.bp new file mode 100644 index 0000000000..5190210924 --- /dev/null +++ b/tools/ide_query/prober_scripts/cpp/Android.bp @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_binary { + name: "ide_query_proberscript_cc", + srcs: [ + "general.cc", + "foo.proto", + ], + cflags: ["-Wno-unused-parameter"], + proto: { + type: "lite", + }, +} diff --git a/tools/ide_query/prober_scripts/cpp/foo.proto b/tools/ide_query/prober_scripts/cpp/foo.proto new file mode 100644 index 0000000000..5a851474e1 --- /dev/null +++ b/tools/ide_query/prober_scripts/cpp/foo.proto @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto3"; + +package ide_query.prober_scripts; + +message ProtoMsg { + // Test proto field. + int64 some_field = 1; + // ^ some_field +} diff --git a/tools/ide_query/prober_scripts/cpp/general.cc b/tools/ide_query/prober_scripts/cpp/general.cc new file mode 100644 index 0000000000..0f0639be5e --- /dev/null +++ b/tools/ide_query/prober_scripts/cpp/general.cc @@ -0,0 +1,119 @@ +// Copyright (C) 2024 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "foo.pb.h" + +using ide_query::prober_scripts::ProtoMsg; + +void Foo(int x, double y) {} +float Foo(float x, float y) { return 0.0f; } + +void TestCompletion() { + // Test completion on protos and fuzzy matching of completion suggestions. + + ProtoMsg foo; + + // ^ + + // step + // workspace.waitForReady() + // type("f") + // completion.trigger() + // assert completion.items.filter(label="foo") + // delline() + // type("foo.sf") + // completion.trigger() + // assert completion.items.filter( + // label="some_field.*", + // insertText="some_field.*", + // ) + // delline() + + std::vector v; + + // ^ + + // step + // workspace.waitForReady() + // type("v.push") + // completion.trigger() + // assert completion.items.filter(label="push_back.*") + // delline() +} + +void TestNavigation() { + std::vector ints; + // | | ints + // ^ + + // step + // ; Test navigation to definition on STL types. + // workspace.waitForReady() + // navigation.trigger() + // assert navigation.items.filter(path=".*/vector") + + ints.push_back(0); + // ^ + + // step + // ; Test navigation to definition on local symbols. + // workspace.waitForReady() + // navigation.trigger() + // assert navigation.items.filter(path=".*/general.cc", range=ints) + + ProtoMsg msg; + msg.set_some_field(0); + // ^ + + // step + // ; Test navigation to definition on proto fields. We do not check for a + // ; specific target as it can be in generated code. + // workspace.waitForReady() + // navigation.trigger() + // assert navigation.items +} + +void TestParameterInfo() { + std::vector v; + v.push_back(0); + // ^ + + // step + // ; Test the signature help for STL functions. We do not check for a specific + // ; text as it can be implementation-dependent. + // workspace.waitForReady() + // paraminfo.trigger() + // assert paraminfo.items + + Foo(0, 0.0); + // ^ + + // step + // ; Test the signature help for the function 'Foo' having two overloads. + // workspace.waitForReady() + // paraminfo.trigger() + // assert paraminfo.items.filter( + // active=true, + // label="Foo\\(int x, double y\\) -> void", + // selection="double y", + // ) + // assert paraminfo.items.filter( + // active=false, + // label="Foo\\(float x, float y\\) -> float", + // ) +} + +int main() { return 0; } diff --git a/tools/ide_query/prober_scripts/cpp_suite.textpb b/tools/ide_query/prober_scripts/cpp_suite.textpb new file mode 100644 index 0000000000..83772699ba --- /dev/null +++ b/tools/ide_query/prober_scripts/cpp_suite.textpb @@ -0,0 +1,5 @@ +tests: { + name: "general" + scripts: "build/make/tools/ide_query/prober_scripts/cpp/general.cc" + scripts: "build/make/tools/ide_query/prober_scripts/cpp/foo.proto" +} diff --git a/tools/ide_query/prober_scripts/ide_query.out b/tools/ide_query/prober_scripts/ide_query.out new file mode 100644 index 0000000000..cd7ce6d258 --- /dev/null +++ b/tools/ide_query/prober_scripts/ide_query.out @@ -0,0 +1,239 @@ + +out–a +8build/make/tools/ide_query/prober_scripts/cpp/general.cc8prebuilts/clang/host/linux-x86/clang-r522817/bin/clang++-mthumb-Os-fomit-frame-pointer-mllvm-enable-shrink-wrap=false-O2-Wall-Wextra -Winit-self-Wpointer-arith-Wunguarded-availability-Werror=date-time-Werror=int-conversion-Werror=pragma-pack&-Werror=pragma-pack-suspicious-include-Werror=sizeof-array-div-Werror=string-plus-int'-Werror=unreachable-code-loop-increment"-Wno-error=deprecated-declarations-Wno-c99-designator-Wno-gnu-folding-constant"-Wno-inconsistent-missing-override-Wno-error=reorder-init-list-Wno-reorder-init-list-Wno-sign-compare -Wno-unused -DANDROID-DNDEBUG-UDEBUG(-D__compiler_offsetof=__builtin_offsetof*-D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ -faddrsig-fdebug-default-version=5-fcolor-diagnostics-ffp-contract=off-fno-exceptions-fno-strict-aliasing-fmessage-length=0#-fno-relaxed-template-template-args-gsimple-template-names-gz=zstd-no-canonical-prefixes-Wno-error=format"-fdebug-prefix-map=/proc/self/cwd=-ftrivial-auto-var-init=zero-g-ffunction-sections-fdata-sections-fno-short-enums-funwind-tables-fstack-protector-strong-Wa,--noexecstack-D_FORTIFY_SOURCE=2-Wstrict-aliasing=2-Werror=return-type-Werror=non-virtual-dtor-Werror=address-Werror=sequence-point-Werror=format-security -nostdlibinc-fdebug-info-for-profiling -msoft-float-march=armv7-a-mfloat-abi=softfp +-mfpu=neon/-Ibuild/make/tools/ide_query/prober_scripts/cpp³-Iout/soong/.intermediates/build/make/tools/ide_query/prober_scripts/cpp/ide_query_proberscript_cc/android_arm_armv7-a-neon/gen/proto/build/make/tools/ide_query/prober_scripts/cpp…-Iout/soong/.intermediates/build/make/tools/ide_query/prober_scripts/cpp/ide_query_proberscript_cc/android_arm_armv7-a-neon/gen/proto-D__LIBC_API__=10000-D__LIBM_API__=10000-D__LIBDL_API__=10000-Iexternal/protobuf/srcY-Iprebuilts/clang/host/linux-x86/clang-r522817/android_libc++/platform/arm/include/c++/v1=-Iprebuilts/clang/host/linux-x86/clang-r522817/include/c++/v1 -Ibionic/libc/async_safe/include-Isystem/logging/liblog/include'-Ibionic/libc/system_properties/include<-Isystem/core/property_service/libpropertyinfoparser/include-isystembionic/libc/include-isystembionic/libc/kernel/uapi/asm-arm-isystembionic/libc/kernel/uapi-isystembionic/libc/kernel/android/scsi-isystembionic/libc/kernel/android/uapi-targetarmv7a-linux-androideabi10000-DANDROID_STRICT-fPIE-Werror-Wno-unused-parameter-DGOOGLE_PROTOBUF_NO_RTTI-Wimplicit-fallthrough*-D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS-Wno-gnu-include-next-fvisibility-inlines-hidden-mllvm-enable-shrink-wrap=false -std=gnu++20 -fno-rtti-Isystem/core/include-Isystem/logging/liblog/include-Isystem/media/audio/include-Ihardware/libhardware/include%-Ihardware/libhardware_legacy/include-Ihardware/ril/include-Iframeworks/native/include"-Iframeworks/native/opengl/include-Iframeworks/av/include-Werror=bool-operation -Werror=format-insufficient-args%-Werror=implicit-int-float-conversion-Werror=int-in-bool-context-Werror=int-to-pointer-cast-Werror=pointer-to-int-cast-Werror=xor-used-as-pow-Wno-void-pointer-to-enum-cast-Wno-void-pointer-to-int-cast-Wno-pointer-to-int-cast-Werror=fortify-source-Wno-unused-variable-Wno-missing-field-initializers-Wno-packed-non-pod-Werror=address-of-temporary+-Werror=incompatible-function-pointer-types-Werror=null-dereference-Werror=return-type"-Wno-tautological-constant-compare$-Wno-tautological-type-limit-compare"-Wno-implicit-int-float-conversion!-Wno-tautological-overlap-compare-Wno-deprecated-copy-Wno-range-loop-construct"-Wno-zero-as-null-pointer-constant)-Wno-deprecated-anon-enum-enum-conversion$-Wno-deprecated-enum-enum-conversion-Wno-pessimizing-move-Wno-non-c-typedef-for-linkage-Wno-align-mismatch"-Wno-error=unused-but-set-variable#-Wno-error=unused-but-set-parameter-Wno-error=deprecated-builtins-Wno-error=deprecated2-Wno-error=single-bit-bitfield-constant-conversion$-Wno-error=enum-constexpr-conversion-Wno-error=invalid-offsetof&-Wno-deprecated-dynamic-exception-spec8build/make/tools/ide_query/prober_scripts/cpp/general.cc"Õ? +¶soong/.intermediates/build/make/tools/ide_query/prober_scripts/cpp/ide_query_proberscript_cc/android_arm_armv7-a-neon/gen/proto/build/make/tools/ide_query/prober_scripts/cpp/foo.pb.h™>// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: build/make/tools/ide_query/prober_scripts/cpp/foo.proto + +#ifndef GOOGLE_PROTOBUF_INCLUDED_build_2fmake_2ftools_2fide_5fquery_2fprober_5fscripts_2fcpp_2ffoo_2eproto +#define GOOGLE_PROTOBUF_INCLUDED_build_2fmake_2ftools_2fide_5fquery_2fprober_5fscripts_2fcpp_2ffoo_2eproto + +#include +#include +#include + +#include +#if PROTOBUF_VERSION < 3021000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 3021012 < PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include +#include +#include +#include // IWYU pragma: export +#include // IWYU pragma: export +// @@protoc_insertion_point(includes) +#include +#define PROTOBUF_INTERNAL_EXPORT_build_2fmake_2ftools_2fide_5fquery_2fprober_5fscripts_2fcpp_2ffoo_2eproto +PROTOBUF_NAMESPACE_OPEN +namespace internal { +class AnyMetadata; +} // namespace internal +PROTOBUF_NAMESPACE_CLOSE + +// Internal implementation detail -- do not use these members. +struct TableStruct_build_2fmake_2ftools_2fide_5fquery_2fprober_5fscripts_2fcpp_2ffoo_2eproto { + static const ::uint32_t offsets[]; +}; +namespace ide_query { +namespace prober_scripts { +class ProtoMsg; +struct ProtoMsgDefaultTypeInternal; +extern ProtoMsgDefaultTypeInternal _ProtoMsg_default_instance_; +} // namespace prober_scripts +} // namespace ide_query +PROTOBUF_NAMESPACE_OPEN +template<> ::ide_query::prober_scripts::ProtoMsg* Arena::CreateMaybeMessage<::ide_query::prober_scripts::ProtoMsg>(Arena*); +PROTOBUF_NAMESPACE_CLOSE +namespace ide_query { +namespace prober_scripts { + +// =================================================================== + +class ProtoMsg final : + public ::PROTOBUF_NAMESPACE_ID::MessageLite /* @@protoc_insertion_point(class_definition:ide_query.prober_scripts.ProtoMsg) */ { + public: + inline ProtoMsg() : ProtoMsg(nullptr) {} + ~ProtoMsg() override; + explicit PROTOBUF_CONSTEXPR ProtoMsg(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); + + ProtoMsg(const ProtoMsg& from); + ProtoMsg(ProtoMsg&& from) noexcept + : ProtoMsg() { + *this = ::std::move(from); + } + + inline ProtoMsg& operator=(const ProtoMsg& from) { + if (this == &from) return *this; + CopyFrom(from); + return *this; + } + inline ProtoMsg& operator=(ProtoMsg&& from) noexcept { + if (this == &from) return *this; + if (GetOwningArena() == from.GetOwningArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetOwningArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ProtoMsg& default_instance() { + return *internal_default_instance(); + } + static inline const ProtoMsg* internal_default_instance() { + return reinterpret_cast( + &_ProtoMsg_default_instance_); + } + static constexpr int kIndexInFileMessages = + 0; + + friend void swap(ProtoMsg& a, ProtoMsg& b) { + a.Swap(&b); + } + inline void Swap(ProtoMsg* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetOwningArena() != nullptr && + GetOwningArena() == other->GetOwningArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetOwningArena() == other->GetOwningArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(ProtoMsg* other) { + if (other == this) return; + GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + ProtoMsg* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + ProtoMsg* New() const { + return New(nullptr); + } + void CheckTypeAndMergeFrom(const ::PROTOBUF_NAMESPACE_ID::MessageLite& from) final; + void CopyFrom(const ProtoMsg& from); + void MergeFrom(const ProtoMsg& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::uint8_t* _InternalSerialize( + ::uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _impl_._cached_size_.Get(); } + + private: + void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); + void SharedDtor(); + void SetCachedSize(int size) const; + void InternalSwap(ProtoMsg* other); + + private: + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ide_query.prober_scripts.ProtoMsg"; + } + protected: + explicit ProtoMsg(::PROTOBUF_NAMESPACE_ID::Arena* arena, + bool is_message_owned = false); + public: + + std::string GetTypeName() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kSomeFieldFieldNumber = 1, + }; + // int64 some_field = 1; + void clear_some_field(); + ::int64_t some_field() const; + void set_some_field(::int64_t value); + private: + ::int64_t _internal_some_field() const; + void _internal_set_some_field(::int64_t value); + public: + + // @@protoc_insertion_point(class_scope:ide_query.prober_scripts.ProtoMsg) + private: + class _Internal; + + template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; + typedef void InternalArenaConstructable_; + typedef void DestructorSkippable_; + struct Impl_ { + ::int64_t some_field_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + }; + union { Impl_ _impl_; }; + friend struct ::TableStruct_build_2fmake_2ftools_2fide_5fquery_2fprober_5fscripts_2fcpp_2ffoo_2eproto; +}; +// =================================================================== + + +// =================================================================== + +#ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +// ProtoMsg + +// int64 some_field = 1; +inline void ProtoMsg::clear_some_field() { + _impl_.some_field_ = ::int64_t{0}; +} +inline ::int64_t ProtoMsg::_internal_some_field() const { + return _impl_.some_field_; +} +inline ::int64_t ProtoMsg::some_field() const { + // @@protoc_insertion_point(field_get:ide_query.prober_scripts.ProtoMsg.some_field) + return _internal_some_field(); +} +inline void ProtoMsg::_internal_set_some_field(::int64_t value) { + + _impl_.some_field_ = value; +} +inline void ProtoMsg::set_some_field(::int64_t value) { + _internal_set_some_field(value); + // @@protoc_insertion_point(field_set:ide_query.prober_scripts.ProtoMsg.some_field) +} + +#ifdef __GNUC__ + #pragma GCC diagnostic pop +#endif // __GNUC__ + +// @@protoc_insertion_point(namespace_scope) + +} // namespace prober_scripts +} // namespace ide_query + +// @@protoc_insertion_point(global_scope) + +#include +#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_build_2fmake_2ftools_2fide_5fquery_2fprober_5fscripts_2fcpp_2ffoo_2eproto diff --git a/tools/ide_query/prober_scripts/regen.sh b/tools/ide_query/prober_scripts/regen.sh new file mode 100755 index 0000000000..2edfe53ec3 --- /dev/null +++ b/tools/ide_query/prober_scripts/regen.sh @@ -0,0 +1,33 @@ +#!/bin/bash -e + +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script is used to generate the ide_query.out file. +# +# The ide_query.out file is a pre-computed result of running ide_query.sh +# on a set of files. This allows the prober to run its tests without running +# ide_query.sh. The prober doesn't check-out the full source code, so it +# can't run ide_query.sh itself. + +cd $(dirname $BASH_SOURCE) +source $(pwd)/../../../shell_utils.sh +require_top + +files_to_build=( + build/make/tools/ide_query/prober_scripts/cpp/general.cc +) + +cd ${TOP} +build/make/tools/ide_query/ide_query.sh --lunch_target=aosp_arm-trunk_staging-eng ${files_to_build[@]} > build/make/tools/ide_query/prober_scripts/ide_query.out