All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.helger.html.jscode.JSExpr Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2014-2016 Philip Helger (www.helger.com)
 * philip[at]helger[dot]com
 *
 * 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.helger.html.jscode;

import java.math.BigDecimal;
import java.math.BigInteger;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import com.helger.commons.ValueEnforcer;
import com.helger.commons.annotation.CodingStyleguideUnaware;
import com.helger.commons.annotation.Nonempty;
import com.helger.commons.annotation.PresentForCodeCoverage;
import com.helger.commons.collection.ArrayHelper;
import com.helger.html.jscode.type.JSPrimitiveType;
import com.helger.json.IJson;

/**
 * Factory methods that generate various {@link IJSExpression}s.
 *
 * @author Philip Helger
 */
@Immutable
public final class JSExpr
{
  public static final IJSExpression THIS = new JSAtom ("this");

  public static final IJSExpression NULL = new JSAtom ("null");

  /**
   * Boolean constant that represents true
   */
  public static final JSAtomBoolean TRUE = new JSAtomBoolean (true);

  /**
   * Boolean constant that represents false
   */
  public static final JSAtomBoolean FALSE = new JSAtomBoolean (false);

  /**
   * Boolean constant that represents undefined
   */
  public static final JSAtom UNDEFINED = new JSAtom ("undefined");

  /**
   * Boolean constant that represents undefined
   */
  public static final JSStringLiteral UNDEFINED_STR = new JSStringLiteral ("undefined");

  /** Number of int atoms cached */
  private static final int MAX_ATOM_INT_CACHE = 256;

  private static final JSAtomInt [] INT_CACHE = new JSAtomInt [MAX_ATOM_INT_CACHE];

  static
  {
    for (int i = 0; i < INT_CACHE.length; ++i)
      INT_CACHE[i] = new JSAtomInt (i);
  }

  @PresentForCodeCoverage
  private static final JSExpr s_aInstance = new JSExpr ();

  /**
   * This class is not instancable.
   */
  private JSExpr ()
  {}

  @Nonnull
  public static JSAssignment assign (@Nonnull final IJSAssignmentTarget aLhs, @Nonnull final String sValue)
  {
    return assign (aLhs, JSExpr.lit (sValue));
  }

  @Nonnull
  public static JSAssignment assign (@Nonnull final IJSAssignmentTarget aLhs, @Nonnull final IJSExpression aRhs)
  {
    return new JSAssignment (aLhs, "=", aRhs);
  }

  @Nonnull
  public static JSAssignment assignPlus (@Nonnull final IJSAssignmentTarget aLhs, @Nonnull final IJSExpression aRhs)
  {
    return new JSAssignment (aLhs, "+=", aRhs);
  }

  @Nonnull
  public static JSAssignment assignMinus (@Nonnull final IJSAssignmentTarget aLhs, @Nonnull final IJSExpression aRhs)
  {
    return new JSAssignment (aLhs, "-=", aRhs);
  }

  @Nonnull
  public static JSAssignment assignMultiply (@Nonnull final IJSAssignmentTarget aLhs, @Nonnull final IJSExpression aRhs)
  {
    return new JSAssignment (aLhs, "*=", aRhs);
  }

  @Nonnull
  public static JSAssignment assignDivide (@Nonnull final IJSAssignmentTarget aLhs, @Nonnull final IJSExpression aRhs)
  {
    return new JSAssignment (aLhs, "/=", aRhs);
  }

  @Nonnull
  public static JSAssignment assignModulo (@Nonnull final IJSAssignmentTarget aLhs, @Nonnull final IJSExpression aRhs)
  {
    return new JSAssignment (aLhs, "%=", aRhs);
  }

  @Nonnull
  @CodingStyleguideUnaware
  public static JSInvocation _new (@Nonnull final AbstractJSType aType)
  {
    return new JSInvocation (aType);
  }

  @Nonnull
  public static JSInvocation invoke (@Nonnull final JSVar aVar)
  {
    return new JSInvocation ((IJSExpression) null, aVar.name ());
  }

  @Nonnull
  public static JSInvocation invoke (@Nonnull @Nonempty final String sMethod)
  {
    return new JSInvocation ((IJSExpression) null, sMethod);
  }

  @Nonnull
  public static JSInvocation invoke (@Nonnull final JSMethod aMethod)
  {
    return new JSInvocation ((IJSExpression) null, aMethod);
  }

  @Nonnull
  public static JSInvocation invoke (@Nullable final IJSExpression aLhs, @Nonnull @Nonempty final String sMethod)
  {
    return new JSInvocation (aLhs, sMethod);
  }

  @Nonnull
  public static JSInvocation invoke (@Nullable final IJSExpression aLhs, @Nonnull final JSMethod aMethod)
  {
    return new JSInvocation (aLhs, aMethod);
  }

  @Nonnull
  public static JSInvocation invokeThis (@Nonnull @Nonempty final String sMethod)
  {
    return invoke (THIS, sMethod);
  }

  @Nonnull
  public static JSInvocation invokeThis (@Nonnull final JSMethod aMethod)
  {
    return invoke (THIS, aMethod);
  }

  @Nonnull
  public static JSRef ref (@Nonnull @Nonempty final String sField)
  {
    return new JSRef (sField);
  }

  @Nonnull
  public static JSRef ref (@Nonnull @Nonempty final JSFunction aFunction)
  {
    return new JSRef (aFunction.name ());
  }

  @Nonnull
  public static JSFieldRef ref (@Nonnull final IJSExpression aLhs, @Nonnull final JSVar aField)
  {
    return new JSFieldRef (aLhs, aField);
  }

  @Nonnull
  public static JSFieldRef ref (@Nonnull final IJSExpression aLhs, @Nonnull final String sField)
  {
    return new JSFieldRef (aLhs, sField);
  }

  @Nonnull
  public static JSFieldRef ref (@Nonnull final IJSExpression aLhs, @Nonnull final String... aFields)
  {
    if (ArrayHelper.isEmpty (aFields))
      throw new IllegalArgumentException ("Fields may not be empty");

    JSFieldRef ret = new JSFieldRef (aLhs, aFields[0]);
    for (int i = 1; i < aFields.length; ++i)
      ret = new JSFieldRef (ret, aFields[i]);
    return ret;
  }

  /**
   * @param aField
   *        Field to reference
   * @return this.aField
   */
  @Nonnull
  public static JSFieldRef refThis (@Nonnull final JSVar aField)
  {
    return ref (THIS, aField);
  }

  /**
   * @param sField
   *        Field name to reference
   * @return this.sField
   */
  @Nonnull
  public static JSFieldRef refThis (@Nonnull final String sField)
  {
    return ref (THIS, sField);
  }

  /**
   * @param aFields
   *        Field names to reference
   * @return this.aFields[0].aFields[1]....
   */
  @Nonnull
  public static JSFieldRef refThis (@Nonnull final String... aFields)
  {
    return ref (THIS, aFields);
  }

  @Nonnull
  public static JSArrayCompRef component (@Nonnull final IJSExpression aLhs, @Nonnull final IJSExpression aIndex)
  {
    return new JSArrayCompRef (aLhs, aIndex);
  }

  @Nonnull
  public static JSCast cast (@Nonnull final AbstractJSType aType, @Nonnull final IJSExpression aExpr)
  {
    return new JSCast (aType, aExpr);
  }

  @Nonnull
  public static JSAtomBoolean lit (final boolean bValue)
  {
    return bValue ? TRUE : FALSE;
  }

  @Nonnull
  public static JSAtomInt lit (final int nValue)
  {
    return nValue >= 0 && nValue < MAX_ATOM_INT_CACHE ? INT_CACHE[nValue] : new JSAtomInt (nValue);
  }

  @Nonnull
  public static JSAtomInt lit (final long nValue)
  {
    return nValue >= 0 && nValue < MAX_ATOM_INT_CACHE ? INT_CACHE[(int) nValue] : new JSAtomInt (nValue);
  }

  @Nonnull
  public static JSAtom lit (@Nonnull final BigInteger aValue)
  {
    return new JSAtom (aValue.toString ());
  }

  @Nonnull
  public static AbstractJSExpression lit (final float fValue)
  {
    if (Float.isNaN (fValue))
      return JSPrimitiveType.NUMBER.nan ();
    return new JSAtomDecimal (fValue);
  }

  @Nonnull
  public static AbstractJSExpression lit (final double dValue)
  {
    if (Double.isNaN (dValue))
      return JSPrimitiveType.NUMBER.nan ();
    return new JSAtomDecimal (dValue);
  }

  @Nonnull
  public static JSAtomBigDecimal lit (@Nonnull final BigDecimal aValue)
  {
    return new JSAtomBigDecimal (aValue);
  }

  @Nonnull
  public static JSStringLiteral lit (final char cValue)
  {
    return new JSStringLiteral (Character.toString (cValue));
  }

  @Nonnull
  public static JSStringLiteral lit (@Nonnull final String sValue)
  {
    return new JSStringLiteral (sValue);
  }

  @Nonnull
  public static JSRegExLiteral regex (@Nonnull final String sRegEx)
  {
    return new JSRegExLiteral (sRegEx);
  }

  @Nonnull
  public static JSExprDirect json (@Nonnull final IJson aJson)
  {
    ValueEnforcer.notNull (aJson, "Json");

    return direct (aJson.getAsJsonString ());
  }

  /**
   * Creates an expression directly from a source code fragment.
   * 

* This method can be used as a short-cut to create a {@link IJSExpression}. * For example, instead of _a.gt(_b), you can write it as: * JSExpr.direct("a>b"). *

* Be warned that there is a danger in using this method, as it obfuscates the * object model. * * @param sSource * direct JS code * @return Direct expression */ @Nonnull public static JSExprDirect direct (@Nonnull final String sSource) { return new JSExprDirect (sSource); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy