mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add date/time language to solidity.
This commit is contained in:
parent
60c8709d6e
commit
5aff9fbde2
8
AST.h
8
AST.h
@ -1197,7 +1197,13 @@ public:
|
|||||||
Wei = Token::SubWei,
|
Wei = Token::SubWei,
|
||||||
Szabo = Token::SubSzabo,
|
Szabo = Token::SubSzabo,
|
||||||
Finney = Token::SubFinney,
|
Finney = Token::SubFinney,
|
||||||
Ether = Token::SubEther
|
Ether = Token::SubEther,
|
||||||
|
Second = Token::SubSecond,
|
||||||
|
Minute = Token::SubMinute,
|
||||||
|
Hour = Token::SubHour,
|
||||||
|
Day = Token::SubDay,
|
||||||
|
Week = Token::SubWeek,
|
||||||
|
Year = Token::SubYear
|
||||||
};
|
};
|
||||||
Literal(SourceLocation const& _location, Token::Value _token,
|
Literal(SourceLocation const& _location, Token::Value _token,
|
||||||
ASTPointer<ASTString> const& _value,
|
ASTPointer<ASTString> const& _value,
|
||||||
|
@ -250,6 +250,9 @@ bool ExpressionCompiler::visit(UnaryOperation const& _unaryOperation)
|
|||||||
case Token::BitNot: // ~
|
case Token::BitNot: // ~
|
||||||
m_context << eth::Instruction::NOT;
|
m_context << eth::Instruction::NOT;
|
||||||
break;
|
break;
|
||||||
|
case Token::After: // after
|
||||||
|
m_context << eth::Instruction::TIMESTAMP << eth::Instruction::ADD;
|
||||||
|
break;
|
||||||
case Token::Delete: // delete
|
case Token::Delete: // delete
|
||||||
solAssert(!!m_currentLValue, "LValue not retrieved.");
|
solAssert(!!m_currentLValue, "LValue not retrieved.");
|
||||||
m_currentLValue->setToZero(_unaryOperation.getLocation());
|
m_currentLValue->setToZero(_unaryOperation.getLocation());
|
||||||
|
@ -822,6 +822,15 @@ ASTPointer<Expression> Parser::parsePrimaryExpression()
|
|||||||
expression = nodeFactory.createNode<Literal>(token, literal, subdenomination);
|
expression = nodeFactory.createNode<Literal>(token, literal, subdenomination);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (Token::isTimeSubdenomination(m_scanner->peekNextToken()))
|
||||||
|
{
|
||||||
|
ASTPointer<ASTString> literal = getLiteralAndAdvance();
|
||||||
|
nodeFactory.markEndPosition();
|
||||||
|
Literal::SubDenomination subdenomination = static_cast<Literal::SubDenomination>(m_scanner->getCurrentToken());
|
||||||
|
m_scanner->next();
|
||||||
|
expression = nodeFactory.createNode<Literal>(token, literal, subdenomination);
|
||||||
|
break;
|
||||||
|
}
|
||||||
// fall-through
|
// fall-through
|
||||||
case Token::StringLiteral:
|
case Token::StringLiteral:
|
||||||
nodeFactory.markEndPosition();
|
nodeFactory.markEndPosition();
|
||||||
|
24
Token.h
24
Token.h
@ -162,7 +162,7 @@ namespace solidity
|
|||||||
K(New, "new", 0) \
|
K(New, "new", 0) \
|
||||||
K(Public, "public", 0) \
|
K(Public, "public", 0) \
|
||||||
K(Private, "private", 0) \
|
K(Private, "private", 0) \
|
||||||
K(Internal, "internal", 0) \
|
K(Internal, "internal", 0) \
|
||||||
K(Return, "return", 0) \
|
K(Return, "return", 0) \
|
||||||
K(Returns, "returns", 0) \
|
K(Returns, "returns", 0) \
|
||||||
K(Struct, "struct", 0) \
|
K(Struct, "struct", 0) \
|
||||||
@ -171,11 +171,18 @@ namespace solidity
|
|||||||
K(While, "while", 0) \
|
K(While, "while", 0) \
|
||||||
K(Enum, "enum", 0) \
|
K(Enum, "enum", 0) \
|
||||||
\
|
\
|
||||||
/* Ether subdenominations */ \
|
/* Ether subdenominations */ \
|
||||||
K(SubWei, "wei", 0) \
|
K(SubWei, "wei", 0) \
|
||||||
K(SubSzabo, "szabo", 0) \
|
K(SubSzabo, "szabo", 0) \
|
||||||
K(SubFinney, "finney", 0) \
|
K(SubFinney, "finney", 0) \
|
||||||
K(SubEther, "ether", 0) \
|
K(SubEther, "ether", 0) \
|
||||||
|
K(SubSecond, "seconds", 0) \
|
||||||
|
K(SubMinute, "minutes", 0) \
|
||||||
|
K(SubHour, "hours", 0) \
|
||||||
|
K(SubDay, "days", 0) \
|
||||||
|
K(SubWeek, "weeks", 0) \
|
||||||
|
K(SubYear, "years", 0) \
|
||||||
|
K(After, "after", 0) \
|
||||||
/* type keywords, keep them in this order, keep int as first keyword
|
/* type keywords, keep them in this order, keep int as first keyword
|
||||||
* the implementation in Types.cpp has to be synced to this here */\
|
* the implementation in Types.cpp has to be synced to this here */\
|
||||||
K(Int, "int", 0) \
|
K(Int, "int", 0) \
|
||||||
@ -376,12 +383,13 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool isBitOp(Value op) { return (BitOr <= op && op <= SHR) || op == BitNot; }
|
static bool isBitOp(Value op) { return (BitOr <= op && op <= SHR) || op == BitNot; }
|
||||||
static bool isUnaryOp(Value op) { return (Not <= op && op <= Delete) || op == Add || op == Sub; }
|
static bool isUnaryOp(Value op) { return (Not <= op && op <= Delete) || op == Add || op == Sub || op == After; }
|
||||||
static bool isCountOp(Value op) { return op == Inc || op == Dec; }
|
static bool isCountOp(Value op) { return op == Inc || op == Dec; }
|
||||||
static bool isShiftOp(Value op) { return (SHL <= op) && (op <= SHR); }
|
static bool isShiftOp(Value op) { return (SHL <= op) && (op <= SHR); }
|
||||||
static bool isVisibilitySpecifier(Value op) { return isVariableVisibilitySpecifier(op) || op == External; }
|
static bool isVisibilitySpecifier(Value op) { return isVariableVisibilitySpecifier(op) || op == External; }
|
||||||
static bool isVariableVisibilitySpecifier(Value op) { return op == Public || op == Private || op == Internal; }
|
static bool isVariableVisibilitySpecifier(Value op) { return op == Public || op == Private || op == Internal; }
|
||||||
static bool isEtherSubdenomination(Value op) { return op == SubWei || op == SubSzabo || op == SubFinney || op == Token::SubEther; }
|
static bool isEtherSubdenomination(Value op) { return op == SubWei || op == SubSzabo || op == SubFinney || op == SubEther; }
|
||||||
|
static bool isTimeSubdenomination(Value op) { return op == SubSecond || op == SubMinute || op == SubHour || op == SubDay || op == SubWeek || op == SubYear; }
|
||||||
|
|
||||||
// Returns a string corresponding to the JS token string
|
// Returns a string corresponding to the JS token string
|
||||||
// (.e., "<" for the token LT) or NULL if the token doesn't
|
// (.e., "<" for the token LT) or NULL if the token doesn't
|
||||||
|
19
Types.cpp
19
Types.cpp
@ -195,7 +195,8 @@ TypePointer IntegerType::unaryOperatorResult(Token::Value _operator) const
|
|||||||
return TypePointer();
|
return TypePointer();
|
||||||
// for non-hash integers, we allow +, -, ++ and --
|
// for non-hash integers, we allow +, -, ++ and --
|
||||||
else if (_operator == Token::Add || _operator == Token::Sub ||
|
else if (_operator == Token::Add || _operator == Token::Sub ||
|
||||||
_operator == Token::Inc || _operator == Token::Dec)
|
_operator == Token::Inc || _operator == Token::Dec ||
|
||||||
|
_operator == Token::After)
|
||||||
return shared_from_this();
|
return shared_from_this();
|
||||||
else
|
else
|
||||||
return TypePointer();
|
return TypePointer();
|
||||||
@ -251,6 +252,7 @@ IntegerConstantType::IntegerConstantType(Literal const& _literal)
|
|||||||
switch (_literal.getSubDenomination())
|
switch (_literal.getSubDenomination())
|
||||||
{
|
{
|
||||||
case Literal::SubDenomination::Wei:
|
case Literal::SubDenomination::Wei:
|
||||||
|
case Literal::SubDenomination::Second:
|
||||||
case Literal::SubDenomination::None:
|
case Literal::SubDenomination::None:
|
||||||
break;
|
break;
|
||||||
case Literal::SubDenomination::Szabo:
|
case Literal::SubDenomination::Szabo:
|
||||||
@ -262,6 +264,21 @@ IntegerConstantType::IntegerConstantType(Literal const& _literal)
|
|||||||
case Literal::SubDenomination::Ether:
|
case Literal::SubDenomination::Ether:
|
||||||
m_value *= bigint("1000000000000000000");
|
m_value *= bigint("1000000000000000000");
|
||||||
break;
|
break;
|
||||||
|
case Literal::SubDenomination::Minute:
|
||||||
|
m_value *= bigint("60");
|
||||||
|
break;
|
||||||
|
case Literal::SubDenomination::Hour:
|
||||||
|
m_value *= bigint("3600");
|
||||||
|
break;
|
||||||
|
case Literal::SubDenomination::Day:
|
||||||
|
m_value *= bigint("86400");
|
||||||
|
break;
|
||||||
|
case Literal::SubDenomination::Week:
|
||||||
|
m_value *= bigint("604800");
|
||||||
|
break;
|
||||||
|
case Literal::SubDenomination::Year:
|
||||||
|
m_value *= bigint("31536000");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user