blob: ab46baa180d6e2f0dc14fc7af8dcc7fb0dc7e05c [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.analysis.producers;
import com.google.auto.value.AutoOneOf;
import com.google.devtools.build.lib.analysis.InvalidVisibilityDependencyException;
import com.google.devtools.build.lib.analysis.config.DependencyEvaluationException;
import com.google.devtools.build.lib.analysis.starlark.StarlarkTransition.TransitionException;
import com.google.devtools.build.lib.skyframe.AspectCreationException;
import com.google.devtools.build.lib.skyframe.config.PlatformMappingException;
import com.google.devtools.build.lib.skyframe.toolchains.PlatformLookupUtil.InvalidPlatformException;
import com.google.devtools.common.options.OptionsParsingException;
/** Tagged union of exceptions thrown by {@link DependencyProducer}. */
@AutoOneOf(DependencyError.Kind.class)
public abstract class DependencyError {
/**
* Tags for different error types.
*
* <p>The earlier in this list, the higher the priority when there are multiple errors. See {@link
* #isSecondErrorMoreImportant}.
*/
public enum Kind {
DEPENDENCY_OPTIONS_PARSING,
DEPENDENCY_TRANSITION,
INVALID_VISIBILITY,
/** An error occurred either computing the aspect collection or merging the aspect values. */
ASPECT_EVALUATION,
/** An error occurred during evaluation of the aspect using Skyframe. */
ASPECT_CREATION,
/** An error occurred during evaluation of platform mappings. */
PLATFORM_MAPPING,
/** An error occurred while looking up the target platform. */
INVALID_PLATFORM,
}
public abstract Kind kind();
public abstract OptionsParsingException dependencyOptionsParsing();
public abstract TransitionException dependencyTransition();
public abstract InvalidVisibilityDependencyException invalidVisibility();
public abstract DependencyEvaluationException aspectEvaluation();
public abstract AspectCreationException aspectCreation();
public abstract PlatformMappingException platformMapping();
public abstract InvalidPlatformException invalidPlatform();
public static boolean isSecondErrorMoreImportant(DependencyError first, DependencyError second) {
// There isn't a good way to prioritize when the type matches, so we just keep the first.
return first.kind().compareTo(second.kind()) > 0;
}
public Exception getException() {
switch (kind()) {
case DEPENDENCY_OPTIONS_PARSING:
return dependencyOptionsParsing();
case DEPENDENCY_TRANSITION:
return dependencyTransition();
case INVALID_VISIBILITY:
return invalidVisibility();
case ASPECT_EVALUATION:
return aspectEvaluation();
case ASPECT_CREATION:
return aspectCreation();
case PLATFORM_MAPPING:
return platformMapping();
case INVALID_PLATFORM:
return invalidPlatform();
}
throw new IllegalStateException("unreachable");
}
static DependencyError of(TransitionException e) {
return AutoOneOf_DependencyError.dependencyTransition(e);
}
static DependencyError of(OptionsParsingException e) {
return AutoOneOf_DependencyError.dependencyOptionsParsing(e);
}
static DependencyError of(InvalidVisibilityDependencyException e) {
return AutoOneOf_DependencyError.invalidVisibility(e);
}
static DependencyError of(DependencyEvaluationException e) {
return AutoOneOf_DependencyError.aspectEvaluation(e);
}
static DependencyError of(AspectCreationException e) {
return AutoOneOf_DependencyError.aspectCreation(e);
}
static DependencyError of(PlatformMappingException e) {
return AutoOneOf_DependencyError.platformMapping(e);
}
static DependencyError of(InvalidPlatformException e) {
return AutoOneOf_DependencyError.invalidPlatform(e);
}
}