packages feed

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

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

schema codemarkup.haskell.2 {

import src
import code.hs
import codemarkup.types
import hs

#
# Resolving locations to entities
#

# Resolve Haskell locations
predicate HaskellResolveLocation:
  {
    location: codemarkup.types.Location,
    entity: code.hs.Entity,
  }
  { { Ent.occ.name, File, { span = Span }, nothing }, { name = Ent } } where
    hs.SourceModule { File, Mod };
    hs.ModuleDeclarations { module = Mod, names = Names };
    Ent = Names[..];
    hs.DeclarationLocation { name = Ent, span = Span };

#
# Finding entities' locations
#

predicate HaskellEntityLocation:
  {
    entity: code.hs.Entity,
    location: codemarkup.types.Location,
  }
  { { name = D }, { D.occ.name, File, { span = Span }, nothing } } where
    hs.DeclarationLocation { D, File, Span };

#
# Finding references in a file
#

# XRefs in Haskell
predicate HaskellFileEntityXRefLocations:
  {
    file: src.File,
    xref: codemarkup.types.XRefLocation,
    entity: code.hs.Entity,
  }
  { File, { Location, { span = Span } }, Entity } where
    hs.FileXRefs { file = File, xrefs = XRefs };
    { target = Target, refs = Spans } = XRefs[..];
    (
      Target = { name = Name };
      Entity = { name = Name };
      hs.DeclarationLocation { name = Name, file = TargetFile, span = TargetSpan };
      Location = codemarkup.types.Location
        {
          name = Name.occ.name,
          file = TargetFile,
          location = { span = TargetSpan },
          destination = nothing
        };
    ) | (
      Target = { modName = ModuleName };
      Module = hs.Module { name = ModuleName };
      Entity = { mod = Module };
      hs.ModuleSource { mod = Module, file = TargetFile };
      Location = codemarkup.types.Location
        {
          name = ModuleName.*,
          file = TargetFile,
          location = { range = { TargetFile, 1, 1, 1, 1 }},
          destination = nothing
        };
    );
    Span = (Spans[..]).span;

#
# Language entity uses
#

predicate HaskellEntityUses:
  {
    target: code.hs.Entity,
    file: src.File,
    span: src.ByteSpan,
  }
  { Ent, File, (Spans[..]).span } where
    (
      Ent = { name = Name };
      Target = { name = Name };
    ) | (
      Ent = { mod = Module };
      Target = { modName = Module.name };
    );
    hs.XRef { target = Target, file = File, refs = Spans }


#
# Contains
#

predicate HaskellContainsParentEntity:
  {
    child: code.hs.Entity,
    parent: code.hs.Entity
  }
  { { name = ChildName }, { name = ParentName } }
  where
  hs.DeclarationOfName { name = ChildName, decl = ChildDecl };
  (
    ChildDecl.con?.data_ = ParentName
  ) | (
    ChildDecl.field?.con = ParentName
  ) | (
    ChildDecl.method?.class_ = ParentName
  )

predicate HaskellContainsChildEntity:
  {
    parent: code.hs.Entity,
    child: code.hs.Entity
  }
  { { name = ParentName }, { name = ChildName } }
  where
  hs.DeclarationOfName { name = ParentName, decl = ParentDecl };
  (
    (ParentDecl.class_?.methods[..]).name = ChildName
  ) | (
    (ParentDecl.data?.constrs[..]).name = ChildName
  ) | (
    (ParentDecl.con?.fields[..]).name = ChildName
  )

}