(* Yoann Padioleau * * Copyright (C) 2009, 2010 Facebook * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * version 2.1 as published by the Free Software Foundation, with the * special exception on linking described in file license.txt. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the file * license.txt for more details. *) open Common (*****************************************************************************) (* Prelude *) (*****************************************************************************) (* * The code in this module used to be in database_code.ml but many stuff * now have their own view on how to represent a code database * (database_code.ml but also graph_code.ml, prolog_code.ml, etc) *) (*****************************************************************************) (* Type *) (*****************************************************************************) (* * Code entities. * * See also http://ctags.sourceforge.net/FORMAT and the doc on 'kind' * note: if you change this, you may want to bump graph_code.version. * * coupling: If you add a constructor modify also entity_kind_of_string()! * coupling: if you add a new kind of entity, then don't forget to modify * also size_font_multiplier_of_categ in code_map/. * * less: could perhaps factorize code with highlight_code.ml? see * entity_kind_of_highlight_category_def|use *) type entity_kind = | Package (* when we use the database for completion purpose, then files/dirs * are also useful "entities" to get completion for. *) | Dir | Module | File | Function | Class | Type | Constant | Global | Macro | Exception | TopStmts (* nested entities *) | Field | Method | ClassConstant | Constructor (* for ml *) (* forward decl *) | Prototype | GlobalExtern (* people often spread the same component in multiple dirs with the same * name (hmm could be merged now with Package) *) | MultiDirs | Other of string (* todo: IsInlinedMethod, ... * todo: IsOverriding, IsOverriden *) type property = (* mostly function properties *) (* todo: could also say which argument is dataflow involved in the * dynamic call if any *) | ContainDynamicCall | ContainReflectionCall (* the argument position taken by ref; 0-index based *) | TakeArgNByRef of int | UseGlobal of string | ContainDeadStatements | DeadCode (* the function itself is dead, e.g. never called *) | CodeCoverage of int list (* e.g. covered lines by unit tests *) (* for class *) | ClassKind of class_kind | Privacy of privacy | Abstract | Final | Static (* used for the xhp @required fields for now *) | Required | Async (* todo: git info, e.g. Age, Authors, Age_profile (range) *) and privacy = Public | Protected | Private and class_kind = Struct | Class_ | Interface | Trait | Enum (*****************************************************************************) (* String of *) (*****************************************************************************) (* todo: should be autogenerated !! *) let string_of_entity_kind e = match e with | Function -> "Function" | Prototype -> "Prototype" | GlobalExtern -> "GlobalExtern" | Class -> "Class" | Module -> "Module" | Package -> "Package" | Type -> "Type" | Constant -> "Constant" | Global -> "Global" | Macro -> "Macro" | TopStmts -> "TopStmts" | Method -> "Method" | Field -> "Field" | ClassConstant -> "ClassConstant" | Other s -> "Other:" ^ s | File -> "File" | Dir -> "Dir" | MultiDirs -> "MultiDirs" | Exception -> "Exception" | Constructor -> "Constructor" let entity_kind_of_string s = match s with | "Function" -> Function | "Class" -> Class | "Module" -> Module | "Type" -> Type | "Constant" -> Constant | "Global" -> Global | "Macro" -> Macro | "TopStmts" -> TopStmts | "Method" -> Method | "Field" -> Field | "ClassConstant" -> ClassConstant | "File" -> File | "Dir" -> Dir | "MultiDirs" -> MultiDirs | "Exception" -> Exception | "Constructor" -> Constructor | _ when s =~ "Other:\\(.*\\)" -> Other (Common.matched1 s) | _ -> failwith ("entity_of_string: bad string = " ^ s)