Skip to content

Commit

Permalink
Merge pull request #146 from franklinsch/equality-operator
Browse files Browse the repository at this point in the history
Implement == and != operators
  • Loading branch information
franklinsch authored Feb 27, 2018
2 parents 8497d2f + 05e2bee commit e42a8cb
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 4 deletions.
8 changes: 5 additions & 3 deletions Sources/AST/Token.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,13 @@ extension Token {
case minusEqual = "-="
case timesEqual = "*="
case divideEqual = "/="


case doubleEqual = "=="
case notEqual = "!="
case lessThanOrEqual = "<="
case greaterThanOrEqual = ">="

static var allBinaryOperators: [Punctuation] { return [.plus, .minus, .times, .divide, .equal, .plusEqual, .minusEqual, .timesEqual, .divideEqual, .dot, .closeAngledBracket, .lessThanOrEqual, .openAngledBracket, .greaterThanOrEqual] }
static var allBinaryOperators: [Punctuation] { return [.plus, .minus, .times, .divide, .equal, .plusEqual, .minusEqual, .timesEqual, .divideEqual, .dot, .closeAngledBracket, .lessThanOrEqual, .openAngledBracket, .greaterThanOrEqual, .doubleEqual, .notEqual] }
public static var allBinaryOperatorsByIncreasingPrecedence: [Punctuation] {
return allBinaryOperators.sorted { $0.precedence < $1.precedence }
}
Expand All @@ -68,7 +70,7 @@ extension Token {
var precedence: Int {
switch self {
case .equal, .plusEqual, .minusEqual, .timesEqual, .divideEqual: return 10
case .closeAngledBracket, .lessThanOrEqual, .openAngledBracket, .greaterThanOrEqual: return 15
case .closeAngledBracket, .lessThanOrEqual, .openAngledBracket, .greaterThanOrEqual, .doubleEqual, .notEqual: return 15
case .plus: return 20
case .minus: return 20
case .times: return 30
Expand Down
8 changes: 7 additions & 1 deletion Sources/IRGen/IULIAFunction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ struct IULIAFunction {
}

var scopeContext: ScopeContext {
return ScopeContext(localVariables: functionDeclaration.parametersAsVariableDeclarations)
var localVariables = functionDeclaration.parametersAsVariableDeclarations
if let capabilityBinding = capabilityBinding {
localVariables.append(VariableDeclaration(varToken: nil, identifier: capabilityBinding, type: Type(inferredType: .builtInType(.address), identifier: capabilityBinding)))
}
return ScopeContext(localVariables: localVariables)
}

var parameterCanonicalTypes: [CanonicalType] {
Expand Down Expand Up @@ -191,6 +195,8 @@ extension IULIAFunction {
case .lessThanOrEqual: return "le(\(lhs), \(rhs))"
case .openAngledBracket: return "lt(\(lhs), \(rhs))"
case .greaterThanOrEqual: return "ge(\(lhs), \(rhs))"
case .doubleEqual: return "eq(\(lhs), \(rhs))"
case .notEqual: return "iszero(eq(\(lhs), \(rhs)))"
default: fatalError()
}
}
Expand Down
2 changes: 2 additions & 0 deletions Sources/Parser/Tokenizer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ public struct Tokenizer {
"<=": .punctuation(.lessThanOrEqual),
">": .punctuation(.closeAngledBracket),
">=": .punctuation(.greaterThanOrEqual),
"==": .punctuation(.doubleEqual),
"!=": .punctuation(.notEqual),
"{": .punctuation(.openBrace),
"}": .punctuation(.closeBrace),
"[": .punctuation(.openSquareBracket),
Expand Down
16 changes: 16 additions & 0 deletions Tests/BehaviorTests/tests/string/string.flint
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,21 @@ StringContract :: (any) {
public func get() -> String {
return s
}

public func isEqual(other: String) -> Bool {
if s == other {
return true
}

return false
}

public func isNotEqual(other: String) -> Bool {
if s != other {
return true
}

return false
}
}

18 changes: 18 additions & 0 deletions Tests/BehaviorTests/tests/string/test/test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,24 @@ contract(config.contractName, function(accounts) {

assert.equal(web3.toUtf8(t.valueOf()), "hello");
});

it("should be possible to compare strings", async function() {
const instance = await Contract.deployed();

await instance.set("hello");

let t = await instance.isEqual("hello");
assert.equal(t.valueOf(), 1);

t = await instance.isEqual("hell");
assert.equal(t.valueOf(), 0);

t = await instance.isNotEqual("hello");
assert.equal(t.valueOf(), 0);

t = await instance.isNotEqual("hell");
assert.equal(t.valueOf(), 1);
});
});


0 comments on commit e42a8cb

Please sign in to comment.