/*
* This file is part of Mixin, licensed under the MIT License (MIT).
*
* Copyright (c) SpongePowered <https://www.spongepowered.org>
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.spongepowered.asm.mixin.extensibility;
import org.apache.logging.log4j.Level;
/**
* Interface for objects which want to perform custom behaviour when fatal mixin
* errors occur. For example displaying a user-friendly error message
*/
public interface IMixinErrorHandler {
/**
* Action to take when handling an error. By default, if a config is marked
* as "required" then the default action will be {@link #ERROR}, and will be
* {@link #WARN} otherwise.
*/
public static enum ErrorAction {
/**
* Take no action, this should be treated as a non-critical error and
* processing should continue
*/
NONE(Level.INFO),
/**
* Generate a warning but continue processing
*/
WARN(Level.WARN),
/**
* Throw a
* {@link org.spongepowered.asm.mixin.throwables.MixinApplyError} to
* halt further processing if possible
*/
ERROR(Level.FATAL);
/**
* Logging level for the specified error action
*/
public final Level logLevel;
private ErrorAction(Level logLevel) {
this.logLevel = logLevel;
}
}
/**
* Called when an error occurs whilst initialising a mixin config. This
* allows the plugin to display more user-friendly error messages if
* required.
*
* <p>By default, when a critical error occurs the mixin processor will
* raise a warning if the config is not marked as "required" and will throw
* an {@link Error} if it is. This behaviour can be altered by returning
* different values from this method.</p>
*
* <p>The original throwable which was caught is passed in via the <code>
* th</code> parameter and the default action is passed in to the <code>
* action</code> parameter. A plugin can choose to output a friendly message
* but leave the original behaviour intact (by returning <code>null</code>
* or returning <code>action</code> directly. Alternatively it may throw a
* different exception or error, or can reduce the severity of the error by
* returning a different {@link ErrorAction}.</p>
*
* @param config Config being prepared when the error occurred
* @param th Throwable which was caught
* @param mixin Mixin which was being applied at the time of the error
* @param action Default action
* @return null to perform the default action (or return action) or new
* action to take
*/
public abstract ErrorAction onPrepareError(IMixinConfig config, Throwable th, IMixinInfo mixin, ErrorAction action);
/**
* Called when an error occurs applying a mixin. This allows
* the plugin to display more user-friendly error messages if required.
*
* <p>By default, when a critical error occurs the mixin processor will
* raise a warning if the config is not marked as "required" and will throw
* an {@link Error} if it is. This behaviour can be altered by returning
* different values from this method.</p>
*
* <p>The original throwable which was caught is passed in via the <code>
* th</code> parameter and the default action is passed in to the <code>
* action</code> parameter. A plugin can choose to output a friendly message
* but leave the original behaviour intact (by returning <code>null</code>
* or returning <code>action</code> directly. Alternatively it may throw a
* different exception or error, or can reduce the severity of the error by
* returning a different {@link ErrorAction}.</p>
*
* @param targetClassName Class being transformed when the error occurred
* @param th Throwable which was caught
* @param mixin Mixin which was being applied at the time of the error
* @param action Default action
* @return null to perform the default action (or return action) or new
* action to take
*/
public abstract ErrorAction onApplyError(String targetClassName, Throwable th, IMixinInfo mixin, ErrorAction action);
}