code: func (n *NodeValidatableResource) EvalTree() EvalNode {
  	addr := n.ResourceAddr()
  	config := n.Config
  
  	// Declare the variables will be used are used to pass values along
  	// the evaluation sequence below. These are written to via pointers
  	// passed to the EvalNodes.
  	var provider providers.Interface
  	var providerSchema *ProviderSchema
  	var configVal cty.Value
  
  	seq := &EvalSequence{
  		Nodes: []EvalNode{
  			&EvalGetProvider{
  				Addr:   n.ResolvedProvider,
  				Output: &provider,
  				Schema: &providerSchema,
  			},
  			&EvalValidateResource{
  				Addr:           addr.Resource,
  				Provider:       &provider,
  				ProviderSchema: &providerSchema,
  				Config:         config,
  				ConfigVal:      &configVal,
  			},
  		},
  	}
  
  	if managed := n.Config.Managed; managed != nil {
  		hasCount := n.Config.Count != nil
  
  		// Validate all the provisioners
  		for _, p := range managed.Provisioners {
  			var provisioner provisioners.Interface
  			var provisionerSchema *configschema.Block
  
  			if p.Connection == nil {
  				p.Connection = config.Managed.Connection
  			} else if config.Managed.Connection != nil {
  				p.Connection.Config = configs.MergeBodies(config.Managed.Connection.Config, p.Connection.Config)
  			}
  
  			seq.Nodes = append(
  				seq.Nodes,
  				&EvalGetProvisioner{
  					Name:   p.Type,
  					Output: &provisioner,
  					Schema: &provisionerSchema,
  				},
  				&EvalValidateProvisioner{
  					ResourceAddr:     addr.Resource,
  					Provisioner:      &provisioner,
  					Schema:           &provisionerSchema,
  					Config:           p,
  					ResourceHasCount: hasCount,
  				},
  			)
  		}
  	}
  
  	return seq
  }
docs: // GraphNodeEvalable