Allow dots in import module names

We found some issues with the private submodules part of the proposal [1],
and we decided to keep module directories for now.

[1] https://docs.google.com/document/d/1E_77fO-44BtoBtXoVeWyGh1xN2KRTWTu8q6i25RNNx0/edit#heading=h.x84bh32l37em
This commit is contained in:
Agus Zubiaga 2024-04-14 07:47:18 -03:00
parent b56f029a09
commit 3217e5a3f0
No known key found for this signature in database
18 changed files with 109 additions and 52 deletions

View file

@ -2972,7 +2972,7 @@ fn to_pending_value_def<'a>(
}),
ModuleImport(module_import) => {
let module_name = ModuleName::from(module_import.name.value.name);
let module_name = ModuleName::from(module_import.name.value.name.as_str());
let pq_module_name = QualifiedModuleName {
opt_package: module_import.name.value.package,
module: module_name.clone(),

View file

@ -305,7 +305,7 @@ impl<'a> Formattable for ImportedModuleName<'a> {
buf.push_str(".");
}
buf.push_str(self.name);
self.name.format(buf, indent);
}
}

View file

@ -2387,7 +2387,6 @@ fn update<'a>(
exposed_symbols.insert(*symbol);
}
// [modules-revamp] TODO: revise this
// NOTE we currently re-parse the headers when a module is imported twice.
// We need a proper solution that marks a phase as in-progress so it's not repeated
// debug_assert!(!state.exposed_symbols_by_module.contains_key(&home));
@ -5214,7 +5213,7 @@ fn parse<'a>(
ValueDef::ModuleImport(import) => {
let qualified_module_name = QualifiedModuleName {
opt_package: import.name.value.package,
module: import.name.value.name.into(),
module: import.name.value.name.as_str().into(),
};
imported.push((qualified_module_name, *region));

View file

@ -2,7 +2,7 @@ use std::fmt::Debug;
use std::path::Path;
use crate::header::{
self, AppHeader, HostedHeader, InterfaceHeader, PackageHeader, PlatformHeader,
self, AppHeader, HostedHeader, InterfaceHeader, ModuleName, PackageHeader, PlatformHeader,
};
use crate::ident::Accessor;
use crate::parser::ESingleQuote;
@ -11,7 +11,6 @@ use bumpalo::Bump;
use roc_collections::soa::{EitherIndex, Index, Slice};
use roc_error_macros::internal_error;
use roc_module::called_via::{BinOp, CalledVia, UnaryOp};
use roc_module::ident::ModuleName;
use roc_region::all::{Loc, Position, Region};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
@ -460,7 +459,7 @@ pub fn wrap_in_task_ok<'a>(arena: &'a Bump, loc_expr: &'a Loc<Expr<'a>>) -> &'a
arena.alloc(Loc::at(
loc_expr.region,
Expr::Var {
module_name: ModuleName::TASK,
module_name: roc_module::ident::ModuleName::TASK,
ident: "ok",
suffixed: 0,
},
@ -893,7 +892,7 @@ impl header::Keyword for ImportExposingKeyword {
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ImportedModuleName<'a> {
pub package: Option<&'a str>,
pub name: &'a str,
pub name: ModuleName<'a>,
}
#[derive(Debug, Clone, Copy, PartialEq)]

View file

@ -12,6 +12,7 @@ use crate::ident::{
integer_ident, lowercase_ident, parse_ident, unqualified_ident, uppercase_ident, Accessor,
Ident,
};
use crate::module::module_name_help;
use crate::parser::{
self, backtrackable, byte, byte_indent, increment_min_indent, line_min_indent, optional,
reset_min_indent, sep_by1, sep_by1_e, set_min_indent, specialize_err, specialize_err_ref, then,
@ -957,7 +958,7 @@ fn imported_module_name<'a>() -> impl Parser<'a, ImportedModuleName<'a>, EImport
specialize_err(|_, pos| EImport::PackageShorthand(pos), lowercase_ident()),
byte(b'.', EImport::PackageShorthandDot)
)),
name: specialize_err(|_, pos| EImport::ModuleName(pos), uppercase_ident()),
name: module_name_help(EImport::ModuleName)
})
}

View file

@ -590,7 +590,7 @@ fn shortname<'a>() -> impl Parser<'a, &'a str, EImports> {
specialize_err(|_, pos| EImports::Shorthand(pos), lowercase_ident())
}
fn module_name_help<'a, F, E>(to_expectation: F) -> impl Parser<'a, ModuleName<'a>, E>
pub fn module_name_help<'a, F, E>(to_expectation: F) -> impl Parser<'a, ModuleName<'a>, E>
where
F: Fn(Position) -> E,
E: 'a,

View file

@ -19,7 +19,9 @@ Defs {
before_name: [],
name: @8-12 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: None,
exposed: None,

View file

@ -37,7 +37,9 @@ Defs {
package: Some(
"json",
),
name: "Decode",
name: ModuleName(
"Decode",
),
},
alias: None,
exposed: None,
@ -50,7 +52,9 @@ Defs {
package: Some(
"json",
),
name: "Decode",
name: ModuleName(
"Decode",
),
},
alias: Some(
KeywordItem {
@ -74,7 +78,9 @@ Defs {
package: Some(
"json",
),
name: "Decode",
name: ModuleName(
"Decode",
),
},
alias: None,
exposed: Some(
@ -108,7 +114,9 @@ Defs {
package: Some(
"json",
),
name: "Decode",
name: ModuleName(
"Decode",
),
},
alias: Some(
KeywordItem {

View file

@ -1,2 +1,2 @@
import JsonEncode as JE
import BytesDecode as BD
import Bytes.Decode as BD

View file

@ -5,7 +5,7 @@ Defs {
],
regions: [
@0-23,
@24-49,
@24-50,
],
space_before: [
Slice(start = 0, length = 0),
@ -25,7 +25,9 @@ Defs {
before_name: [],
name: @7-17 ImportedModuleName {
package: None,
name: "JsonEncode",
name: ModuleName(
"JsonEncode",
),
},
alias: Some(
KeywordItem {
@ -45,9 +47,11 @@ Defs {
ModuleImport(
ModuleImport {
before_name: [],
name: @31-42 ImportedModuleName {
name: @31-43 ImportedModuleName {
package: None,
name: "BytesDecode",
name: ModuleName(
"Bytes.Decode",
),
},
alias: Some(
KeywordItem {
@ -56,7 +60,7 @@ Defs {
item: ImportAsKeyword,
after: [],
},
item: @47-49 ImportAlias(
item: @48-50 ImportAlias(
"BD",
),
},

View file

@ -1,2 +1,2 @@
import JsonEncode as JE
import BytesDecode as BD
import Bytes.Decode as BD

View file

@ -100,7 +100,9 @@ Defs {
],
name: @25-29 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -135,7 +137,9 @@ Defs {
before_name: [],
name: @58-62 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -175,7 +179,9 @@ Defs {
before_name: [],
name: @109-113 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -202,7 +208,9 @@ Defs {
before_name: [],
name: @145-149 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -242,7 +250,9 @@ Defs {
before_name: [],
name: @196-200 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -290,7 +300,9 @@ Defs {
before_name: [],
name: @261-265 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: None,
exposed: Some(
@ -327,7 +339,9 @@ Defs {
before_name: [],
name: @321-325 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -367,7 +381,9 @@ Defs {
before_name: [],
name: @372-376 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: None,
exposed: Some(
@ -396,7 +412,9 @@ Defs {
before_name: [],
name: @418-422 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -436,7 +454,9 @@ Defs {
before_name: [],
name: @469-473 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -489,7 +509,9 @@ Defs {
],
name: @542-546 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: Some(
KeywordItem {
@ -557,7 +579,9 @@ Defs {
before_name: [],
name: @682-683 ImportedModuleName {
package: None,
name: "A",
name: ModuleName(
"A",
),
},
alias: None,
exposed: None,
@ -568,7 +592,9 @@ Defs {
before_name: [],
name: @717-718 ImportedModuleName {
package: None,
name: "B",
name: ModuleName(
"B",
),
},
alias: None,
exposed: None,

View file

@ -30,7 +30,9 @@ Defs {
before_name: [],
name: @7-11 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: None,
exposed: Some(
@ -57,7 +59,9 @@ Defs {
before_name: [],
name: @43-47 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: None,
exposed: Some(
@ -89,7 +93,9 @@ Defs {
before_name: [],
name: @83-87 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: None,
exposed: Some(

View file

@ -6,7 +6,7 @@ Defs(
],
regions: [
@0-26,
@27-50,
@27-51,
],
space_before: [
Slice(start = 0, length = 0),
@ -26,7 +26,9 @@ Defs(
before_name: [],
name: @7-11 ImportedModuleName {
package: None,
name: "Json",
name: ModuleName(
"Json",
),
},
alias: None,
exposed: Some(
@ -48,9 +50,11 @@ Defs(
ModuleImport(
ModuleImport {
before_name: [],
name: @34-44 ImportedModuleName {
name: @34-45 ImportedModuleName {
package: None,
name: "JsonEncode",
name: ModuleName(
"Json.Encode",
),
},
alias: Some(
KeywordItem {
@ -59,7 +63,7 @@ Defs(
item: ImportAsKeyword,
after: [],
},
item: @48-50 ImportAlias(
item: @49-51 ImportAlias(
"JE",
),
},
@ -69,23 +73,23 @@ Defs(
),
],
},
@52-70 SpaceBefore(
@53-71 SpaceBefore(
Apply(
@52-61 Var {
@53-62 Var {
module_name: "JE",
ident: "encode",
suffixed: 0,
},
[
@63-69 ParensAround(
@64-70 ParensAround(
Apply(
@63-66 Var {
@64-67 Var {
module_name: "",
ident: "int",
suffixed: 0,
},
[
@67-69 Num(
@68-70 Num(
"42",
),
],

View file

@ -1,4 +1,4 @@
import Json exposing [int]
import JsonEncode as JE
import Json.Encode as JE
JE.encode (int 42)