// query.cm — Semantic queries over index data.
//
// All functions take an index object (from index.cm) and return arrays of hits.

var query = {}

// Find this references. scope: "top" (top-level only), "fn" (in functions), null (all).
query.find_this = function(idx, scope) {
  var hits = []
  var i = 0
  var ref = null
  while (i < length(idx.references)) {
    ref = idx.references[i]
    if (ref.name == "this") {
      if (scope == null) {
        hits[] = ref
      } else if (scope == "top" && ref.enclosing == null) {
        hits[] = ref
      } else if (scope == "fn" && ref.enclosing != null) {
        hits[] = ref
      }
    }
    i = i + 1
  }
  return hits
}

// Intrinsic usage: find refs to a built-in name (e.g., print).
query.intrinsic = function(idx, name) {
  var hits = []
  var i = 0
  var ref = null
  if (idx.intrinsic_refs == null) return hits
  while (i < length(idx.intrinsic_refs)) {
    ref = idx.intrinsic_refs[i]
    if (ref.name == name) {
      hits[] = ref
    }
    i = i + 1
  }
  return hits
}

// Variable declarations matching a name and optional kind filter.
// kind is one of "var", "def", "fn", "param", or null (any).
query.find_decl = function(idx, name, kind) {
  var hits = []
  var i = 0
  var sym = null
  while (i < length(idx.symbols)) {
    sym = idx.symbols[i]
    if (sym.name == name) {
      if (kind == null || sym.kind == kind) {
        hits[] = sym
      }
    }
    i = i + 1
  }
  return hits
}

return query
