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

template.ast.InheritedAttributes.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.

InhEq.defaultInhDefineMethod [[
  /** @apilevel internal */
  public #type Define_#name($ASTNode _callerNode, $ASTNode _childNode#inhParametersDeclTail) {
    ASTNode self = this;
    ASTNode parent = getParent();
    while (parent != null && !parent.canDefine_#name(self, _callerNode#inhParametersTail)) {
      _callerNode = self;
      self = parent;
      parent = self.getParent();
    }
$if(DebugMode)
    if (parent == null) {
      throw new RuntimeException(
          "Trying to evaluate inherited attribute #name in detached subtree (parent == null)");
    }
$endif
    return parent.Define_#name(self, _callerNode#inhParametersTail);
  }

  /**
   * #declaredat
   * @apilevel internal
   * @return {@code true} if this node has an equation for the inherited attribute #name
   */
  protected boolean canDefine_#name($ASTNode _callerNode, $ASTNode _childNode#inhParametersDeclTail) {
    return false;
  }
]]

# The shell for the Define_NAME method. The body is bound to the InhEqClauses variable.
InhDecl.DefineInhMethod [[
  /**
   * #declaredat
   * @apilevel internal
   */
  public #getType Define_#(name)($ASTNode _callerNode, $ASTNode _childNode#inhParametersDeclTail) {
    $InhEqClauses
  }
]]

InhDecl.canDefineMethod [[
  protected boolean canDefine_#(name)($ASTNode _callerNode, $ASTNode _childNode#inhParametersDeclTail) {
    return true;
  }
]]

# List child equation clause.
InhEq.emitListClause [[
if (_callerNode == get#(childName)ListNoTransform()) {
  // #declaredat
  int $ChildIndexVar = _callerNode.getIndexOfChild(_childNode);
  $EvalStmt
}
]]

# Optional child equation clause.
InhEq.emitOptClause [[
if (_callerNode == get#(childName)OptNoTransform()) {
  // #declaredat
  $EvalStmt
}
]]

# Regular child equation clause.
InhEq.emitChildClause [[
$if(LegacyRewrite)
if (_callerNode == get#(childName)NoTransform()) {
$else
if (_callerNode == get#(childName)()) {
$endif
  // #declaredat
  $EvalStmt
}
]]

# getChild equation clause
InhEq.emitDefaultClause [[
$if(HasComponentEq)
{
  $include(InhEq.defaultEval)
}
$else
$include(InhEq.defaultEval)
$endif
]]

InhEq.defaultEval [[
int $ChildIndexVar = this.getIndexOfChild(_callerNode);
$EvalStmt
]]

# non-terminal child equation clause
InhEq.emitNTAClause [[
$if(IsParameterized)
if (_callerNode == $(AttrSignature)_list) {
  // #declaredat
  int $ChildIndexVar = _callerNode.getIndexOfChild(_childNode);
  $EvalStmt
}
$else
if (_callerNode == #(childName)_value) {
  // #declaredat
  $EvalStmt
}
$endif
]]

InhDecl.fallthrough [[
$if(HasComponentEq)
else {
  $include(InhDecl.tailCall)
}
$else
$include(InhDecl.tailCall)
$endif
]]

InhDecl.tailCall [[
$if(HasEqInSupertype)
return super.Define_#(name)(_callerNode, _childNode#inhParametersTail);
$else
  $if(DebugMode)
if (getParent() == null) {
  throw new RuntimeException(
      "Trying to evaluate inherited attribute #name in detached subtree (parent == null)");
}
  $endif
return getParent().Define_#(name)(this, _callerNode#inhParametersTail);
$endif
]]





© 2015 - 2024 Weber Informatics LLC | Privacy Policy