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

template.ast.components.OptionalComponent.tt Maven / Gradle / Ivy

There is a newer version: 2.3.6
Show newest version
# Copyright (c) 2013-2016, The JastAdd Team
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#     * Redistributions of source code must retain the above copyright notice,
#       this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of the Lund University nor the names of its
#       contributors may be used to endorse or promote products derived from
#       this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

Opt.isEmpty [[$Opt.EMPTY == node || node instanceof $Opt && (($Opt) node).numChildren() <= 0]]

Opt.additionalDeclarations [[
$if(EmptyContainerSingletons)
  protected static final $Opt $Opt.EMPTY = new $Opt() {
    @Override
    public void insertChild($ASTNode node, int i) {
      throw new Error("attempting to insertChild() on empty $(Opt) singleton!");
    }
    @Override
    public void addChild($ASTNode node) {
      throw new Error("attempting to addChild() on empty $(Opt) singleton!");
    }
    @Override
    public void removeChild(int i) {
      throw new Error("attempting to removeChild() on empty $(Opt) singleton!");
    }
    @Override
    public void setChild($ASTNode child, int pos) {
      throw new Error("attempting to setChild() in empty $Opt singleton!");
    }
  };
$endif
]]

OptionalComponent [[

$if(!#isNTA)
  /**
   * Replaces the optional node for the $Name child. This is the $Opt
   * node containing the child $Name, not the actual child!
   * @param opt The new node to be used as the optional node for the $Name child.
   * @apilevel low-level
   */
  $Modifier void $Host.set$(Name)Opt($OptType opt) {
    $SynchBegin
    $include(State.incHookConstructionStart)
    setChild(opt, $Index);
    $include(State.incHookConstructionEnd)
    $SynchEnd
  }

$endif
$if(#ntaShadowingNonNTA)
  /**
   * This method should not be called. This method throws an exception due to
   * the corresponding child being an NTA shadowing a non-NTA child.
   * @param node
   * @apilevel internal
   */
  public void $Host.set$(Name)Opt($OptType node) {
    throw new Error("Can not replace NTA child $(Name)Opt in $Host!");
  }

$endif
  /**
   * Replaces the (optional) $Name child.
   * @param node The new node to be used as the $Name child.
   * @apilevel high-level
   */
  $Modifier void $Host.set$Name($Type node) {
    $SynchBegin
    $include(State.incHookConstructionStart)
$if(EmptyContainerSingletons)
  $if(#isNTA)
    // TODO: should also check if getOpt() is the empty singleton, since we check the _value on return.
    get$(Name)Opt().setChild(node, 0);
  $else
    if (node != null) {
      setChild(new $Opt(node), $Index);
    } else {
      setChild($Opt.EMPTY, $Index);
    }
  $endif
$else
    get$(Name)Opt().setChild(node, 0);
$endif
    $include(State.incHookConstructionEnd)
    $SynchEnd
  }

  /**
   * Check whether the optional $Name child exists.
   * @return {@code true} if the optional $Name child exists, {@code false} if it does not.
   * @apilevel high-level
   */
  $Modifier boolean $Host.has$Name() {
    $SynchBegin
    return get$(Name)Opt().getNumChild() != 0;
    $SynchEnd
  }

  /**
   * Retrieves the (optional) $Name child.
   * @return The $Name child, if it exists. Returns {@code null} otherwise.
   * @apilevel low-level
   */
  #annotations
  $Modifier $Type $Host.get$Name() {
    $SynchBegin
    return ($Type) get$(Name)Opt().getChild(0);
    $SynchEnd
  }

$if(#isNTA)
  /**
   * Retrieves the optional node for child $Name. This is the $Opt node containing the child $Name, not the actual child!
   * 

This method does not invoke AST transformations.

* @return The optional node for child $Name. * @apilevel low-level */ #annotations $Modifier $OptType $Host.get$(Name)OptNoTransform() { $SynchBegin return ($OptType) getChildNoTransform($Index); $SynchEnd } /** * Retrieves the child position of the optional child $Name. * @return The the child position of the optional child $Name. * @apilevel low-level */ protected int $Host.get$(Name)OptChildPosition() { return $Index; } $else /** * Retrieves the optional node for the $Name child. This is the $Opt node containing the child $Name, not the actual child! * @return The optional node for child the $Name child. * @apilevel low-level */ #annotations $include(OptionalComponent.generatedAnnotations) $Modifier $OptType $Host.get$(Name)Opt() { $SynchBegin return ($OptType) getChild($Index); $SynchEnd } /** * Retrieves the optional node for child $Name. This is the $Opt node containing the child $Name, not the actual child! *

This method does not invoke AST transformations.

* @return The optional node for child $Name. * @apilevel low-level */ #annotations $Modifier $OptType $Host.get$(Name)OptNoTransform() { $SynchBegin return ($OptType) getChildNoTransform($Index); $SynchEnd } $endif ]]




© 2015 - 2024 Weber Informatics LLC | Privacy Policy