Skip to content

Commit 388718b

Browse files
committed
Introduce emit statement.
1 parent 8fc9535 commit 388718b

17 files changed

+252
-3
lines changed

docs/grammar.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ StateMutability = 'pure' | 'constant' | 'view' | 'payable'
6363
Block = '{' Statement* '}'
6464
Statement = IfStatement | WhileStatement | ForStatement | Block | InlineAssemblyStatement |
6565
( DoWhileStatement | PlaceholderStatement | Continue | Break | Return |
66-
Throw | SimpleStatement ) ';'
66+
Throw | EmitStatement | SimpleStatement ) ';'
6767

6868
ExpressionStatement = Expression
6969
IfStatement = 'if' '(' Expression ')' Statement ( 'else' Statement )?
@@ -77,6 +77,7 @@ Continue = 'continue'
7777
Break = 'break'
7878
Return = 'return' Expression?
7979
Throw = 'throw'
80+
EmitStatement = 'emit' FunctionCall
8081
VariableDefinition = ('var' IdentifierList | VariableDeclaration) ( '=' Expression )?
8182
IdentifierList = '(' ( Identifier? ',' )* Identifier? ')'
8283

libsolidity/analysis/TypeChecker.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,15 @@ void TypeChecker::endVisit(Return const& _return)
955955
}
956956
}
957957

958+
void TypeChecker::endVisit(EmitStatement const& _emit)
959+
{
960+
if (
961+
_emit.eventCall().annotation().kind != FunctionCallKind::FunctionCall ||
962+
dynamic_cast<FunctionType const&>(*type(_emit.eventCall().expression())).kind() != FunctionType::Kind::Event
963+
)
964+
m_errorReporter.typeError(_emit.eventCall().expression().location(), "Expression has to be an event.");
965+
}
966+
958967
bool TypeChecker::visit(VariableDeclarationStatement const& _statement)
959968
{
960969
if (!_statement.initialValue())

libsolidity/analysis/TypeChecker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ class TypeChecker: private ASTConstVisitor
9494
virtual bool visit(WhileStatement const& _whileStatement) override;
9595
virtual bool visit(ForStatement const& _forStatement) override;
9696
virtual void endVisit(Return const& _return) override;
97+
virtual void endVisit(EmitStatement const& _emit) override;
9798
virtual bool visit(VariableDeclarationStatement const& _variable) override;
9899
virtual void endVisit(ExpressionStatement const& _statement) override;
99100
virtual bool visit(Conditional const& _conditional) override;

libsolidity/ast/AST.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,27 @@ class Throw: public Statement
11961196
virtual void accept(ASTConstVisitor& _visitor) const override;
11971197
};
11981198

1199+
/**
1200+
* The emit statement is used to emit events: emit EventName(arg1, ..., argn)
1201+
*/
1202+
class EmitStatement: public Statement
1203+
{
1204+
public:
1205+
explicit EmitStatement(
1206+
SourceLocation const& _location,
1207+
ASTPointer<ASTString> const& _docString,
1208+
ASTPointer<FunctionCall> const& _functionCall
1209+
):
1210+
Statement(_location, _docString), m_eventCall(_functionCall) {}
1211+
virtual void accept(ASTVisitor& _visitor) override;
1212+
virtual void accept(ASTConstVisitor& _visitor) const override;
1213+
1214+
FunctionCall const& eventCall() const { return *m_eventCall; }
1215+
1216+
private:
1217+
ASTPointer<FunctionCall> m_eventCall;
1218+
};
1219+
11991220
/**
12001221
* Definition of a variable as a statement inside a function. It requires a type name (which can
12011222
* also be "var") but the actual assignment can be missing.

libsolidity/ast/ASTForward.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class Continue;
6969
class Break;
7070
class Return;
7171
class Throw;
72+
class EmitStatement;
7273
class VariableDeclarationStatement;
7374
class ExpressionStatement;
7475
class Expression;

libsolidity/ast/ASTJsonConverter.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,15 @@ bool ASTJsonConverter::visit(Return const& _node)
540540

541541
bool ASTJsonConverter::visit(Throw const& _node)
542542
{
543-
setJsonNode(_node, "Throw", {});;
543+
setJsonNode(_node, "Throw", {});
544+
return false;
545+
}
546+
547+
bool ASTJsonConverter::visit(EmitStatement const& _node)
548+
{
549+
setJsonNode(_node, "EmitStatement", {
550+
make_pair("eventCall", toJson(_node.eventCall()))
551+
});
544552
return false;
545553
}
546554

libsolidity/ast/ASTJsonConverter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class ASTJsonConverter: public ASTConstVisitor
9191
bool visit(Break const& _node) override;
9292
bool visit(Return const& _node) override;
9393
bool visit(Throw const& _node) override;
94+
bool visit(EmitStatement const& _node) override;
9495
bool visit(VariableDeclarationStatement const& _node) override;
9596
bool visit(ExpressionStatement const& _node) override;
9697
bool visit(Conditional const& _node) override;

libsolidity/ast/ASTPrinter.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,13 @@ bool ASTPrinter::visit(Throw const& _node)
258258
return goDeeper();
259259
}
260260

261+
bool ASTPrinter::visit(EmitStatement const& _node)
262+
{
263+
writeLine("EmitStatement");
264+
printSourcePart(_node);
265+
return goDeeper();
266+
}
267+
261268
bool ASTPrinter::visit(VariableDeclarationStatement const& _node)
262269
{
263270
writeLine("VariableDeclarationStatement");
@@ -517,6 +524,11 @@ void ASTPrinter::endVisit(Throw const&)
517524
m_indentation--;
518525
}
519526

527+
void ASTPrinter::endVisit(EmitStatement const&)
528+
{
529+
m_indentation--;
530+
}
531+
520532
void ASTPrinter::endVisit(VariableDeclarationStatement const&)
521533
{
522534
m_indentation--;

libsolidity/ast/ASTPrinter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class ASTPrinter: public ASTConstVisitor
7676
bool visit(Break const& _node) override;
7777
bool visit(Return const& _node) override;
7878
bool visit(Throw const& _node) override;
79+
bool visit(EmitStatement const& _node) override;
7980
bool visit(VariableDeclarationStatement const& _node) override;
8081
bool visit(ExpressionStatement const& _node) override;
8182
bool visit(Conditional const& _node) override;
@@ -120,6 +121,7 @@ class ASTPrinter: public ASTConstVisitor
120121
void endVisit(Break const&) override;
121122
void endVisit(Return const&) override;
122123
void endVisit(Throw const&) override;
124+
void endVisit(EmitStatement const&) override;
123125
void endVisit(VariableDeclarationStatement const&) override;
124126
void endVisit(ExpressionStatement const&) override;
125127
void endVisit(Conditional const&) override;

libsolidity/ast/ASTVisitor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class ASTVisitor
7373
virtual bool visit(Break& _node) { return visitNode(_node); }
7474
virtual bool visit(Return& _node) { return visitNode(_node); }
7575
virtual bool visit(Throw& _node) { return visitNode(_node); }
76+
virtual bool visit(EmitStatement& _node) { return visitNode(_node); }
7677
virtual bool visit(VariableDeclarationStatement& _node) { return visitNode(_node); }
7778
virtual bool visit(ExpressionStatement& _node) { return visitNode(_node); }
7879
virtual bool visit(Conditional& _node) { return visitNode(_node); }
@@ -118,6 +119,7 @@ class ASTVisitor
118119
virtual void endVisit(Break& _node) { endVisitNode(_node); }
119120
virtual void endVisit(Return& _node) { endVisitNode(_node); }
120121
virtual void endVisit(Throw& _node) { endVisitNode(_node); }
122+
virtual void endVisit(EmitStatement& _node) { endVisitNode(_node); }
121123
virtual void endVisit(VariableDeclarationStatement& _node) { endVisitNode(_node); }
122124
virtual void endVisit(ExpressionStatement& _node) { endVisitNode(_node); }
123125
virtual void endVisit(Conditional& _node) { endVisitNode(_node); }
@@ -175,6 +177,7 @@ class ASTConstVisitor
175177
virtual bool visit(Break const& _node) { return visitNode(_node); }
176178
virtual bool visit(Return const& _node) { return visitNode(_node); }
177179
virtual bool visit(Throw const& _node) { return visitNode(_node); }
180+
virtual bool visit(EmitStatement const& _node) { return visitNode(_node); }
178181
virtual bool visit(VariableDeclarationStatement const& _node) { return visitNode(_node); }
179182
virtual bool visit(ExpressionStatement const& _node) { return visitNode(_node); }
180183
virtual bool visit(Conditional const& _node) { return visitNode(_node); }
@@ -220,6 +223,7 @@ class ASTConstVisitor
220223
virtual void endVisit(Break const& _node) { endVisitNode(_node); }
221224
virtual void endVisit(Return const& _node) { endVisitNode(_node); }
222225
virtual void endVisit(Throw const& _node) { endVisitNode(_node); }
226+
virtual void endVisit(EmitStatement const& _node) { endVisitNode(_node); }
223227
virtual void endVisit(VariableDeclarationStatement const& _node) { endVisitNode(_node); }
224228
virtual void endVisit(ExpressionStatement const& _node) { endVisitNode(_node); }
225229
virtual void endVisit(Conditional const& _node) { endVisitNode(_node); }

0 commit comments

Comments
 (0)