code: func (t *Tree) versionedPathKey(m *Module) string {
  	path := make([]string, len(t.path)+1)
  	path[len(path)-1] = m.Name + ";" + m.Source
  	// We're going to load these in order for easier reading and debugging, but
  	// in practice they only need to be unique and consistent.
  
  	p := t
  	i := len(path) - 2
  	for ; i >= 0; i-- {
  		if p == nil {
  			break
  		}
  		// we may have been loaded under a blank Tree, so always check for a name
  		// too.
  		if p.name == "" {
  			break
  		}
  		seg := p.name
  		if p.version != "" {
  			seg += "#" + p.version
  		}
  
  		if p.source != "" {
  			seg += ";" + p.source
  		}
  
  		path[i] = seg
  		p = p.parent
  	}
  
  	key := strings.Join(path, "|")
  	return key
  }
docs: // versionedPathKey returns a path string with every levels full name, version
  // and source encoded. This is to provide a unique key for our module storage,
  // since submodules need to know which versions of their ancestor modules they
  // are loaded from.
  // For example, if module A has a subdirectory B, if module A's source or
  // version is updated B's storage key must reflect this change in order for the
  // correct version of B's source to be loaded.