code: function survey(name) {
          let id = name.id;
  
  // Tally the property name. If it is a string, only tally strings that conform
  // to the identifier rules.
  
          if (id === "(string)") {
              id = name.value;
              if (!rx_identifier.test(id)) {
                  return id;
              }
          } else if (id === "`") {
              if (name.value.length === 1) {
                  id = name.value[0].value;
                  if (!rx_identifier.test(id)) {
                      return id;
                  }
              }
          } else if (!name.identifier) {
              return stop("expected_identifier_a", name);
          }
  
  // If we have seen this name before, increment its count.
  
          if (typeof property[id] === "number") {
              property[id] += 1;
  
  // If this is the first time seeing this property name, and if there is a
  // tenure list, then it must be on the list. Otherwise, it must conform to
  // the rules for good property names.
  
          } else {
              if (tenure !== undefined) {
                  if (tenure[id] !== true) {
                      warn("unregistered_property_a", name);
                  }
              } else {
                  if (name.identifier && rx_bad_property.test(id)) {
                      warn("bad_property_a", name);
                  }
              }
              property[id] = 1;
          }
          return id;
      }
docs: arity       string label       identifier name        identifier expression  expressions block       statements else        statements (else, default, catch) Specialized tokens may have additional properties.