code: func (n *NodeAbstractResource) References() []*addrs.Reference {
  	// If we have a config then we prefer to use that.
  	if c := n.Config; c != nil {
  		var result []*addrs.Reference
  
  		for _, traversal := range c.DependsOn {
  			ref, err := addrs.ParseRef(traversal)
  			if err != nil {
  				// We ignore this here, because this isn't a suitable place to return
  				// errors. This situation should be caught and rejected during
  				// validation.
  				log.Printf("[ERROR] Can't parse %#v from depends_on as reference: %s", traversal, err)
  				continue
  			}
  
  			result = append(result, ref)
  		}
  
  		if n.Schema == nil {
  			// Should never happens, but we'll log if it does so that we can
  			// see this easily when debugging.
  			log.Printf("[WARN] no schema is attached to %s, so config references cannot be detected", n.Name())
  		}
  
  		refs, _ := lang.ReferencesInExpr(c.Count)
  		result = append(result, refs...)
  		refs, _ = lang.ReferencesInBlock(c.Config, n.Schema)
  		result = append(result, refs...)
  		if c.Managed != nil {
  			for _, p := range c.Managed.Provisioners {
  				if p.When != configs.ProvisionerWhenCreate {
  					continue
  				}
  				if p.Connection != nil {
  					refs, _ = lang.ReferencesInBlock(p.Connection.Config, connectionBlockSupersetSchema)
  					result = append(result, refs...)
  				}
  
  				schema := n.ProvisionerSchemas[p.Type]
  				if schema == nil {
  					log.Printf("[WARN] no schema for provisioner %q is attached to %s, so provisioner block references cannot be detected", p.Type, n.Name())
  				}
  				refs, _ = lang.ReferencesInBlock(p.Config, schema)
  				result = append(result, refs...)
  			}
  		}
  		return result
  	}
  
  	// Otherwise, we have no references.
  	return nil
  }
docs: // GraphNodeReferencer