Skip to content

Language record

SCSS / Sass

Sass is read by delegation: the CSS subset is handed to the real CSS analyzer, and this module adds everything Sass puts on top — `@mixin` and `@function` with their parameters, `$variables`, and the `@include`, function-call, `$var`-read and `@extend` edges between them.

.scss · 1 registry id · 10 of 14 relationship types

The registry row this page is generated from

Read at render time from the same family row the register reads, so nothing in this block can disagree with it.

Extensions
.scss
Registry names
scss
Recorded symbols
mixins · functions · variables · nesting

Relationship types this analyzer constructs

10 of 14 constructed, read from this analyzer's source and re-derived by the languages gate. Each row below is one of the engine's types, in the engine's own order.

Relationship typeConstructed
callsconstructed by this analyzer
extendsconstructed by this analyzer
implementsruled absent
usespublished through delegated analyzers
importspublished through delegated analyzers
exportsconstructed by this analyzer
containspublished through delegated analyzers
referencesconstructed by this analyzer
overridesconstructed by this analyzer
instantiatesruled absent
decoratesruled absent
rendersruled absent
mixes_inconstructed by this analyzer
part_ofpublished through delegated analyzers

10 constructed, 4 not constructed. The 4 types marked as published through delegated analyzers come from the CSS analyzer this one hosts for inline blocks; their edges are stored under SCSS / Sass. All 4 absent types are recorded as ruled absent: the written reason and the corpus measurement behind each are in this family's completeness record. The register explains what each label means.

What this analyzer does not resolve

  • Both ends of an edge must resolve, so every Sass edge stays inside one file. An @include of a mixin declared in another partial, and a map.$brand read through a @use … as map namespace, produce no edge at all. That is deliberate — inventing an endpoint is the phantom the CSS lane removed once — but it is a real boundary, and it is the reason a function-call edge exists for double(4px) and not for a function two files away.
  • The grammar does not reach everything modern Sass writes. 95 of 244 files in the pinned corpus still carry a parse error, and @forward 'x' as prefix-*; — the dashed-prefix form of the as clause — is unsupported because the rule conflicts with the grammar's own binary-expression rule. The corpus contains 359 as * uses and 1 as common, and the unsupported form occurs zero times, so it is declared rather than designed around.
  • @use and @forward become import records on the file carrying the as namespace, because @use 'sass:map' as map and @use 'sass:map' as m are the same import and two different graphs. A namespaced call such as map.merge($a, $b) is then a use of the namespace THIS file declares, and the bare form name(...) in a value is a function call rather than a mixin invocation, so one call site never claims to be two different relationships.

Every line above was written against SCSS / Sass’s own analyzer module and is named against a construct in it, so it can be checked against the source. Nothing here is inherited from a template, or from another language’s page.

Where you meet it in a repository

Recognised by extension — .scss. Everything below is about where those files actually sit in a working repository.

  • Delegation is the architecture rather than a shortcut. The SCSS grammar extends the CSS grammar, so every CSS node type exists in a .scss file and the CSS walk already handles rule sets, & nesting, @media, @layer, @scope, @keyframes and @import. Reimplementing that would be roughly 2,700 duplicated lines whose only possible outcome is two implementations that agree today and drift tomorrow — and the grammar does not even inherit the CSS lane's local patches.
  • The boundary is measured rather than assumed: the CSS analyzer publishes the selectors and their nesting chains and nothing for any SCSS statement, because mixin_statement, include_statement and use_statement are different node types that its at-rule dispatch never sees.
  • A Sass variable is assigned in several places by design — a !default at the top and an override inside a theme — and $brand assigned twice is ONE symbol, kept at its first occurrence so the symbol points where the variable is introduced rather than at its last override.

Questions this index answers

Phrased as retrievals, because that is what an index can honestly do: it holds the symbols and the edges between them, and hands them back with the evidence attached.

  1. Which mixins and functions does this partial declare?
  2. Which mixin does this rule include?
  3. Which variable does this value read, and which one declares it?
  4. Which selector does this @extend reach?

What the analyzer sees in code like this

A module import, a mixin, a variable, and the two edges a rule publishes
@use "sass:map";

$radius: 4px;                  // bb records: variable $radius

@mixin card($pad: 1rem) {      // bb records: function @mixin card, with its parameters
  padding: $pad;
}

.card {                        // published by the CSS analyzer, which is delegated
  @include card(2rem);         // bb records: uses -> @mixin card (this file declares it)
  width: double($radius);      // bb records: uses -> the @function double
}

Symbols are stored with the file they came from and the bytes they span, so a hit points at a line rather than at a guess. The annotations in the sample are commentary for the reader, not strings the index would store.

Languages that turn up in the same repository

Web, data & config — the count beside each name is how many relationship types that family’s analyzer constructs.

The extensions, registry names, recorded symbols and relationship types above are the parser registry row for SCSS / Sass, read while the page rendered — the same row the register reads, so the two surfaces cannot tell two stories. Every relationship type listed as constructed appears in src/ast/real-*, the analyzer modules bb ships. bb 0.1.0 answers from a local store over 50 languages (53 registry ids, three of them aliases). There is no benchmark on this page: every claim here is one you can go and read in the source.