blob: 67e8d37588a5e1ad6d5fef7c3340c4d468d2d9f6 [file] [log] [blame]
// Copyright 2023 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package com.google.devtools.build.lib.bazel.bzlmod;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.cmdline.RepositoryName;
/** Represents a node in the external dependency graph. */
abstract class ModuleBase {
/**
* The name of the module, as specified in this module's MODULE.bazel file. Can be empty if this
* is the root module.
*/
public abstract String getName();
/**
* The version of the module, as specified in this module's MODULE.bazel file. Can be empty if
* this is the root module, or if this module comes from a {@link NonRegistryOverride}.
*/
public abstract Version getVersion();
/**
* The key of this module in the dependency graph. Note that, although a {@link ModuleKey} is also
* just a (name, version) pair, its semantics differ from {@link #getName} and {@link
* #getVersion}, which are always as specified in the MODULE.bazel file. The {@link ModuleKey}
* returned by this method, however, will have the following special semantics:
*
* <ul>
* <li>The name of the {@link ModuleKey} is the same as {@link #getName}, unless this is the
* root module, in which case the name of the {@link ModuleKey} must be empty.
* <li>The version of the {@link ModuleKey} is the same as {@link #getVersion}, unless this is
* the root module OR this module has a {@link NonRegistryOverride}, in which case the
* version of the {@link ModuleKey} must be empty.
* </ul>
*/
public abstract ModuleKey getKey();
public final RepositoryName getCanonicalRepoName() {
return getKey().getCanonicalRepoName();
}
/**
* The name of the repository representing this module, as seen by the module itself. By default,
* the name of the repo is the name of the module. This can be specified to ease migration for
* projects that have been using a repo name for itself that differs from its module name.
*/
public abstract String getRepoName();
/**
* Target patterns identifying execution platforms to register when this module is selected. Note
* that these are what was written in module files verbatim, and don't contain canonical repo
* names.
*/
public abstract ImmutableList<String> getExecutionPlatformsToRegister();
/**
* Target patterns identifying toolchains to register when this module is selected. Note that
* these are what was written in module files verbatim, and don't contain canonical repo names.
*/
public abstract ImmutableList<String> getToolchainsToRegister();
/** The module extensions used in this module. */
public abstract ImmutableList<ModuleExtensionUsage> getExtensionUsages();
}