#![cfg_attr(rustbuild, feature(staged_api, rustc_private))]
#![cfg_attr(rustbuild, unstable(feature = "rustc_private", issue = "27812"))]
#[cfg(feature = "serialize-rustc")]
extern crate rustc_serialize;
extern crate rls_span as span;
#[cfg(feature = "serialize-serde")]
extern crate serde;
#[cfg(feature = "serialize-serde")]
#[macro_use]
extern crate serde_derive;
pub mod config;
use std::path::PathBuf;
use config::Config;
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
#[repr(C)]
pub struct Analysis {
pub config: Config,
pub version: Option<String>,
pub compilation: Option<CompilationOptions>,
pub prelude: Option<CratePreludeData>,
pub imports: Vec<Import>,
pub defs: Vec<Def>,
pub impls: Vec<Impl>,
pub refs: Vec<Ref>,
pub macro_refs: Vec<MacroRef>,
pub relations: Vec<Relation>,
#[cfg(feature = "borrows")]
pub per_fn_borrows: Vec<BorrowData>,
}
impl Analysis {
#[cfg(not(feature = "borrows"))]
pub fn new(config: Config) -> Analysis {
Analysis {
config,
version: option_env!("CARGO_PKG_VERSION").map(|s| s.to_string()),
prelude: None,
compilation: None,
imports: vec![],
defs: vec![],
impls: vec![],
refs: vec![],
macro_refs: vec![],
relations: vec![],
}
}
#[cfg(feature = "borrows")]
pub fn new(config: Config) -> Analysis {
Analysis {
config,
version: option_env!("CARGO_PKG_VERSION").map(|s| s.to_string()),
prelude: None,
imports: vec![],
defs: vec![],
impls: vec![],
refs: vec![],
macro_refs: vec![],
relations: vec![],
per_fn_borrows: vec![],
}
}
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct Id {
pub krate: u32,
pub index: u32,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct GlobalCrateId {
pub name: String,
pub disambiguator: (u64, u64),
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct SpanData {
pub file_name: PathBuf,
pub byte_start: u32,
pub byte_end: u32,
pub line_start: span::Row<span::OneIndexed>,
pub line_end: span::Row<span::OneIndexed>,
pub column_start: span::Column<span::OneIndexed>,
pub column_end: span::Column<span::OneIndexed>,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct CompilationOptions {
pub directory: PathBuf,
pub program: String,
pub arguments: Vec<String>,
pub output: PathBuf,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct CratePreludeData {
pub crate_id: GlobalCrateId,
pub crate_root: String,
pub external_crates: Vec<ExternalCrateData>,
pub span: SpanData,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct ExternalCrateData {
pub file_name: String,
pub num: u32,
pub id: GlobalCrateId,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Import {
pub kind: ImportKind,
pub ref_id: Option<Id>,
pub span: SpanData,
pub alias_span: Option<SpanData>,
pub name: String,
pub value: String,
pub parent: Option<Id>,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ImportKind {
ExternCrate,
Use,
GlobUse,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Def {
pub kind: DefKind,
pub id: Id,
pub span: SpanData,
pub name: String,
pub qualname: String,
pub value: String,
pub parent: Option<Id>,
pub children: Vec<Id>,
pub decl_id: Option<Id>,
pub docs: String,
pub sig: Option<Signature>,
pub attributes: Vec<Attribute>,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DefKind {
Enum,
TupleVariant,
StructVariant,
Tuple,
Struct,
Union,
Trait,
Function,
ForeignFunction,
Method,
Macro,
Mod,
Type,
Local,
Static,
ForeignStatic,
Const,
Field,
ExternType,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Impl {
pub id: u32,
pub kind: ImplKind,
pub span: SpanData,
pub value: String,
pub parent: Option<Id>,
pub children: Vec<Id>,
pub docs: String,
pub sig: Option<Signature>,
pub attributes: Vec<Attribute>,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ImplKind {
Inherent,
Direct,
Indirect,
Blanket,
Deref(String, Id),
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Attribute {
pub value: String,
pub span: SpanData,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Ref {
pub kind: RefKind,
pub span: SpanData,
pub ref_id: Id,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RefKind {
Function,
Mod,
Type,
Variable,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct MacroRef {
pub span: SpanData,
pub qualname: String,
pub callee_span: SpanData,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Relation {
pub span: SpanData,
pub kind: RelationKind,
pub from: Id,
pub to: Id,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RelationKind {
Impl {
id: u32,
},
SuperTrait,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Signature {
pub text: String,
pub defs: Vec<SigElement>,
pub refs: Vec<SigElement>,
}
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct SigElement {
pub id: Id,
pub start: usize,
pub end: usize,
}
#[cfg(feature = "borrows")]
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct BorrowData {
pub ref_id: Id,
pub scopes: Vec<Scope>,
pub loans: Vec<Loan>,
pub moves: Vec<Move>,
pub span: Option<SpanData>,
}
#[cfg(feature = "borrows")]
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone, Copy)]
pub enum BorrowKind {
ImmBorrow,
MutBorrow,
}
#[cfg(feature = "borrows")]
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Loan {
pub ref_id: Id,
pub kind: BorrowKind,
pub span: SpanData,
}
#[cfg(feature = "borrows")]
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Move {
pub ref_id: Id,
pub span: SpanData,
}
#[cfg(feature = "borrows")]
#[cfg_attr(feature = "serialize-serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serialize-rustc", derive(RustcDecodable, RustcEncodable))]
#[derive(Debug, Clone)]
pub struct Scope {
pub ref_id: Id,
pub span: SpanData,
}