packages feed

glean-0.1.0.0: glean/schema/source/codemarkup.scip.angle

# Copyright (c) Meta Platforms, Inc. and affiliates.

schema codemarkup.scip.1 {
import src
import code.scip
import codemarkup.types
import scip
import lsif.types

#
# Resolving locations to entities
#

predicate ScipResolveLocation:
  {
    location: codemarkup.types.Location,
    entity: code.scip.Entity,
  }
  { { Name, File, { range = Range }, nothing }, Entity } where
    scip.ResolveLocation { { File, Range, Name }, Entity };

#
# Finding entities' locations
#

predicate ScipEntityLocation:
  {
    entity: code.scip.Entity,
    location: codemarkup.types.Location,
  }
  { Entity, { Name, File, { range = Range }, nothing } } where
    scip.EntityLocation { Entity, { File, Range, Name } };

#
# Finding references in a file
#

predicate ScipFileEntityXRefLocations:
  {
    file: src.File,
    xref: codemarkup.types.XRefLocation,
    entity: code.scip.Entity,
  }
  { File, XRefLocation, Entity } where
    scip.FileEntityXRefLocation { File, SrcRange, TargetLocation, Entity };
    { TargetFile, TargetRange, Name } = TargetLocation;
    { { Name, TargetFile, { range = TargetRange }, nothing },
      { range = SrcRange } } = XRefLocation;

predicate FileXLangSymbolRefs:
  {
    file: src.File,
    source: codemarkup.types.RangeSpan,
    symbol: scip.Symbol,
  }
  { File, { range = SrcRange }, Symbol } where
  scip.FileXLangSymbolRef { File, LsifRange, Symbol };
  lsif.types.ToSrcRange { File, LsifRange, SrcRange };

#
# Language entity uses (find-references)
#

predicate ScipEntityUses:
  {
    target: code.scip.Entity,
    file: src.File,
    range: src.Range, # n.b src.Range
  }
  { Entity, File, Range } where scip.EntityUses { Entity, File, Range }

#
# symbol kinds
#

predicate EntityInfo:
  {
    entity: code.scip.Entity,
    info: codemarkup.types.SymbolInfo
  }
  { Entity, { kind = Kind, isAbstract = false } } where
    scip.EntityKind { Entity, LsifKind };
    LsifKindToKind { LsifKind, Kind };

# maps vscode lsp kinds to codemarkup kinds, which use different enums
predicate LsifKindToKind:
  {
    lsif: lsif.types.SymbolKind,
    kind: codemarkup.types.SymbolKind
  }
  { Lsif, Kind } where
    ( File = Lsif; File = Kind ) |
    ( Module = Lsif; Module = Kind ) |
    ( Namespace = Lsif; Namespace = Kind ) |
    ( Package = Lsif; Package = Kind ) |
    ( Class_ = Lsif; Class_ = Kind ) |
    ( Method = Lsif; Method = Kind ) |
    ( Property = Lsif; Property = Kind ) |
    ( Field = Lsif; Field = Kind ) |
    ( Constructor = Lsif; Constructor = Kind ) |
    ( Enum_ = Lsif; Enum_ = Kind ) |
    ( Interface = Lsif; Interface = Kind ) |
    ( Function = Lsif; Function = Kind ) |
    ( Variable = Lsif; Variable = Kind ) |
    ( Constant = Lsif; Constant = Kind ) |
    ( String = Lsif; String = Kind  ) |
    ( Number = Lsif; Number = Kind ) |
    ( Boolean = Lsif; Boolean = Kind ) |
    ( Array = Lsif; Array = Kind ) |
    ( Object_ = Lsif; Object_ = Kind ) |
    ( Key = Lsif; Key = Kind ) |
    ( Null = Lsif; Null = Kind ) |
    ( EnumMember = Lsif; Enumerator = Kind ) | # n.b different names
    ( Struct = Lsif; Struct = Kind ) |
    ( Event = Lsif; Event = Kind ) |
    ( Operator = Lsif; Operator = Kind ) |
    ( TypeParameter = Lsif; TypeParameter = Kind );
    # no Unknown, and can't distinguish Union, Macro or Trait

predicate ScipEntityDocumentation:
  {
    entity : code.scip.Entity,
    documentation : scip.Documentation,
  }
  { Entity, Docs } where
    scip.EntityDefinition { Entity, Defn };
    scip.DefinitionDocumentation { Defn, Docs }

}