blob: 658a890390d4dff8936401f9146aa5b663213522 [file] [log] [blame]
@cached
operation EOL() {
return '\n';
}
//For testing purposes
operation getThriftFileName() : String {
return "EpsilonThriftTest";
}
operation getDate() : String {
return new Native("java.text.SimpleDateFormat")("yyyy-MM-dd").format(new Native("java.util.Date"));
}
operation incrementAndGet() : Integer {
return Document.allInstances().first().~internalCounter++;
}
operation String iterNum() : String {
return self+incrementAndGet();
}
operation getOutputDir(packageName : String) {
return "output/"+packageName.replace("\\.", '/')+'/';
}
operation makeStruct(fields : Collection, identifier : String, isResult : Boolean, isException : Boolean) : Struct {
var structure : new Struct;
structure.fields.addAll(fields);
structure.identifier = identifier;
structure.isException = isException;
structure.~accessorName = identifier.firstToUpperCase();
structure.~capsIdentifier = identifier.camelToUnderscore();
structure.~isInner = true;
structure.~isResult = isResult;
return structure;
}
operation Function structifyArgs() : Struct {
return makeStruct(self.args, self.identifier+"_args", false, false);
}
operation Function structifyResult() : Struct {
var fields = OrderedSet{};
if (self.funcType.fieldType.isDefined()) {
var resultField : Field = new Field;
resultField.identifier = "success";
resultField.fieldType = self.funcType.fieldType;
fields.add(resultField);
}
fields.addAll(self.exceptions);
return makeStruct(fields, self.identifier+"_result", true, false);
}
operation assignFieldIDs(fvals : Collection) {
if (fvals.size() <= 0) return;
for (i : Integer in Sequence{0..fvals.size()-1}) {
if (not fvals.at(i).hasFID) {
var numval : Integer = fvals.at(i).fieldID;
if (i == 0)
numval = 0;
else
numval = fvals.at(i-1).fieldID+1;
fvals.at(i).fieldID = numval;
}
}
}
operation doSetup() {
Document.allInstances().first().~internalCounter = -1;
attachProperties();
}
operation attachProperties() {
attachCapsIdentifierProperty(Field.allInstances());
attachAccessorNameProperty(Field.allInstances());
assignFieldIDs(Field.allInstances());
assignFieldIDs(EnumPair.allInstances());
attachAliases(FieldType.allInstances(), Typedef.allInstances());
attachAccessorNameProperty(EnumPair.allInstances());
attachAccessorNameProperty(Function.allInstances());
attachAccessorNameProperty(Struct.allInstances());
attachCapsIdentifierProperty(Struct.allInstances());
attachAccessorNameProperty(Union.allInstances());
attachCapsIdentifierProperty(Union.allInstances());
attachAccessorNameProperty(Enum.allInstances());
attachCapsIdentifierProperty(Enum.allInstances());
}
operation attachAliases(fieldTypes : Collection, typedefs : Collection) {
for (fieldType in fieldTypes.select(ft | ft.identifier.isDefined() and ft.identifier.length() > 0)) {
var tdProp : Typedef = typedefs.selectOne(td | td.identifier.isDefined() and fieldType.identifier.matches(td.identifier));
if (tdProp.isDefined()) {
fieldType.~typedef = tdProp.identifier;
fieldType.~trueType = tdProp.aliasFor;
}
}
}
operation attachAccessorNameProperty(fcol) {
for (field in fcol) {
field.~accessorName = field.identifier.firstToUpperCase();
}
}
operation attachCapsIdentifierProperty(fcol) {
for (field in fcol) {
field.~capsIdentifier = field.identifier.camelToUnderscore();
}
}
operation Any getRawComment() : String {
if (self.comment.isDefined())
return self.comment.getCommentContents();
return "";
}
operation String removeSurroundingQuotes() : String {
return self.substring(1, self.length()-1);
}
operation String getCommentContents() : String {
return self
.replaceAll("/"+"\\*", "")
.replaceAll("\\*"+'/', "");
}
operation String makeComment(start, prefix, end, padding) : String {
return self.makeComment(padding+start, padding+prefix, padding+end);
}
operation String makeComment(start, prefix, end) : String {
var comment : String = "";
var hasPrefix = prefix.isDefined() and prefix.length() > 0;
var lines = self.split(EOL());
if (start.isDefined() and start.length() > 0) {
comment += start;
}
for (line : String in lines) {
if (hasPrefix) {
comment += prefix;
}
if (line.length() > 0) {
comment += line;
}
comment += EOL();
}
if (end.isDefined() and end.length() > 0) {
comment += end;
}
return comment;
}
operation String escapedString() : String {
return self.replaceAll("\"", "\\"+'"');
}
@cached
operation String makeValidName() : String {
var vName : String = self;
if (vName.isDefined() and vName.length() > 0) {
if (vName.startsWith("[0-9]")) {
jName = "_"+vName;
}
vName.replaceAll("[^a-zA-Z0-9]+", "_");
}
return vName;
}
@cached
operation String camelToUnderscore() : String {
return self.firstToUpperCase().split("(?=[A-Z])").concat("_").toUpperCase();
}
operation String changeIf(condition : Boolean, nval : String) {
if (condition)
return nval;
return self;
}
operation String contains(other) : Boolean {
return other.isSubstringOf(self);
}
operation Sequence replace(index : Integer, with) : Sequence {
var what = self.at(index);
var newSeq = Sequence{};
if (index < 0 or index >= self.size())
return self.clone();
else if (index == 0) {
newSeq.add(with);
newSeq.addAll(self.excluding(what));
}
else if (index == self.size()-1) {
newSeq.addAll(self.excluding(what));
newSeq.add(with);
}
else {
var leftSeq = Sequence{};
var rightSeq = Sequence{};
for (i : Integer in Sequence{0..index-1}) {
leftSeq.add(self.at(i));
}
for (i : Integer in Sequence{index+1..self.size()-1}) {
rightSeq.add(self.at(i));
}
newSeq.addAll(leftSeq);
newSeq.add(with);
newSeq.addAll(rightSeq);
}
return newSeq;
}
operation Boolean ternary(rIfTrue, rIfFalse) {
if (self == true) return rIfTrue;
return rIfFalse;
}
operation Any printlnIf(condition : Boolean) {
if (condition) out.println(self);
}
operation Any printIf(condition : Boolean) {
if (condition) out.print(self);
}
operation printIfDefined(str : String) {
printIfDefined(str, "");
}
operation printIfDefined(str : String, padding : String) {
if (str.isDefined() and str.length() > 0) {
out.print(padding+str.replace(EOL(), EOL()+padding));
}
}
operation getNamespaceFor(language : String) : String {
var ns : Namespace = Namespace.allInstances().selectOne(ns | ns.scope.literal == language);
if (ns.isDefined())
return ns.identifier;
return "";
}
@cached
operation String getConst() : Const {
return Const.allInstances().selectOne(ct | ct.identifier == self);
}
@cached
operation String getTypedef() : Typedef {
return Typedef.allInstances().selectOne(td | td.identifier == self);
}
operation String getStruct() : Struct {
return Struct.allInstances().selectOne(st | st.identifier == self);
}
@cached
operation IntConst getValue() : Integer {
return self.negative.ternary(self.value*-1, self.value);
}
@cached
operation DoubleConst getValue() : Real {
var significant : Integer = self.significant.getValue();
var numberOfPlaces : Integer = self.fractional.asString().length();
var fractional : Real = self.fractional/((10.0).pow(numberOfPlaces));
var multiplier = 1;
if (self.exponent.isDefined()) {
multiplier = (10.0).pow(self.exponent.getValue());
}
var doubleValue : Real = significant+fractional;
return doubleValue * multiplier;
}
@cached
operation Service hasSuper() : Boolean {
return self.supers.isDefined() and self.supers.length() > 0;
}
@cached
operation Function includeReturn() : String {
if (self.isVoid())
return "";
return "return ";
}
operation Function getType() : String {
if (self.isVoid()) return "void";
return self.funcType.fieldType.thriftType();
}
@cached
operation Function isVoid() : Boolean {
return self.funcType.void.isDefined() and self.funcType.void;// and self.funcType.fieldType.isUndefined();
}
@cached
operation Field isDefault() : Boolean {
return not self.fieldReq.isDefined() or self.fieldReq.literal.toLowerCase() == "default";
}
@cached
operation Field getRequirement() : String {
if (self.fieldReq.isDefined()) {
return self.fieldReq.literal.toUpperCase();
}
return "DEFAULT";
}
@cached
operation Field isRequired() : Boolean {
return self.fieldReq.isDefined() and self.fieldReq.literal == "required";
}
@cached
operation Field isOptional() : Boolean {
return self.fieldReq.isDefined() and self.fieldReq.literal == "optional";
}
@cached
operation ConstList isUnique() : Boolean {
var listVals = self.constVals;
return listVals.forAll(cv1 | listVals.one(cv2 | cv1.equals(cv2)));
}
@cached
operation ConstValue getValue() : String {
if (self.identifier.isDefined()) {
var constant : Const = self.identifier.getConst();
if (constant.isDefined()) {
return constant.constVal.getValue();
}
return self.identifier;
}
if (self.isMap()) {
var mapVals : String = "{";
for (kvp in self.map.pairs) {
var key : String = kvp.key.getValue();
var value : String = kvp.value.getValue();
mapVals += key+':'+value+", ";
}
if (mapVals.endsWith(", "))
mapVals = mapVals.substring(0, mapVals.length()-3);
return mapVals+'}';
}
if (self.isList()) {
var listVals : String = "[";
for (cv in self.list.constVals) {
listVals += cv.getValue()+", ";
}
if (listVals.endsWith(", "))
listVals = listVals.substring(0, listVals.length()-2);
return listVals+']';
}
if (self.isDouble()) {
if (self.double.isDefined()) {
return self.double.getValue().asString();
}
return self.integer.getValue().asString();
}
if (self.isInteger()) {
return self.integer.getValue().asString();
}
if (self.isString()) {
return self.literal.removeSurroundingQuotes();
}
if (self.isBool()) {
return self.bool.literal;
}
}
operation ConstValue equals(other : ConstValue) : Boolean {
if (self.isMap() and other.isMap()) {
return self.map.pairs.forAll(kvp1 | other.map.pairs.forAll(kvp2 |
kvp1.key.equals(kvp2.key) and kvp1.value.equals(kvp2.value)));
}
if (self.isList() and other.isList()) {
return self.list.forAll(cv1 | other.list.forAll(cv2 | cv1.equals(cv2)));
}
if (self.isDouble() and other.isDouble()) {
return self.double.getValue() == other.double.getValue();
}
if (self.isInteger() and other.isInteger()) {
return self.integer.getValue() == other.integer.getValue();
}
if (self.isString() and other.isString()) {
return self.literal == other.literal;
}
if (self.isBool() and other.isBool()) {
return self.bool.literal == other.bool.literal;
}
return self.identifier == other.identifier;
}
operation ConstValue isOfType(expected : String) : Boolean {
var trueType : String = self.getTrueType();
var ctype : String = expected.getTrueType();
if (self.isMap()) {
if (ctype.startsWith("map<")) {
var key : String = ctype.getMapKey();
var value : String = ctype.getMapValue();
return self.map.pairs.forAll(kvp |
kvp.key.isOfType(key) and kvp.value.isOfType(value));
}
var struct = ctype.getStruct();
if (struct.isDefined()) {
var structFields = struct.fields;
if (self.map.isDefined()) {
var kvps = self.map.pairs;
for (pair in kvps) {
var key = pair.key;
if (not key.isString()) {
return false;
}
var keyVal : String = key.getValue();
var matchingField = structFields.selectOne(fd | keyVal.matches(fd.identifier));
if (matchingField.isUndefined()) {
return false;
}
return pair.value.isOfType(matchingField.thriftType().getTrueType());
}
}
else return struct.fields.forAll(field |
('"'+field.identifier+'"').isSubstringOf(trueType));
}
}
else if (ctype.startsWith("list<") or ctype.startsWith("set<")) {
if (self.isList()) {
var inner : String = ctype.getInnerType();
//TODO: if (self.isSet())
return self.list.constVals.forAll(cv | cv.isOfType(inner));
}
var constant : Const = self.identifier.getConst();
if (constant.isDefined()) {
return constant.constVal.isOfType(ctype);
}
return false;
}
else {
var isInt : Boolean = self.isInteger();
var intVal;
if (isInt) intVal = self.getValue().asInteger();
switch (ctype) {
case "double": return self.isDouble() or isInt;
case "string": return self.isString();
case "integer": continue;
case "i64": return isInt;
case "i32": return isInt and intVal < 2147483647;
case "i16": return isInt and intVal < 65535;
case "i8": continue;
case "byte": return isInt and intVal < 127;
case "bool": return self.isBool() or (isInt and intVal <= 1);
default: trueType.matches(ctype);
}
}
return false;
}
@cached
operation ConstValue deduceType() : String {
if (self.isMap()) {
if (self.map.pairs.isDefined() and self.map.pairs.size() > 0) {
var pair = self.map.pairs.first();
return "map<"+pair.key.deduceType()+
','+pair.value.deduceType()+'>';
}
return "map";
}
else if (self.isList()) {
if (self.list.constVals.isDefined() and self.list.constVals.size() > 0) {
return "list<"+self.list.constVals.first().deduceType()+'>';
}
return "list";
}
else if (self.isString()) {
return "string";
}
else if (self.isDouble()) {
return "double";
}
else if (self.isInteger()) {
if (self.integer.value <= 1)
return "bool";
else if (self.integer.value < 127)
return "byte";
else if (self.integer.value < 65535)
return "i16";
else if (self.integer.value < 2147483647)
return "i32";
else
return "i64";
}
else if (self.isBool()) {
return self.bool.literal;
}
else {
return self.identifier.getTrueType();
}
}
@cached
operation String getTrueType() : String {
var typedef = self.getTypedef();
if (typedef.isDefined()) {
return typedef.aliasFor.thriftType();
}
var constant = self.getConst();
if (constant.isDefined()) {
return constant.thriftType();
}
return self;
}
@cached
operation ConstValue getTrueType() : String {
if (self.identifier.isDefined() and self.identifier.length() > 0)
return self.identifier.getTrueType();
return "";
}
operation ConstValue getMappings() {
if (self.map.isDefined()) {
return self.map.pairs;
}
else if (self.identifier.isDefined() and self.identifier.length() > 0) {
return self.identifier.getConst().constVal.map.pairs;
}
}
operation ConstValue getListings() {
if (self.list.isDefined()) {
return self.list.constVals;
}
else if (self.identifier.isDefined() and self.identifier.length() > 0) {
return self.identifier.getConst().constVal.list.constVals;
}
}
@cached
operation Const thriftType() : String {
return self.fieldType.thriftType();
}
operation makeStringFieldType() : FieldType {
var stringFT: new FieldType;
var dType : new DefinitionType;
dType.base = BaseType#string;
stringFT.defType = dType;
return stringFT;
}
operation DefinitionType thriftType() : String {
if (self.~thriftType.isUndefined()) {
var container = self.container;
var base = self.base;
if (container.isDefined()) {
self.~thriftType = container.keyword+'<';
if (container.keyword == "map") {
self.~thriftType += container.keyType.thriftType()+','+container.valType.thriftType()+'>';
}
else {
self.~thriftType += container.fieldType.thriftType()+'>';
}
}
else {
self.~thriftType = base.literal;
}
}
return self.~thriftType;
}
@cached
operation Field thriftType() : String {
return self.fieldType.thriftType();
}
operation FieldType thriftType() : String {
if (self.~thriftType.isUndefined()) {
if (self.~trueType.isDefined()) {
self.~thriftType = self.~trueType.thriftType();
}
else if (self.defType.isDefined()) {
self.~thriftType = self.defType.thriftType();
}
else if (self.typedef.isDefined()) {
self.~thriftType = self.typedef.aliasFor.thriftType();
}
else {
self.~thriftType = self.identifier.getTrueType();
}
}
return self.~thriftType;
}
@cached
operation Field getTypeName() : String {
return self.fieldType.getTypeName();
}
operation FieldType getTypeName() : String {
if (self.~capitalType.isUndefined()) {
if (self.isEnum()) {
self.~capitalType = "ENUM";
}
else if (self.isStruct() or self.isException()) {
self.~capitalType = "STRUCT";
}
else if (self.isBinary()) {
self.~capitalType = "STRING";
}
else {
self.~capitalType = self.thriftType().toUpperCase();
if ("<".isSubstringOf(self.~capitalType)) {
self.~capitalType = self.~capitalType.split("<").at(0);
}
}
}
return self.~capitalType;
}
@cached
operation FieldType getStruct() {
if (self.identifier.isDefined()) {
self.~structure = Struct.allInstances()
.reject(structure | structure.isException)
.selectOne(structure | self.identifier == structure.identifier);
}
return self.~structure;
}
operation FieldType getException() {
if (self.identifier.isDefined()) {
self.~exception = Struct.allInstances()
.select(structure | structure.isException)
.selectOne(structure | self.identifier == structure.identifier);
}
return self.~exception;
}
@cached
operation FieldType getEnum() {
if (self.identifier.isDefined()) {
self.~enumeration = Enum.allInstances().selectOne(enumeration | self.identifier == enumeration.identifier);
}
return self.~enumeration;
}
@cached
operation FieldType getTypedef() {
return self.~typedef;
}
operation Field hasNesting() : Boolean {
return self.fieldType.hasNesting();
}
operation Field getNestingSequence() : Sequence {
return self.fieldType.getNestingSequence();
}
operation Field containsType(ttype : String) : Boolean {
return self.fieldType.containsType(ttype);
}
operation FieldType containsType(ttype : String) : Boolean {
return self.thriftType().containsType(ttype);
}
operation FieldType hasNesting() : Boolean {
return self.thriftType().hasNesting();
}
operation FieldType getNestingSequence() : Boolean {
return self.thriftType().getNestingSequence();
}
operation String hasNesting() : Boolean {
return self.hasNesting(1);
}
operation String hasNesting(level : Integer) : Boolean {
return self.getNestingLevel() >= level;
}
@cached
operation String getNestingSequence() : Sequence {
var nestSeq : Sequence = self.split("<");
if (nestSeq.isDefined() and nestSeq.size() > 0) {
nestSeq = nestSeq.replace(nestSeq.size()-1, nestSeq.last().replace(">", ""));
}
return nestSeq;
}
@cached
operation String typeErasure() : String {
return self.split("<").first();
}
operation FieldType containsType(ttype : String) : Boolean {
return self.thriftType().contains(ttype.toLowerCase());
}
@cached
operation FieldType nestedTypeIsBase() : Boolean {
if (self.isContainer()) {
var container = self.defType.container;
if (self.isMap())
return container.keyType.isBase() and container.valType.isBase();
else
return container.fieldType.isBase();
}
return self.isBase();
}
@cached
operation FieldType getMapKey() : FieldType {
if (self.isMap()) {
return self.defType.container.keyType;
}
return self;
}
@cached
operation FieldType getMapValue() : FieldType {
if (self.isMap()) {
return self.defType.container.valType;
}
return self;
}
@cached
operation FieldType getInnerType() : FieldType {
if (self.isList() or self.isSet()) {
return self.defType.container.fieldType;
}
return self;
}
@cached
operation String getNestingLevel() : Integer {
return self.split("<").size()-1;
}
@cached
operation String getInnerType() : String {
var parts : Sequence = self.split("<");
if (parts.size() > 1) {
parts.removeAt(0);
var inner : String = parts.concat("<");
if (inner.endsWith(">")) {
inner = inner.substring(0, inner.length()-1);
if (not inner.contains("<")) {
inner = inner.split(">").first();
}
}
return inner;
}
return self;
}
operation String spaceBetweenMap() : String {
return self.replace(",", ", ");
}
@cached
operation String getMapKey() : String {
var brackets = self.split("(?=<)");
if (brackets.size() <= 1 and not ",".isSubstringOf(brackets.second())) {
return self.split(",").first();
}
var key : String = brackets.removeAt(1).substring(1);
brackets.removeAt(0);
key += brackets.concat();
if (">,".isSubstringOf(key)){
return key.split(">,").first()+'>';
}
else {
return key.split(",").first();
}
}
@cached
operation String getMapValue() : String {
var value : String = self.substring(0, self.length()-1);
if (">,".isSubstringOf(value)) {
return value.split(">,").last();
}
else {
var commas = value.split(",");
if (commas.size() > 2) {
commas.removeAt(0);
return commas.concat(",");
}
else {
return commas.last();
}
}
}
@cached
operation ConstValue isSet() : Boolean {
if (self.isList()) {
return self.list.isUnique();
}
return false;
}
@cached
operation ConstValue isList() : Boolean {
return self.list.isDefined() or self.getTrueType().startsWith("list<");
}
@cached
operation ConstValue isMap() : Boolean {
return self.map.isDefined() or self.getTrueType().startsWith("map<");
}
@cached
operation ConstValue isDouble() : Boolean {
return self.double.isDefined() or self.getTrueType().matches("double");
}
@cached
operation ConstValue isInteger() : Boolean {
var trueType : String = self.getTrueType();
return self.integer.isDefined() or
(trueType.length() > 0 and (
trueType.matches("i32")) or
trueType.matches("i64") or
trueType.matches("i8") or
trueType.matches("byte") or
trueType.matches("i16"));
}
@cached
operation ConstValue isBool() : Boolean {
return (self.bool.isDefined() and
not self.bool.literal.toUpperCase().matches("DEFAULT")) or
self.getTrueType().matches("bool");
}
@cached
operation ConstValue isString() : Boolean {
return (self.literal.isDefined() and self.literal.length() > 0) or
self.getTrueType().matches("string");
}
@cached
operation ConstValue isCustom() : Boolean {
return self.identifier.isDefined() and self.identifier.length() > 0;
}
@cached
operation Field isTypedef() : Boolean {
return self.fieldType.isTypedef();
}
@cached
operation Field isEnum() : Boolean {
return self.fieldType.isEnum();
}
@cached
operation Field isStruct() : Boolean {
return self.fieldType.isStruct();
}
@cached
operation Field isException() : Boolean {
return self.fieldType.isException();
}
@cached
operation Field isContainer() : Boolean {
return self.fieldType.isContainer();
}
@cached
operation Field isBase() : Boolean {
return self.fieldType.isBase();
}
@cached
operation String isContainerType() : Boolean {
return
self.isType("map", false) or
self.isType("list", false) or
self.isType("set", false);
}
@cached
operation String isBaseType() : Boolean {
return
self.isType("bool") or
self.isType("byte") or
self.isType("i16") or
self.isType("i32") or
self.isType("i64") or
self.isType("double") or
self.isType("string") or
self.isType("i8") or
self.isType("slist");
}
@cached
operation FieldType isThriftType() : Boolean {
return
self.isContainer() or
self.isBase() or
self.isEnum() or
self.isStruct() or
self.isException();
}
@cached
operation FieldType isTypedef() : Boolean {
return self.getTypedef().isDefined();
}
operation FieldType isEnum() : Boolean {
return self.getEnum().isDefined();
}
operation FieldType isStruct() : Boolean {
return self.getStruct().isDefined();
}
operation FieldType isException() : Boolean {
return self.getException().isDefined();
}
@cached
operation FieldType isContainer() : Boolean {
return "<".isSubstringOf(self.thriftType());
}
@cached
operation FieldType isBase() : Boolean {
return
self.isString() or
self.isBool() or
self.isI32() or
self.isDouble() or
self.isI64() or
self.isByte() or
self.isI16() or
self.isBinary() or
self.isI8();
}
operation Field isType(type : String) : Boolean {
return self.fieldType.isType(type);
}
operation FieldType isType(type : String) : Boolean {
return self.isType(type, true);
}
operation FieldType isType(type : String, matchWhole : Boolean) : Boolean {
return self.thriftType().isType(type, matchWhole);
}
operation String isType(type : String) : Boolean {
return self.isType(type, true);
}
operation String isType(type : String, matchWhole : Boolean) : Boolean {
if (matchWhole)
return self.matches(type.toLowerCase());
else
return self.startsWith(type.toLowerCase());
}
@cached
operation FieldType isMap() : Boolean {
return self.isType("map", false) or (self.~typedef.isDefined() and self.~typedef.startsWith("map"));
}
@cached
operation FieldType isList() : Boolean {
return self.isType("list", false) or (self.~typedef.isDefined() and self.~typedef.startsWith("list"));
}
@cached
operation FieldType isSet() : Boolean {
return self.isType("set", false) or (self.~typedef.isDefined() and self.~typedef.startsWith("set"));
}
@cached
operation FieldType isBool() : Boolean {
return self.isType("bool") or self.~typedef == "bool";
}
@cached
operation FieldType isByte() : Boolean {
return self.isType("byte") or self.~typedef == "byte";
}
@cached
operation FieldType isI8() : Boolean {
return self.isType("i8") or self.~typedef == "i8";
}
@cached
operation FieldType isI16() : Boolean {
return self.isType("i16") or self.~typedef == "i16";
}
@cached
operation FieldType isI32() : Boolean {
return self.isType("i32") or self.~typedef == "i32";
}
@cached
operation FieldType isI64() : Boolean {
return self.isType("i64") or self.~typedef == "i64";
}
@cached
operation FieldType isDouble() : Boolean {
return self.isType("double") or self.~typedef == "double";
}
@cached
operation FieldType isString() : Boolean {
return self.isType("string") or self.~typedef == "string";
}
@cached
operation FieldType isBinary() : Boolean {
return self.isType("binary") or self.~typedef == "binary";
}