code: final boolean canDeclare(String name) {
      return !hasOwnSlot(name)
          && (!isFunctionBlockScope()
              || !getParent().hasOwnSlot(name)
              || isBleedingFunctionName(name));
    }
docs: Returns true if the name can be declared on this scope without causing illegal shadowing.
  Specifically, this is aware of the connection between function container scopes and function
  block scopes and returns false for redeclaring parameters on the block scope.