Skip to content

Commit

Permalink
Handling extremely long user-type names by specific bounding.
Browse files Browse the repository at this point in the history
commit-id:be92039f
  • Loading branch information
orizi committed Jun 25, 2024
1 parent 8ec2e0b commit b14afa1
Show file tree
Hide file tree
Showing 6 changed files with 1,079 additions and 918 deletions.
27 changes: 19 additions & 8 deletions crates/cairo-lang-semantic/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -248,15 +248,26 @@ impl ConcreteTypeId {
pub fn format(&self, db: &dyn SemanticGroup) -> String {
// TODO(spapini): Format generics.
let generic_type_format = self.generic_type(db).format(db.upcast());
let generic_args = self.generic_args(db);
if generic_args.is_empty() {
generic_type_format
let mut generic_args = self.generic_args(db).into_iter();
if let Some(first) = generic_args.next() {
// Soft limit for the number of chars in the formatted type.
const CHARS_BOUND: usize = 500;
let mut f = generic_type_format;
f.push_str("::<");
f.push_str(&first.format(db));
for arg in generic_args {
// If the formatted type is becoming too long, stop adding more arguments.
if f.len() > CHARS_BOUND {
f.push_str(", ...");
break;
}
f.push_str(", ");
f.push_str(&arg.format(db));
}
f.push('>');
f
} else {
format!(
"{}::<{}>",
generic_type_format,
generic_args.iter().map(|arg| arg.format(db)).join(", ")
)
generic_type_format
}
}

Expand Down
1 change: 1 addition & 0 deletions crates/cairo-lang-sierra/src/parser.lalrpop
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ PathLabel: String = {
GenericArgsString: String = {
GenericArg => <>.to_string(),
<head:GenericArgsString> "," <tail:GenericArg> => format!("{head}, {tail}"),
<head:GenericArgsString> "," "..." => format!("{head}, ..."),
}

// Label that can also include generic arguments.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,22 @@ mod circuit_contract {
let in1 = CircuitElement::<CircuitInput<0>> {};
let in2 = CircuitElement::<CircuitInput<1>> {};
let add = circuit_add(in1, in2);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let add = circuit_add(add, add);
let inv = circuit_inverse(add);

let modulus = TryInto::<_, CircuitModulus>::try_into([7, 0, 0, 0]).unwrap();
Expand Down
Loading

0 comments on commit b14afa1

Please sign in to comment.