Skip to content

Commit

Permalink
new: allow default values to have any kind of expression (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
KennedyTedesco committed Jan 17, 2023
1 parent 4766736 commit b4a6c45
Show file tree
Hide file tree
Showing 6 changed files with 350 additions and 156 deletions.
40 changes: 2 additions & 38 deletions src/parser/internal/definition/constant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,7 @@ pub fn constant_definition(state: &mut State) -> ParseResult<ConstantDefinition>
Ok(ConstantDefinitionEntry {
name: identifier::constant_identifier(state)?,
equals: utils::skip(state, TokenKind::Equals)?,
value: {
let expression = expression::create(state)?;

if !expression.is_constant(false) {
if expression.is_constant(true) {
crate::parser_report!(
state,
invalid_initialization_in_constant_expression(&expression)
);
} else {
crate::parser_report!(
state,
invalid_constant_expression(&expression)
);
}
}

expression
},
value: expression::create(state)?,
})
},
TokenKind::SemiColon,
Expand All @@ -61,25 +43,7 @@ pub fn classish_constant_definition(
Ok(ConstantDefinitionEntry {
name: identifier::constant_identifier(state)?,
equals: utils::skip(state, TokenKind::Equals)?,
value: {
let expression = expression::create(state)?;

if !expression.is_constant(false) {
if expression.is_constant(true) {
crate::parser_report!(
state,
invalid_initialization_in_constant_expression(&expression)
);
} else {
crate::parser_report!(
state,
invalid_constant_expression(&expression)
);
}
}

expression
},
value: expression::create(state)?,
})
},
TokenKind::SemiColon,
Expand Down
17 changes: 1 addition & 16 deletions src/parser/internal/definition/property.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,7 @@ pub fn property_definition(
PropertyEntryDefinition::Initialized {
variable,
equals: utils::skip(state, TokenKind::Equals)?,
value: {
let expression = expression::create(state)?;

if !expression.is_constant(false) {
if expression.is_constant(true) {
crate::parser_report!(
state,
invalid_initialization_in_constant_expression(&expression)
);
} else {
crate::parser_report!(state, invalid_constant_expression(&expression));
}
}

expression
},
value: expression::create(state)?,
}
} else {
PropertyEntryDefinition::Uninitialized { variable }
Expand Down
55 changes: 0 additions & 55 deletions src/parser/issue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ use crate::parser::state::State as ParserState;
use crate::tree::definition::function::ConcreteConstructorDefinition;
use crate::tree::definition::function::ConcreteMethodDefinition;
use crate::tree::definition::function::ConstructorParameterDefinition;
use crate::tree::expression::Expression;
use crate::tree::identifier::Identifier;
use crate::tree::statement::r#try::TryStatement;
use crate::tree::Node;
Expand Down Expand Up @@ -408,19 +407,6 @@ pub enum ParserIssueCode {
/// ```
UnexpectedToken = 28,

/// Invalid constant expression ( code = 29 )
///
/// Example:
///
/// ```ara
/// const FOO = function(): void { };
/// ```
///
/// Possible solution(s):
///
/// - Use a valid constant expression
InvalidConstantExpression = 29,

/// Invalid constant initialization expression ( code = 30 )
///
/// Example:
Expand All @@ -438,19 +424,6 @@ pub enum ParserIssueCode {
/// - Use a valid constant initialization expression
InvalidConstantInitializationExpression = 30,

/// Invalid constant initialization expression ( code = 31 )
///
/// Example:
///
/// ```ara
/// const FOO = new Bar();
/// ```
///
/// Possible solution(s):
///
/// - Remove the class instantiation expression(s)
InvalidInitializationInConstantExpression = 31,

/// Invalid empty type template ( code = 32 )
///
/// Example:
Expand Down Expand Up @@ -1025,18 +998,6 @@ pub(crate) fn unexpected_token<T: ToString>(
)
}

pub(crate) fn invalid_constant_expression(state: &ParserState, expression: &Expression) -> Issue {
Issue::error(
ParserIssueCode::InvalidConstantExpression,
"invalid constant expression",
)
.with_source(
state.source.name(),
expression.initial_position(),
expression.final_position(),
)
}

pub(crate) fn invalid_constant_initialization_expression(
state: &ParserState,
expression: &dyn Node,
Expand All @@ -1052,22 +1013,6 @@ pub(crate) fn invalid_constant_initialization_expression(
)
}

pub(crate) fn invalid_initialization_in_constant_expression(
state: &ParserState,
expression: &Expression,
) -> Issue {
Issue::error(
ParserIssueCode::InvalidInitializationInConstantExpression,
"invalid initialization in constant expression",
)
.with_source(
state.source.name(),
expression.initial_position(),
expression.final_position(),
)
.with_note("constant expressions cannot contain `new` expressions.")
}

pub(crate) fn expected_at_least_one_type_in_template_group(
state: &ParserState,
less_than: usize,
Expand Down
48 changes: 1 addition & 47 deletions tests/samples/0086/error.txt
Original file line number Diff line number Diff line change
@@ -1,26 +1,3 @@
error[P0031]: invalid initialization in constant expression
--> 0086/code.ara:1:13
|
1 | const FOO = new Foo();
| ^^^^^^^^^
|
= constant expressions cannot contain `new` expressions.

error[P0029]: invalid constant expression
--> 0086/code.ara:3:13
|
3 | const BAR = function(): Bar {
| /-------------^
4 | | return new Bar();
5 | | };
| \-^

error[P0029]: invalid constant expression
--> 0086/code.ara:7:13
|
7 | const BAZ = fn(): Baz => new Baz();
| ^^^^^^^^^^^^^^^^^^^^^^

error[P0030]: invalid constant initialization expression
--> 0086/code.ara:9:7
|
Expand Down Expand Up @@ -57,35 +34,12 @@ error[P0030]: invalid constant initialization expression
13 | Qux $c = new Qux(function(): void {})
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[P0031]: invalid initialization in constant expression
--> 0086/code.ara:17:17
|
17 | const FOO = new Foo();
| ^^^^^^^^^
|
= constant expressions cannot contain `new` expressions.

error[P0029]: invalid constant expression
--> 0086/code.ara:19:17
|
19 | const BAR = function(): Bar {
| /-----------------^
20 | | return new Bar();
21 | | };
| \-----^

error[P0029]: invalid constant expression
--> 0086/code.ara:23:17
|
23 | const BAZ = fn(): Baz => new Baz();
| ^^^^^^^^^^^^^^^^^^^^^^

error[P0028]: unexpected identifier, expected `;`
--> 0086/code.ara:25:22
|
25 | private mixed $a FOO = new Foo();
| ^^^

error: failed to parse "0086/code.ara" due to the above issue(s)
= summary: 13 error(s)
= summary: 7 error(s)

11 changes: 11 additions & 0 deletions tests/samples/0107/code.ara
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const ONE = new Foo();

class Foo {
CONST FOO = fn(): int => 1;

public readonly string $baz = 'baz';

public int $bar = fn(): Foo => new Foo();

public int $foo = $this->bar;
}
Loading

0 comments on commit b4a6c45

Please sign in to comment.