source/model-generator/MethodConstraints.h (189 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include <re2/re2.h> #include <mariana-trench/Access.h> #include <mariana-trench/Context.h> #include <mariana-trench/Model.h> #include <mariana-trench/model-generator/IntegerConstraint.h> #include <mariana-trench/model-generator/ModelGenerator.h> #include <mariana-trench/model-generator/TypeConstraints.h> namespace marianatrench { bool has_annotation( const DexAnnotationSet* annotations_set, const std::string& expected_type, const std::optional<re2::RE2>& expected_annotation); class MethodConstraint { public: MethodConstraint() = default; virtual ~MethodConstraint() = default; MethodConstraint(const MethodConstraint& other) = delete; MethodConstraint(MethodConstraint&& other) = delete; MethodConstraint& operator=(const MethodConstraint& other) = delete; MethodConstraint& operator=(MethodConstraint&& other) = delete; static std::unique_ptr<MethodConstraint> from_json( const Json::Value& constraint, Context& context); virtual bool has_children() const; virtual std::vector<const MethodConstraint*> children() const; virtual MethodHashedSet may_satisfy( const MethodMappings& method_mappings) const; virtual bool satisfy(const Method* method) const = 0; virtual bool operator==(const MethodConstraint& other) const = 0; }; class MethodNameConstraint final : public MethodConstraint { public: explicit MethodNameConstraint(const std::string& regex_string); MethodHashedSet may_satisfy( const MethodMappings& method_mappings) const override; bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: re2::RE2 pattern_; }; class ParentConstraint final : public MethodConstraint { public: explicit ParentConstraint(std::unique_ptr<TypeConstraint> inner_constraint); MethodHashedSet may_satisfy( const MethodMappings& method_mappings) const override; bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: std::unique_ptr<TypeConstraint> inner_constraint_; }; class AllOfMethodConstraint final : public MethodConstraint { public: explicit AllOfMethodConstraint( std::vector<std::unique_ptr<MethodConstraint>> constraints); bool has_children() const override; std::vector<const MethodConstraint*> children() const override; MethodHashedSet may_satisfy( const MethodMappings& method_mappings) const override; bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: std::vector<std::unique_ptr<MethodConstraint>> constraints_; }; class AnyOfMethodConstraint final : public MethodConstraint { public: explicit AnyOfMethodConstraint( std::vector<std::unique_ptr<MethodConstraint>> constraints); bool has_children() const override; std::vector<const MethodConstraint*> children() const override; MethodHashedSet may_satisfy( const MethodMappings& method_mappings) const override; bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: std::vector<std::unique_ptr<MethodConstraint>> constraints_; }; class NotMethodConstraint final : public MethodConstraint { public: explicit NotMethodConstraint(std::unique_ptr<MethodConstraint> constraint); bool has_children() const override; std::vector<const MethodConstraint*> children() const override; MethodHashedSet may_satisfy( const MethodMappings& method_mappings) const override; bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: std::unique_ptr<MethodConstraint> constraint_; }; class NumberParametersConstraint final : public MethodConstraint { public: explicit NumberParametersConstraint(IntegerConstraint constraint); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: IntegerConstraint constraint_; }; class NumberOverridesConstraint final : public MethodConstraint { public: explicit NumberOverridesConstraint( IntegerConstraint constraint, Context& context); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: IntegerConstraint constraint_; Context& context_; }; class IsStaticConstraint final : public MethodConstraint { public: explicit IsStaticConstraint(bool expected); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: bool expected_; }; class IsConstructorConstraint final : public MethodConstraint { public: explicit IsConstructorConstraint(bool expected); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: bool expected_; }; class IsNativeConstraint final : public MethodConstraint { public: explicit IsNativeConstraint(bool expected); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: bool expected_; }; class HasCodeConstraint final : public MethodConstraint { public: explicit HasCodeConstraint(bool expected); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: bool expected_; }; class HasAnnotationMethodConstraint final : public MethodConstraint { public: explicit HasAnnotationMethodConstraint( const std::string& type, const std::optional<std::string>& annotation); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: std::string type_; std::optional<re2::RE2> annotation_; }; class ParameterConstraint final : public MethodConstraint { public: ParameterConstraint( ParameterPosition index, std::unique_ptr<TypeConstraint> inner_constraint); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: ParameterPosition index_; std::unique_ptr<TypeConstraint> inner_constraint_; }; class SignatureConstraint final : public MethodConstraint { public: explicit SignatureConstraint(const std::string& regex_string); MethodHashedSet may_satisfy( const MethodMappings& method_mappings) const override; bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: re2::RE2 pattern_; }; class ReturnConstraint final : public MethodConstraint { public: explicit ReturnConstraint(std::unique_ptr<TypeConstraint> inner_constraint); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: std::unique_ptr<TypeConstraint> inner_constraint_; }; class VisibilityMethodConstraint final : public MethodConstraint { public: explicit VisibilityMethodConstraint(DexAccessFlags visibility); bool satisfy(const Method* method) const override; bool operator==(const MethodConstraint& other) const override; private: DexAccessFlags visibility_; }; } // namespace marianatrench