mirror of
https://github.com/AleoHQ/leo.git
synced 2024-12-24 10:01:40 +03:00
Merge pull request #774 from AleoHQ/transparent-keywords
Transparent keywords
This commit is contained in:
commit
19e40a89a3
ast/src
parser/src/parser
@ -14,7 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
use crate::{Node, Span};
|
||||
use crate::{Identifier, Node, Span};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fmt;
|
||||
@ -22,8 +22,9 @@ use std::fmt;
|
||||
/// The `input` keyword can view program register, record, and state values.
|
||||
/// Values cannot be modified. The `input` keyword cannot be made mutable.
|
||||
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
|
||||
#[serde(transparent)]
|
||||
pub struct InputKeyword {
|
||||
pub span: Span,
|
||||
pub identifier: Identifier,
|
||||
}
|
||||
|
||||
impl fmt::Display for InputKeyword {
|
||||
@ -34,10 +35,10 @@ impl fmt::Display for InputKeyword {
|
||||
|
||||
impl Node for InputKeyword {
|
||||
fn span(&self) -> &Span {
|
||||
&self.span
|
||||
&self.identifier.span
|
||||
}
|
||||
|
||||
fn set_span(&mut self, span: Span) {
|
||||
self.span = span;
|
||||
self.identifier.span = span;
|
||||
}
|
||||
}
|
||||
|
@ -14,15 +14,16 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
use crate::{Node, Span};
|
||||
use crate::{Identifier, Node, Span};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fmt;
|
||||
|
||||
/// The `mut self` keyword can view and modify circuit values inside of a circuit function.
|
||||
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
|
||||
#[serde(transparent)]
|
||||
pub struct MutSelfKeyword {
|
||||
pub span: Span,
|
||||
pub identifier: Identifier,
|
||||
}
|
||||
|
||||
impl fmt::Display for MutSelfKeyword {
|
||||
@ -33,10 +34,10 @@ impl fmt::Display for MutSelfKeyword {
|
||||
|
||||
impl Node for MutSelfKeyword {
|
||||
fn span(&self) -> &Span {
|
||||
&self.span
|
||||
&self.identifier.span
|
||||
}
|
||||
|
||||
fn set_span(&mut self, span: Span) {
|
||||
self.span = span;
|
||||
self.identifier.span = span;
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
use crate::{Node, Span};
|
||||
use crate::{Identifier, Node, Span};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fmt;
|
||||
@ -22,8 +22,9 @@ use std::fmt;
|
||||
/// The `self` keyword can view circuit values inside of a circuit function.
|
||||
/// Circuit values cannot be modified. To modify values use the `mut self` [MutSelfKeyword].
|
||||
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
|
||||
#[serde(transparent)]
|
||||
pub struct SelfKeyword {
|
||||
pub span: Span,
|
||||
pub identifier: Identifier,
|
||||
}
|
||||
|
||||
impl fmt::Display for SelfKeyword {
|
||||
@ -34,10 +35,10 @@ impl fmt::Display for SelfKeyword {
|
||||
|
||||
impl Node for SelfKeyword {
|
||||
fn span(&self) -> &Span {
|
||||
&self.span
|
||||
&self.identifier.span
|
||||
}
|
||||
|
||||
fn set_span(&mut self, span: Span) {
|
||||
self.span = span;
|
||||
self.identifier.span = span;
|
||||
}
|
||||
}
|
||||
|
@ -96,9 +96,9 @@ impl Node for FunctionInput {
|
||||
fn span(&self) -> &Span {
|
||||
use FunctionInput::*;
|
||||
match self {
|
||||
InputKeyword(keyword) => &keyword.span,
|
||||
SelfKeyword(keyword) => &keyword.span,
|
||||
MutSelfKeyword(keyword) => &keyword.span,
|
||||
InputKeyword(keyword) => &keyword.identifier.span,
|
||||
SelfKeyword(keyword) => &keyword.identifier.span,
|
||||
MutSelfKeyword(keyword) => &keyword.identifier.span,
|
||||
Variable(variable) => &variable.span,
|
||||
}
|
||||
}
|
||||
@ -106,9 +106,9 @@ impl Node for FunctionInput {
|
||||
fn set_span(&mut self, span: Span) {
|
||||
use FunctionInput::*;
|
||||
match self {
|
||||
InputKeyword(keyword) => keyword.span = span,
|
||||
SelfKeyword(keyword) => keyword.span = span,
|
||||
MutSelfKeyword(keyword) => keyword.span = span,
|
||||
InputKeyword(keyword) => keyword.identifier.span = span,
|
||||
SelfKeyword(keyword) => keyword.identifier.span = span,
|
||||
MutSelfKeyword(keyword) => keyword.identifier.span = span,
|
||||
Variable(variable) => variable.span = span,
|
||||
}
|
||||
}
|
||||
|
@ -507,7 +507,7 @@ impl ParserContext {
|
||||
/// Returns an [`Expression`] AST node if the next tokens represent an
|
||||
/// circuit initialization expression.
|
||||
///
|
||||
pub fn parse_circuit_init(&mut self, ident: Identifier) -> SyntaxResult<Expression> {
|
||||
pub fn parse_circuit_init(&mut self, identifier: Identifier) -> SyntaxResult<Expression> {
|
||||
self.expect(Token::LeftCurly)?;
|
||||
let mut members = vec![];
|
||||
let end_span;
|
||||
@ -535,8 +535,8 @@ impl ParserContext {
|
||||
}
|
||||
}
|
||||
Ok(Expression::CircuitInit(CircuitInitExpression {
|
||||
span: &ident.span + &end_span,
|
||||
name: ident,
|
||||
span: &identifier.span + &end_span,
|
||||
name: identifier,
|
||||
members,
|
||||
}))
|
||||
}
|
||||
|
@ -309,11 +309,16 @@ impl ParserContext {
|
||||
///
|
||||
pub fn parse_function_input(&mut self) -> SyntaxResult<FunctionInput> {
|
||||
if let Some(token) = self.eat(Token::Input) {
|
||||
return Ok(FunctionInput::InputKeyword(InputKeyword { span: token.span }));
|
||||
return Ok(FunctionInput::InputKeyword(InputKeyword {
|
||||
identifier: Identifier {
|
||||
name: token.token.to_string(),
|
||||
span: token.span,
|
||||
},
|
||||
}));
|
||||
}
|
||||
let const_ = self.eat(Token::Const);
|
||||
let mutable = self.eat(Token::Mut);
|
||||
let name = if let Some(token) = self.eat(Token::LittleSelf) {
|
||||
let mut name = if let Some(token) = self.eat(Token::LittleSelf) {
|
||||
Identifier {
|
||||
name: token.token.to_string(),
|
||||
span: token.span,
|
||||
@ -326,11 +331,11 @@ impl ParserContext {
|
||||
//error
|
||||
}
|
||||
if let Some(mutable) = &mutable {
|
||||
return Ok(FunctionInput::MutSelfKeyword(MutSelfKeyword {
|
||||
span: &mutable.span + &name.span,
|
||||
}));
|
||||
name.span = &mutable.span + &name.span;
|
||||
name.name = "mut self".to_string();
|
||||
return Ok(FunctionInput::MutSelfKeyword(MutSelfKeyword { identifier: name }));
|
||||
}
|
||||
return Ok(FunctionInput::SelfKeyword(SelfKeyword { span: name.span }));
|
||||
return Ok(FunctionInput::SelfKeyword(SelfKeyword { identifier: name }));
|
||||
}
|
||||
self.expect(Token::Colon)?;
|
||||
let type_ = self.parse_type()?.0;
|
||||
|
Loading…
Reference in New Issue
Block a user