TeaVM.java

/* ========================================================================
 * PlantUML : a free UML diagram generator
 * ========================================================================
 *
 * (C) Copyright 2009-2025, Arnaud Roques
 *
 * Project Info:  https://plantuml.com
 *
 * If you like this project or if you find it useful, you can support us at:
 *
 * https://plantuml.com/patreon (only 1$ per month!)
 * https://plantuml.com/paypal
 *
 * This file is part of PlantUML.
 *
 * PlantUML is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * PlantUML distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
 * License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 * USA.
 *
 *
 * Original Author:  Arnaud Roques
 *
 */
package net.sourceforge.plantuml.teavm;

import net.sourceforge.plantuml.abel.LeafType;

// ::comment when JAVA8
// import org.teavm.interop.PlatformMarker;
// ::done

public class TeaVM {

	/**
	 * Platform marker method used to distinguish TeaVM compilation from standard
	 * JVM execution.
	 *
	 * When compiling to JavaScript, TeaVM resolves this method statically to
	 * {@code true}. As a result, conditional branches like:
	 *
	 * <pre>
	 * if (TeaVM.isTeaVM()) {
	 * 	// TeaVM-specific code
	 * } else {
	 * 	// JVM-specific code
	 * }
	 * </pre>
	 * 
	 * are evaluated at compile time, and the unreachable branch is completely
	 * removed from the generated JavaScript output (dead code elimination).
	 * 
	 * When running on the JVM, this method simply returns {@code false} and no code
	 * elimination occurs: both branches remain present in the bytecode.
	 * 
	 * This mechanism is intended purely as a compile-time optimization hint for
	 * TeaVM, not as a runtime platform check.
	 */
	// ::comment when JAVA8
	@org.teavm.interop.PlatformMarker
	// ::done
	public static boolean isTeaVM() {
		return false;
	}
	
	/**
	 * Guard method for assertions, ensuring they are removed from the
	 * generated JavaScript output.
	 *
	 * Returns {@code true} on the JVM (allowing the assertion to execute)
	 * and {@code false} under TeaVM (skipping it entirely via dead code
	 * elimination).
	 *
	 * <pre>
	 * if (TeaVM.a()) assert ...
	 * </pre>
	 */
	public static boolean a() {
		return !isTeaVM();
	}

}