Skip to content

Commit 8913cc7

Browse files
Handle plugins per each crate
commit-id:22479572
1 parent 9942c29 commit 8913cc7

File tree

10 files changed

+377
-185
lines changed

10 files changed

+377
-185
lines changed

Cargo.lock

Lines changed: 71 additions & 35 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ lsp-types = "=0.95.0"
6565
memchr = "2.7.4"
6666
salsa = { package = "rust-analyzer-salsa", version = "0.17.0-pre.6" }
6767
scarb-metadata = { git = "https://github.com/software-mansion/scarb", branch = "spr/main/ac416d0e" } # TODO: Change back to crates-io as soon as changes from that branch are released there
68-
scarb-proc-macro-server-types = "0.1"
68+
scarb-proc-macro-server-types = { git = "https://github.com/software-mansion/scarb", branch = "spr/main/2adeb9c2" } # TODO: Change back to crates-io as soon as changes from that branch are released there
6969
scarb-stable-hash = "1"
7070
serde = { version = "1", default-features = false, features = ["derive"] }
7171
serde_json = "1.0.135"
@@ -96,36 +96,35 @@ test-log = "0.2.16"
9696
# on some of them directly.
9797
# This ensures no duplicate instances of Cairo crates are pulled in by mistake.
9898
[patch.crates-io]
99-
cairo-lang-casm = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
100-
cairo-lang-compiler = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
101-
cairo-lang-debug = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
102-
cairo-lang-defs = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
103-
cairo-lang-diagnostics = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
104-
cairo-lang-doc = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
105-
cairo-lang-eq-solver = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
106-
cairo-lang-executable = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
107-
cairo-lang-filesystem = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
108-
cairo-lang-formatter = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
109-
cairo-lang-lowering = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
110-
cairo-lang-parser = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
111-
cairo-lang-plugins = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
112-
cairo-lang-proc-macros = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
113-
cairo-lang-project = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
114-
cairo-lang-runnable-utils = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
115-
cairo-lang-semantic = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
116-
cairo-lang-sierra = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
117-
cairo-lang-sierra-ap-change = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
118-
cairo-lang-sierra-gas = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
119-
cairo-lang-sierra-generator = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
120-
cairo-lang-sierra-to-casm = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
121-
cairo-lang-sierra-type-size = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
122-
cairo-lang-starknet = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
123-
cairo-lang-starknet-classes = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
124-
cairo-lang-syntax = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
125-
cairo-lang-syntax-codegen = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
126-
cairo-lang-test-plugin = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
127-
cairo-lang-test-utils = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
128-
cairo-lang-utils = { git = "https://github.com/starkware-libs/cairo", rev = "cdd317675179bf6849a526479dc91e41608d684b" }
99+
cairo-lang-casm = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
100+
cairo-lang-compiler = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
101+
cairo-lang-debug = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
102+
cairo-lang-defs = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
103+
cairo-lang-diagnostics = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
104+
cairo-lang-doc = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
105+
cairo-lang-eq-solver = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
106+
cairo-lang-executable = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
107+
cairo-lang-filesystem = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
108+
cairo-lang-formatter = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
109+
cairo-lang-lowering = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
110+
cairo-lang-parser = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
111+
cairo-lang-plugins = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
112+
cairo-lang-proc-macros = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
113+
cairo-lang-project = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
114+
cairo-lang-semantic = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
115+
cairo-lang-sierra = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
116+
cairo-lang-sierra-ap-change = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
117+
cairo-lang-sierra-gas = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
118+
cairo-lang-sierra-generator = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
119+
cairo-lang-sierra-to-casm = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
120+
cairo-lang-sierra-type-size = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
121+
cairo-lang-starknet = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
122+
cairo-lang-starknet-classes = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
123+
cairo-lang-syntax = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
124+
cairo-lang-syntax-codegen = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
125+
cairo-lang-test-plugin = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
126+
cairo-lang-test-utils = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
127+
cairo-lang-utils = { git = "https://github.com/starkware-libs/cairo", branch = "spr/main/f0989263" }
129128

130129
# The profile used for CI in pull requests.
131130
# External dependencies are built with optimisation enabled,

src/ide/completion/completions.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use cairo_lang_defs::ids::{
33
LanguageElementId, LookupItemId, ModuleFileId, ModuleId, NamedLanguageElementId,
44
TopLevelLanguageElementId, TraitFunctionId,
55
};
6+
use cairo_lang_defs::plugin::MacroPlugin;
67
use cairo_lang_filesystem::db::FilesGroup;
78
use cairo_lang_filesystem::ids::FileId;
89
use cairo_lang_filesystem::span::TextOffset;
@@ -47,7 +48,12 @@ pub fn attribute_completions(
4748

4849
let attribute = Attribute::from_syntax_node(db, node.parent().unwrap());
4950

50-
let plugins = db.macro_plugins();
51+
// TODO: Will add per-crate logic later in this commit.
52+
let plugins = db
53+
.default_macro_plugins()
54+
.into_iter()
55+
.map(|&id| db.lookup_intern_macro_plugin(id))
56+
.collect::<Vec<_>>();
5157

5258
let attr = attribute.attr(db);
5359
let attr_node = attr.as_syntax_node();
@@ -161,7 +167,12 @@ pub fn generic_completions(
161167
return completions;
162168
};
163169

164-
let inline_plugins = db.inline_macro_plugins();
170+
// TODO: Will add per-crate logic later in this commit.
171+
let inline_plugins = db
172+
.default_inline_macro_plugins()
173+
.iter()
174+
.map(|(name, &id)| (name.clone(), db.lookup_intern_inline_macro_plugin(id)))
175+
.collect::<Vec<_>>();
165176

166177
let inline_macros = inline_plugins.iter().map(|plugin| CompletionItem {
167178
label: format!("{}!", plugin.0),

src/ide/hover/render/definition.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use cairo_lang_defs::db::DefsGroup;
2+
use cairo_lang_defs::plugin::InlineMacroExprPlugin;
23
use cairo_lang_doc::db::DocGroup;
34
use cairo_lang_filesystem::ids::FileId;
45
use cairo_lang_syntax::node::TypedSyntaxNode;
@@ -45,8 +46,16 @@ pub fn definition(
4546

4647
SymbolDef::Variable(var) => fenced_code_block(&var.signature(db)),
4748
SymbolDef::ExprInlineMacro(macro_name) => {
49+
let crate_id = db.file_modules(file_id).ok()?.first()?.owning_crate(db);
50+
4851
let mut md = fenced_code_block(macro_name);
49-
if let Some(doc) = db.inline_macro_plugins().get(macro_name.as_str())?.documentation() {
52+
53+
if let Some(doc) = db
54+
.crate_inline_macro_plugins(crate_id)
55+
.get(macro_name.as_str())
56+
.map(|&id| db.lookup_intern_inline_macro_plugin(id))?
57+
.documentation()
58+
{
5059
md += RULE;
5160
md += &doc;
5261
}

src/ide/macros/expand.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ use std::collections::VecDeque;
22
use std::sync::Arc;
33

44
use cairo_lang_defs::db::DefsGroup;
5-
use cairo_lang_defs::plugin::MacroPluginMetadata;
5+
use cairo_lang_defs::plugin::{InlineMacroExprPlugin, MacroPlugin, MacroPluginMetadata};
66
use cairo_lang_diagnostics::DiagnosticsBuilder;
77
use cairo_lang_filesystem::db::FilesGroup;
8-
use cairo_lang_filesystem::ids::{FileId, FileKind, FileLongId, VirtualFile};
8+
use cairo_lang_filesystem::ids::{CrateId, FileId, FileKind, FileLongId, VirtualFile};
99
use cairo_lang_filesystem::span::{TextSpan, TextWidth};
1010
use cairo_lang_formatter::FormatterConfig;
1111
use cairo_lang_parser::db::ParserGroup;
@@ -39,7 +39,7 @@ pub fn expand_macro(db: &AnalysisDatabase, params: &TextDocumentPositionParams)
3939

4040
let metadata = MacroPluginMetadata {
4141
cfg_set: &cfg_set,
42-
declared_derives: &db.declared_derives(),
42+
declared_derives: &db.declared_derives(crate_id),
4343
allowed_features: &Default::default(),
4444
edition,
4545
};
@@ -72,7 +72,7 @@ pub fn expand_macro(db: &AnalysisDatabase, params: &TextDocumentPositionParams)
7272
};
7373

7474
// Expand inline macros in generated files.
75-
expand_inline_macros(db, node_to_expand, files, &metadata, top_level_macro_kind)
75+
expand_inline_macros(db, crate_id, node_to_expand, files, &metadata, top_level_macro_kind)
7676
}
7777

7878
#[derive(Copy, Clone)]
@@ -98,11 +98,14 @@ fn expanded_macro_files(
9898
let mut module_queue = VecDeque::from([(module_file, vec![item])]);
9999
let mut files = VecDeque::new();
100100

101+
let crate_id = db.file_modules(module_file).ok()?.first()?.owning_crate(db);
102+
101103
while let Some((module_file, item_asts)) = module_queue.pop_front() {
102104
files.push_back(module_file);
103105

104106
for item_ast in item_asts {
105-
for plugin in db.macro_plugins() {
107+
for &plugin_id in db.crate_macro_plugins(crate_id).iter() {
108+
let plugin = db.lookup_intern_macro_plugin(plugin_id);
106109
let result = plugin.generate_code(db.upcast(), item_ast.clone(), metadata);
107110

108111
if let Some(generated) = result.code {
@@ -141,6 +144,7 @@ fn node_depth(node: SyntaxNode) -> usize {
141144
/// Expands inline macros for each file.
142145
fn expand_inline_macros(
143146
db: &AnalysisDatabase,
147+
crate_id: CrateId,
144148
node_to_expand: SyntaxNode,
145149
mut files: VecDeque<FileId>,
146150
metadata: &MacroPluginMetadata<'_>,
@@ -150,6 +154,7 @@ fn expand_inline_macros(
150154

151155
expand_inline_macros_in_single_file(
152156
db,
157+
crate_id,
153158
metadata,
154159
files.pop_front().unwrap(),
155160
&mut files,
@@ -160,6 +165,7 @@ fn expand_inline_macros(
160165
while let Some(file) = files.pop_front() {
161166
expand_inline_macros_in_single_file(
162167
db,
168+
crate_id,
163169
metadata,
164170
file,
165171
&mut files,
@@ -245,13 +251,14 @@ impl FileProcessorConfig {
245251
/// pushes output string.
246252
fn expand_inline_macros_in_single_file(
247253
db: &AnalysisDatabase,
254+
crate_id: CrateId,
248255
metadata: &MacroPluginMetadata<'_>,
249256
file: FileId,
250257
files: &mut VecDeque<FileId>,
251258
output: &mut String,
252259
mut config: FileProcessorConfig,
253260
) -> Option<()> {
254-
let plugins = db.inline_macro_plugins();
261+
let plugins = db.crate_inline_macro_plugins(crate_id);
255262

256263
if config.macros.is_empty() {
257264
append_file_with_header(db, file, &config.content, output);
@@ -260,7 +267,8 @@ fn expand_inline_macros_in_single_file(
260267
for node in config.macros.into_iter().rev() {
261268
let inline_macro = ExprInlineMacro::from_syntax_node(db, node.clone());
262269
let code = plugins
263-
.get(&inline_macro.path(db).as_syntax_node().get_text_without_trivia(db))?
270+
.get(&inline_macro.path(db).as_syntax_node().get_text_without_trivia(db))
271+
.map(|&id| db.lookup_intern_inline_macro_plugin(id))?
264272
.generate_code(db, &inline_macro, metadata)
265273
.code?
266274
.content;

0 commit comments

Comments
 (0)