refText = genGetDataSingleCallWithKey("this.$$ijData", firstKey);
if (node.isNullSafeIjDataRef()) {
nullSafetyPrefix = "(this.$$ijData == null) ? " + NULL_DATA_INSTANCE + " : ";
}
} else {
JavaExpr translation = getLocalVarTranslation(firstKey);
if (translation != null) {
// Case 2: In-scope local var.
refText = (translation.getPrecedence() == Integer.MAX_VALUE) ?
translation.getText() : "(" + translation.getText() + ")";
} else {
// Case 3: Data reference.
refText = genGetDataSingleCallWithKey("data", firstKey);
}
}
// ------ Translate the rest of the keys, if any. ------
for (ExprNode child : node.getChildren()) {
DataRefAccessNode accessNode = (DataRefAccessNode) child;
if (accessNode.isNullSafe()) {
nullSafetyPrefix +=
"(! " + genFunctionCall(UTILS_LIB + ".$$isNonnull", refText) + ") ? " +
NULL_DATA_INSTANCE + " : ";
}
switch (accessNode.getKind()) {
case DATA_REF_ACCESS_KEY_NODE:
refText = genGetDataSingleCallWithKey(
refText, ((DataRefAccessKeyNode) accessNode).getKey());
break;
case DATA_REF_ACCESS_INDEX_NODE:
refText = genGetDataSingleCallWithKey(
refText,
Integer.toString(((DataRefAccessIndexNode) accessNode).getIndex()));
break;
case DATA_REF_ACCESS_EXPR_NODE:
JavaExpr keyExpr = visit(accessNode.getChild(0));
refText = genGetDataSingleCallWithKeyExpr(refText, keyExpr);
break;
default:
throw new AssertionError();
}
}
if (nullSafetyPrefix.length() == 0) {
return new JavaExpr(refText, SoyData.class, Integer.MAX_VALUE);
} else {
return new JavaExpr(
nullSafetyPrefix + refText, SoyData.class, Operator.CONDITIONAL.getPrecedence());
}
}