blob: 1eb9b0ed2fae1e733e7e8f8f1cfdcfc3d66d3cf5 [file] [log] [blame]
//===--- TypeDeclFinder.h - Finds TypeDecls in Types/TypeReprs --*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_AST_TYPEDECLFINDER_H
#define SWIFT_AST_TYPEDECLFINDER_H
#include "swift/AST/ASTWalker.h"
#include "swift/AST/TypeWalker.h"
#include "llvm/ADT/STLExtras.h"
namespace swift {
class BoundGenericType;
class ComponentIdentTypeRepr;
class NominalType;
class TypeAliasType;
/// Walks a Type to find all NominalTypes, BoundGenericTypes, and
/// TypeAliasTypes.
class TypeDeclFinder : public TypeWalker {
Action walkToTypePre(Type T) override;
public:
virtual Action visitNominalType(NominalType *ty) {
return Action::Continue;
}
virtual Action visitBoundGenericType(BoundGenericType *ty) {
return Action::Continue;
}
virtual Action visitTypeAliasType(TypeAliasType *ty) {
return Action::Continue;
}
};
/// A TypeDeclFinder for use cases where all types should be treated
/// equivalently and where generic arguments can be walked to separately from
/// the generic type.
class SimpleTypeDeclFinder : public TypeDeclFinder {
/// The function to call when a ComponentIdentTypeRepr is seen.
llvm::function_ref<Action(const TypeDecl *)> Callback;
Action visitNominalType(NominalType *ty) override;
Action visitBoundGenericType(BoundGenericType *ty) override;
Action visitTypeAliasType(TypeAliasType *ty) override;
public:
explicit SimpleTypeDeclFinder(
llvm::function_ref<Action(const TypeDecl *)> callback)
: Callback(callback) {}
};
/// Walks a TypeRepr to find all ComponentIdentTypeReprs with bound TypeDecls.
///
/// Subclasses can either override #visitTypeDecl if they only care about
/// types on their own, or #visitComponentIdentTypeRepr if they want to keep
/// the TypeRepr around.
class TypeReprIdentFinder : public ASTWalker {
/// The function to call when a ComponentIdentTypeRepr is seen.
llvm::function_ref<bool(const ComponentIdentTypeRepr *)> Callback;
bool walkToTypeReprPost(TypeRepr *TR) override;
public:
explicit TypeReprIdentFinder(
llvm::function_ref<bool(const ComponentIdentTypeRepr *)> callback)
: Callback(callback) {}
};
}
#endif