Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: merge all method definitions into one #42

Merged
merged 1 commit into from
Jan 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions bin/snapshot.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use std::env;
use std::fs::read_dir;
use std::io;
use std::ops::Deref;
use std::path::PathBuf;

use ara_parser::parser;
Expand Down Expand Up @@ -56,7 +55,7 @@ fn main() -> io::Result<()> {
.with_colors(ColorChoice::Never);

let error = builder
.as_string(report.deref())
.as_string(report.as_ref())
.expect("failed to build the report");

std::fs::write(error_filename, error)?;
Expand Down
3 changes: 1 addition & 2 deletions examples/linter.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use std::env;
use std::ops::Deref;

use ara_parser::parser;
use ara_parser::traverser::visitor::NodeVisitor;
Expand Down Expand Up @@ -75,7 +74,7 @@ fn main() -> Result<(), Error> {
ReportBuilder::new(&source_map)
.with_charset(CharSet::Unicode)
.with_colors(ColorChoice::Always)
.print(report.deref())?;
.print(report.as_ref())?;
}
}

Expand Down
3 changes: 1 addition & 2 deletions examples/parser.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use std::env;
use std::ops::Deref;

use ara_parser::parser;
use ara_reporting::builder::CharSet;
Expand All @@ -21,7 +20,7 @@ fn main() -> Result<(), Error> {
ReportBuilder::new(&source_map)
.with_charset(CharSet::Unicode)
.with_colors(ColorChoice::Always)
.print(report.deref())?;
.print(report.as_ref())?;
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/lexer/byte_string.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;

use std::ops::Deref;
use std::ops::DerefMut;
use std::str::from_utf8;

use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;

/// A wrapper for Vec<u8> that provides a human-readable Debug impl and
/// a few other conveniences.
///
Expand Down
25 changes: 1 addition & 24 deletions src/parser/internal/definition/attribute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ use crate::parser::result::ParseResult;
use crate::parser::state::State;
use crate::tree::definition::attribute::AttributeDefinition;
use crate::tree::definition::attribute::AttributeGroupDefinition;
use crate::tree::expression::argument::ArgumentExpression;

pub fn gather(state: &mut State) -> ParseResult<bool> {
if state.iterator.current().kind != TokenKind::Attribute {
Expand All @@ -21,29 +20,7 @@ pub fn gather(state: &mut State) -> ParseResult<bool> {
Ok(AttributeDefinition {
name: identifier::fully_qualified_type_identifier_including_self(state)?,
arguments: if state.iterator.current().kind == TokenKind::LeftParen {
let arguments = argument::argument_list_expression(state)?;

for argument in &arguments.arguments.inner {
match argument {
ArgumentExpression::Value { value, .. }
| ArgumentExpression::Named { value, .. } => {
if !value.is_constant(true) {
crate::parser_report!(
state,
invalid_constant_initialization_expression(value)
);
}
}
expression => {
crate::parser_report!(
state,
invalid_constant_initialization_expression(expression)
);
}
}
}

Some(arguments)
Some(argument::argument_list_expression(state)?)
} else {
None
},
Expand Down
21 changes: 2 additions & 19 deletions src/parser/internal/definition/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use crate::lexer::token::TokenKind;
use crate::parser::internal::definition::attribute;
use crate::parser::internal::definition::constant::classish_constant_definition;
use crate::parser::internal::definition::function::method_definition;
use crate::parser::internal::definition::function::MethodDefinitionReference;
use crate::parser::internal::definition::function::MethodDefinitionType;
use crate::parser::internal::definition::modifier;
use crate::parser::internal::definition::property;
use crate::parser::internal::definition::template;
Expand Down Expand Up @@ -83,7 +81,7 @@ pub fn class_definition(state: &mut State) -> ParseResult<ClassDefinition> {
})
}

fn class_definition_member(state: &mut State) -> ParseResult<ClassDefinitionMember> {
pub fn class_definition_member(state: &mut State) -> ParseResult<ClassDefinitionMember> {
attribute::gather(state)?;

let modifiers = modifier::collect(state)?;
Expand All @@ -93,22 +91,7 @@ fn class_definition_member(state: &mut State) -> ParseResult<ClassDefinitionMemb
}

if state.iterator.current().kind == TokenKind::Function {
let method = method_definition(state, MethodDefinitionType::Either, modifiers)?;

return match method {
MethodDefinitionReference::Abstract(method) => {
Ok(ClassDefinitionMember::AbstractMethod(method))
}
MethodDefinitionReference::Concrete(method) => {
Ok(ClassDefinitionMember::ConcreteMethod(method))
}
MethodDefinitionReference::AbstractConstructor(ctor) => {
Ok(ClassDefinitionMember::AbstractConstructor(ctor))
}
MethodDefinitionReference::ConcreteConstructor(ctor) => {
Ok(ClassDefinitionMember::ConcreteConstructor(ctor))
}
};
return method_definition(state, modifiers).map(ClassDefinitionMember::Method);
}

property::property_definition(state, modifiers).map(ClassDefinitionMember::Property)
Expand Down
49 changes: 6 additions & 43 deletions src/parser/internal/definition/enum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,12 @@ use crate::lexer::token::TokenKind;
use crate::parser::internal::definition::attribute;
use crate::parser::internal::definition::constant;
use crate::parser::internal::definition::function;
use crate::parser::internal::definition::function::MethodDefinitionReference;
use crate::parser::internal::definition::modifier;
use crate::parser::internal::expression;
use crate::parser::internal::identifier;
use crate::parser::internal::utils;
use crate::parser::result::ParseResult;
use crate::parser::state::State;
use crate::tree::definition::function::ConcreteMethodDefinition;
use crate::tree::definition::modifier::ModifierGroupDefinition;
use crate::tree::definition::r#enum::BackedEnumBodyDefinition;
use crate::tree::definition::r#enum::BackedEnumCaseDefinition;
use crate::tree::definition::r#enum::BackedEnumDefinition;
Expand Down Expand Up @@ -164,8 +161,9 @@ fn unit_enum_definition_member(
.map(Some);
}

concrete_method_definition(state, modifiers, enum_name)
.map(|method| method.map(UnitEnumMemberDefinition::Method))
Ok(Some(UnitEnumMemberDefinition::Method(
function::method_definition(state, modifiers)?,
)))
}

fn backed_enum_definition_member(
Expand Down Expand Up @@ -214,42 +212,7 @@ fn backed_enum_definition_member(
.map(Some);
}

concrete_method_definition(state, modifiers, enum_name)
.map(|method| method.map(BackedEnumMemberDefinition::Method))
}

fn concrete_method_definition(
state: &mut State,
modifiers: ModifierGroupDefinition,
enum_name: &Identifier,
) -> ParseResult<Option<ConcreteMethodDefinition>> {
let method =
function::method_definition(state, function::MethodDefinitionType::Concrete, modifiers)?;

match method {
MethodDefinitionReference::ConcreteConstructor(constructor) => {
crate::parser_report!(state, enum_cannot_have_constructor(enum_name, &constructor));

Ok(None)
}
MethodDefinitionReference::Concrete(method) => {
match method.name.value[..].to_ascii_lowercase().as_slice() {
b"__get" | b"__set" | b"__serialize" | b"__unserialize" | b"__destruct"
| b"__wakeup" | b"__sleep" | b"__set_state" | b"__unset" | b"__isset"
| b"__debuginfo" | b"__clone" | b"__tostring" => {
crate::parser_report!(state, enum_cannot_have_magic_method(enum_name, &method));
}
_ => {}
}

Ok(Some(method))
}
MethodDefinitionReference::Abstract(_)
| MethodDefinitionReference::AbstractConstructor(_) => {
crate::parser_bail!(
state,
unreachable_code("unexpected abstract method in enum definition")
)
}
}
Ok(Some(BackedEnumMemberDefinition::Method(
function::method_definition(state, modifiers)?,
)))
}
Loading