blob: 14363523282fef38da0245e8f23ef07c8f52e3b7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 itemis AG (http://www.itemis.eu) and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.xtext.xbase.lib;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import com.google.common.annotations.GwtCompatible;
import com.google.common.base.Objects;
/**
* This is an extension library for all {@link Object objects}.
*/
@GwtCompatible public class ObjectExtensions {
/**
* The <code>equals not</code> operator. This is the equivalent to a negated, null-safe
* {@link Object#equals(Object)} method.
*
* @param a
* an object.
* @param b
* another object.
* @return <code>true</code> if {@code a} and {@code b} are not equal.
*/
@Pure
@Inline(value="(!$3.equal($1, $2))", imported=Objects.class)
public static boolean operator_notEquals(Object a, Object b) {
return !Objects.equal(a, b);
}
/**
* The <code>equals</code> operator. This is the equivalent to a null-safe invocation of
* {@link Object#equals(Object)}.
*
* @param a
* an object.
* @param b
* another object.
* @return <code>true</code> if {@code a} and {@code b} are equal.
*/
@Pure
@Inline(value="$3.equal($1, $2)", imported=Objects.class)
public static boolean operator_equals(Object a, Object b) {
return Objects.equal(a, b);
}
/**
* Returns <code>true</code> if {@code a} and {@code b} are identical (the same instance)
* or both <code>null</code>. This is the equivalent to Java's <code>==</code>
* operator.
*
* @param a
* an object.
* @param b
* another object.
* @return Java's <code>a == b</code>
*/
@Pure
@Inline(value = "($1 == $2)", constantExpression = true)
public static boolean identityEquals(Object a, Object b) {
return a == b;
}
/**
* The <code>identity equals</code> operator. This is the equivalent to Java's <code>==</code>
* operator.
*
* @param a
* an object.
* @param b
* another object.
* @return Java's <code>a == b</code>
* @since 2.4
*/
@Pure
@Inline(value = "($1 == $2)", constantExpression = true)
public static boolean operator_tripleEquals(Object a, Object b) {
return a == b;
}
/**
* The <code>identity not equals</code> operator. This is the equivalent to Java's <code>!=</code>
* operator.
*
* @param a
* an object.
* @param b
* another object.
* @return Java's <code>a != b</code>
* @since 2.4
*/
@Pure
@Inline(value = "($1 != $2)", constantExpression = true)
public static boolean operator_tripleNotEquals(Object a, Object b) {
return a != b;
}
/**
* The <code>mappedTo</code> operator yields a {@link Pair} with {@code a} as the {@link Pair#getKey() key} and
* {@code b} as its {@link Pair#getValue() value}.
*
* @param a
* an object.
* @param b
* another object.
* @return a {@link Pair}. Never <code>null</code>.
*/
@Pure
@Inline(value="$3.$4of($1, $2)", imported=Pair.class)
public static <A, B> Pair<A, B> operator_mappedTo(A a, B b) {
return Pair.of(a, b);
}
/**
* The <code>doubleArrow</code> operator is used as a 'with'- or 'let'-operation.
* It allows to bind an object to a local scope in order to do something on it.
*
* Example:
* <code>
* new Person =&gt; [
* firstName = 'Han'
* lastName = 'Solo'
* ]
* </code>
*
* @param object
* an object. Can be <code>null</code>.
* @param block
* the block to execute with the given object. Must not be <code>null</code>.
* @return the reference to object.
* @since 2.3
*/
public static <T> T operator_doubleArrow(T object, Procedure1<? super T> block) {
block.apply(object);
return object;
}
/**
* The binary <code>+</code> operator that concatenates two strings.
*
* @param a
* an {@link Object}.
* @param b
* a {@link String}.
* @return <code>a + b</code>
* @since 2.3
*/
@Pure /* not guaranteed pure , since toString() is invoked on the argument a*/
@Inline("($1 + $2)")
public static String operator_plus(Object a, String b) {
return a + b;
}
/**
* The elvis operator <code>?:</code> is a short hand notation for
* providing default value in case an expression evaluates to <code>null</code>.
*
* Not that the Xtend compiler will inline calls to this not call this method with a short-circuit semantic.
* That is the second argument is only evaluated if the first one evaluates to <code>null</code>.
*
* Example:
* <code>person.name?:'Hans'</code>
*
* @param first
* an {@link Object}. Might be <code>null</code>.
* @param second
* an {@link Object}. Might be <code>null</code>.
*
* @return a reference to <code>first</code> if <code>first != null </code>, <code>second<code> otherwise,
* @since 2.3
*/
@Pure
public static <T> T operator_elvis(T first, T second) {
if (first != null)
return first;
return second;
}
}