anchor.diff:              getFunctionDeclarationHir(queryContext, declarationId);
           if (functionHir.isStatic) return;
         } else if (declarationId.isProperty) {
  -        final propertyHir =
  -            getPropertyDeclarationHir(queryContext, declarationId);
  -        if (propertyHir.isStatic) return;
  +        // YAW: `getPropertyDeclarationHir` already tries to lower the
  +        // initializer, which results in a cycle when we try to find out whether
  +        // the property we're trying to lower is static or not.
  +        final propertyAst =
  +            getPropertyDeclarationAst(queryContext, declarationId);
  +        if (propertyAst.isStatic || declarationId.parent.isModule) return;
         } else {
           throw CompilerError.unsupportedFeature(
             "Tried lowering an identifier in a body that's neither in a function nor in a property.",
  
positive.code:       return Some(result.value);
      } else if (declarationId.isProperty) {
        final propertyAst = getPropertyDeclarationAst(context, declarationId);
        if (propertyAst.initializer == null) return None();
  
        final result = PropertyContext.lowerProperty(context, declarationId);
        // ignore: only_throw_errors, Iterables of errors are also handled.
        if (result is Error) throw result.error;
        return Some(Tuple2([result.value.first], result.value.second));
      } else {
        throw CompilerError.unsupportedFeature(
          'Unsupported body.',
  
negative.code:       /// 1. to get from trait to impl
        /// 2. to get from impl to class
        /// 3. to get from class to instance
        ///
        /// Update(2020-12-16): Sometimes, this doesn't work.
  
        // from class to instance
        final genericsMap = Map.fromEntries(typeParameters
  