/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */


/** Duplicate code **/

duplicateCode(
  unique int id : @duplication,
  varchar(900) relativePath : string ref,
  int equivClass : int ref);

similarCode(
  unique int id : @similarity,
  varchar(900) relativePath : string ref,
  int equivClass : int ref);

@duplication_or_similarity = @duplication | @similarity;

tokens(
  int id : @duplication_or_similarity ref,
  int offset : int ref,
  int beginLine : int ref,
  int beginColumn : int ref,
  int endLine : int ref,
  int endColumn : int ref);

/** External data **/

externalData(
  int id : @externalDataElement,
  varchar(900) path : string ref,
  int column: int ref,
  varchar(900) value : string ref
);

snapshotDate(unique date snapshotDate : date ref);

sourceLocationPrefix(varchar(900) prefix : string ref);

/** Overlay support **/

databaseMetadata(
  string metadataKey: string ref,
  string value: string ref
);

overlayChangedFiles(
  string path: string ref
);


/*
 * XML Files
 */

xmlEncoding(
  unique int id: @file ref,
  string encoding: string ref
);

xmlDTDs(
  unique int id: @xmldtd,
  string root: string ref,
  string publicId: string ref,
  string systemId: string ref,
  int fileid: @file ref
);

xmlElements(
  unique int id: @xmlelement,
  string name: string ref,
  int parentid: @xmlparent ref,
  int idx: int ref,
  int fileid: @file ref
);

xmlAttrs(
  unique int id: @xmlattribute,
  int elementid: @xmlelement ref,
  string name: string ref,
  string value: string ref,
  int idx: int ref,
  int fileid: @file ref
);

xmlNs(
  int id: @xmlnamespace,
  string prefixName: string ref,
  string URI: string ref,
  int fileid: @file ref
);

xmlHasNs(
  int elementId: @xmlnamespaceable ref,
  int nsId: @xmlnamespace ref,
  int fileid: @file ref
);

xmlComments(
  unique int id: @xmlcomment,
  string text: string ref,
  int parentid: @xmlparent ref,
  int fileid: @file ref
);

xmlChars(
  unique int id: @xmlcharacters,
  string text: string ref,
  int parentid: @xmlparent ref,
  int idx: int ref,
  int isCDATA: int ref,
  int fileid: @file ref
);

@xmlparent = @file | @xmlelement;
@xmlnamespaceable = @xmlelement | @xmlattribute;

xmllocations(
  int xmlElement: @xmllocatable ref,
  int location: @location_default ref
);

@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace;

compilations(unique int id: @compilation, string cwd: string ref);

#keyset[id, num]
compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref);

#keyset[id, num, kind]
compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref);

diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref);

compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref);

#keyset[id, num]
compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref);

diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref,
            string full_error_message: string ref, int location: @location ref);

locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref,
                  int endLine: int ref, int endColumn: int ref);

numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref);

files(unique int id: @file, string name: string ref);

folders(unique int id: @folder, string name: string ref);

containerparent(int parent: @container ref, unique int child: @container ref);

has_location(unique int locatable: @locatable ref, int location: @location ref);

#keyset[parent, idx]
comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref);

comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref);

doc_comments(unique int node: @documentable ref, int comment: @comment_group ref);

#keyset[parent, idx]
exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref);

literals(unique int expr: @expr ref, string value: string ref, string raw: string ref);

constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref);

fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref);

typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref);

#keyset[parent, idx]
stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref);

#keyset[parent, idx]
decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref);

#keyset[parent, idx]
specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref);

scopes(unique int id: @scope, int kind: int ref);

scopenesting(unique int inner: @scope ref, int outer: @scope ref);

scopenodes(unique int node: @scopenode ref, int scope: @localscope ref);

objects(unique int id: @object, int kind: int ref, string name: string ref);

objectscopes(unique int object: @object ref, int scope: @scope ref);

objecttypes(unique int object: @object ref, int tp: @type ref);

methodreceivers(unique int method: @object ref, int receiver: @object ref);

fieldstructs(unique int field: @object ref, int struct: @structtype ref);

methodhosts(int method: @object ref, int host: @definedtype ref);

defs(int ident: @ident ref, int object: @object ref);

uses(int ident: @ident ref, int object: @object ref);

types(unique int id: @type, int kind: int ref);

type_of(unique int expr: @expr ref, int tp: @type ref);

typename(unique int tp: @type ref, string name: string ref);

key_type(unique int map: @maptype ref, int tp: @type ref);

element_type(unique int container: @containertype ref, int tp: @type ref);

base_type(unique int ptr: @pointertype ref, int tp: @type ref);

underlying_type(unique int defined: @definedtype ref, int tp: @type ref);

#keyset[parent, index]
component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref);

#keyset[parent, index]
struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref);

#keyset[interface, index]
interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref);

array_length(unique int tp: @arraytype ref, string len: string ref);

type_objects(unique int tp: @type ref, int object: @object ref);

packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref);

#keyset[parent, idx]
modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref);

#keyset[parent, idx]
modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref);

#keyset[package, idx]
errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref,
       string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref);

has_ellipsis(int id: @callorconversionexpr ref);

variadic(int id: @signaturetype ref);

#keyset[parent, idx]
typeparam(unique int tp: @typeparamtype ref, string name: string ref, int bound: @compositetype ref,
          int parent: @typeparamparentobject ref, int idx: int ref);

@container = @file | @folder;

@locatable = @xmllocatable | @node | @localscope;

@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent
      | @scopenode | @comment_group | @comment;

@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr;

@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec;

@modexprparent = @file | @modexpr;

@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr;

@stmtparent = @funcdef | @stmt | @decl;

@declparent = @file | @declstmt;

@typeparamdeclparent = @funcdecl | @typespec;

@funcdef = @funclit | @funcdecl;

@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt;

@location = @location_default;

@sourceline = @locatable;

case @comment.kind of
  0 = @slashslashcomment
| 1 = @slashstarcomment;

case @expr.kind of
  0 = @badexpr
| 1 = @ident
| 2 = @ellipsis
| 3 = @intlit
| 4 = @floatlit
| 5 = @imaglit
| 6 = @charlit
| 7 = @stringlit
| 8 = @funclit
| 9 = @compositelit
| 10 = @parenexpr
| 11 = @selectorexpr
| 12 = @indexexpr
| 13 = @genericfunctioninstantiationexpr
| 14 = @generictypeinstantiationexpr
| 15 = @sliceexpr
| 16 = @typeassertexpr
| 17 = @callorconversionexpr
| 18 = @starexpr
| 19 = @keyvalueexpr
| 20 = @arraytypeexpr
| 21 = @structtypeexpr
| 22 = @functypeexpr
| 23 = @interfacetypeexpr
| 24 = @maptypeexpr
| 25 = @typesetliteralexpr
| 26 = @plusexpr
| 27 = @minusexpr
| 28 = @notexpr
| 29 = @complementexpr
| 30 = @derefexpr
| 31 = @addressexpr
| 32 = @arrowexpr
| 33 = @lorexpr
| 34 = @landexpr
| 35 = @eqlexpr
| 36 = @neqexpr
| 37 = @lssexpr
| 38 = @leqexpr
| 39 = @gtrexpr
| 40 = @geqexpr
| 41 = @addexpr
| 42 = @subexpr
| 43 = @orexpr
| 44 = @xorexpr
| 45 = @mulexpr
| 46 = @quoexpr
| 47 = @remexpr
| 48 = @shlexpr
| 49 = @shrexpr
| 50 = @andexpr
| 51 = @andnotexpr
| 52 = @sendchantypeexpr
| 53 = @recvchantypeexpr
| 54 = @sendrcvchantypeexpr;

@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit;

@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr;

@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr;

@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr;

@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr;

@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr;

@logicalunaryexpr = @notexpr;

@bitwiseunaryexpr = @complementexpr;

@arithmeticunaryexpr = @plusexpr | @minusexpr;

@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison;

@logicalbinaryexpr = @lorexpr | @landexpr;

@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr;

@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr;

@shiftexpr = @shlexpr | @shrexpr;

@comparison = @equalitytest | @relationalcomparison;

@equalitytest = @eqlexpr | @neqexpr;

@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr;

@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr;

case @stmt.kind of
  0 = @badstmt
| 1 = @declstmt
| 2 = @emptystmt
| 3 = @labeledstmt
| 4 = @exprstmt
| 5 = @sendstmt
| 6 = @incstmt
| 7 = @decstmt
| 8 = @gostmt
| 9 = @deferstmt
| 10 = @returnstmt
| 11 = @breakstmt
| 12 = @continuestmt
| 13 = @gotostmt
| 14 = @fallthroughstmt
| 15 = @blockstmt
| 16 = @ifstmt
| 17 = @caseclause
| 18 = @exprswitchstmt
| 19 = @typeswitchstmt
| 20 = @commclause
| 21 = @selectstmt
| 22 = @forstmt
| 23 = @rangestmt
| 24 = @assignstmt
| 25 = @definestmt
| 26 = @addassignstmt
| 27 = @subassignstmt
| 28 = @mulassignstmt
| 29 = @quoassignstmt
| 30 = @remassignstmt
| 31 = @andassignstmt
| 32 = @orassignstmt
| 33 = @xorassignstmt
| 34 = @shlassignstmt
| 35 = @shrassignstmt
| 36 = @andnotassignstmt;

@incdecstmt = @incstmt | @decstmt;

@assignment = @simpleassignstmt | @compoundassignstmt;

@simpleassignstmt = @assignstmt | @definestmt;

@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt
                    | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt;

@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt;

@switchstmt = @exprswitchstmt | @typeswitchstmt;

@loopstmt = @forstmt | @rangestmt;

case @decl.kind of
  0 = @baddecl
| 1 = @importdecl
| 2 = @constdecl
| 3 = @typedecl
| 4 = @vardecl
| 5 = @funcdecl;

@gendecl = @importdecl | @constdecl | @typedecl | @vardecl;

case @spec.kind of
  0 = @importspec
| 1 = @valuespec
| 2 = @typedefspec
| 3 = @aliasspec;

@typespec = @typedefspec | @aliasspec;

case @object.kind of
  0 = @pkgobject
| 1 = @decltypeobject
| 2 = @builtintypeobject
| 3 = @declconstobject
| 4 = @builtinconstobject
| 5 = @declvarobject
| 6 = @declfunctionobject
| 7 = @builtinfunctionobject
| 8 = @labelobject;

@typeparamparentobject = @decltypeobject | @declfunctionobject;

@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject;

@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject;

@typeobject = @decltypeobject | @builtintypeobject;

@valueobject = @constobject | @varobject | @functionobject;

@constobject = @declconstobject | @builtinconstobject;

@varobject = @declvarobject;

@functionobject = @declfunctionobject | @builtinfunctionobject;

case @scope.kind of
  0 = @universescope
| 1 = @packagescope
| 2 = @localscope;

case @type.kind of
  0 = @invalidtype
| 1 = @boolexprtype
| 2 = @inttype
| 3 = @int8type
| 4 = @int16type
| 5 = @int32type
| 6 = @int64type
| 7 = @uinttype
| 8 = @uint8type
| 9 = @uint16type
| 10 = @uint32type
| 11 = @uint64type
| 12 = @uintptrtype
| 13 = @float32type
| 14 = @float64type
| 15 = @complex64type
| 16 = @complex128type
| 17 = @stringexprtype
| 18 = @unsafepointertype
| 19 = @boolliteraltype
| 20 = @intliteraltype
| 21 = @runeliteraltype
| 22 = @floatliteraltype
| 23 = @complexliteraltype
| 24 = @stringliteraltype
| 25 = @nilliteraltype
| 26 = @typeparamtype
| 27 = @arraytype
| 28 = @slicetype
| 29 = @structtype
| 30 = @pointertype
| 31 = @interfacetype
| 32 = @tupletype
| 33 = @signaturetype
| 34 = @maptype
| 35 = @sendchantype
| 36 = @recvchantype
| 37 = @sendrcvchantype
| 38 = @definedtype
| 39 = @typesetliteraltype;

@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype;

@booltype = @boolexprtype | @boolliteraltype;

@numerictype = @integertype | @floattype | @complextype;

@integertype = @signedintegertype | @unsignedintegertype;

@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype;

@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype;

@floattype = @float32type | @float64type | @floatliteraltype;

@complextype = @complex64type | @complex128type | @complexliteraltype;

@stringtype = @stringexprtype | @stringliteraltype;

@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype
             | @stringliteraltype | @nilliteraltype;

@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype
               | @signaturetype | @definedtype | @typesetliteraltype;

@containertype = @arraytype | @slicetype | @maptype | @chantype;

@chantype = @sendchantype | @recvchantype | @sendrcvchantype;

case @modexpr.kind of
  0 = @modcommentblock
| 1 = @modline
| 2 = @modlineblock
| 3 = @modlparen
| 4 = @modrparen;

case @error.kind of
  0 = @unknownerror
| 1 = @listerror
| 2 = @parseerror
| 3 = @typeerror;

