code: func (b *EvalGraphBuilder) Steps() []GraphTransformer {
  	concreteProvider := func(a *NodeAbstractProvider) dag.Vertex {
  		return &NodeEvalableProvider{
  			NodeAbstractProvider: a,
  		}
  	}
  
  	steps := []GraphTransformer{
  		// Creates all the data resources that aren't in the state. This will also
  		// add any orphans from scaling in as destroy nodes.
  		&ConfigTransformer{
  			Concrete: nil, // just use the abstract type
  			Config:   b.Config,
  			Unique:   true,
  		},
  
  		// Attach the state
  		&AttachStateTransformer{State: b.State},
  
  		// Attach the configuration to any resources
  		&AttachResourceConfigTransformer{Config: b.Config},
  
  		// Add root variables
  		&RootVariableTransformer{Config: b.Config},
  
  		// Add the local values
  		&LocalTransformer{Config: b.Config},
  
  		// Add the outputs
  		&OutputTransformer{Config: b.Config},
  
  		// Add module variables
  		&ModuleVariableTransformer{Config: b.Config},
  
  		TransformProviders(b.Components.ResourceProviders(), concreteProvider, b.Config),
  
  		// Must attach schemas before ReferenceTransformer so that we can
  		// analyze the configuration to find references.
  		&AttachSchemaTransformer{Schemas: b.Schemas},
  
  		// Connect so that the references are ready for targeting. We'll
  		// have to connect again later for providers and so on.
  		&ReferenceTransformer{},
  
  		// Although we don't configure providers, we do still start them up
  		// to get their schemas, and so we must shut them down again here.
  		&CloseProviderTransformer{},
  
  		// Single root
  		&RootTransformer{},
  
  		// Remove redundant edges to simplify the graph.
  		&TransitiveReductionTransformer{},
  	}
  
  	return steps
  }
docs: // See GraphBuilder