-
Notifications
You must be signed in to change notification settings - Fork 1.1k
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
Create an internal prelude #4161
Conversation
r? @JohnTitor rustbot has assigned @JohnTitor. Use |
9fc7bb2
to
79ee819
Compare
7102017
to
91bb8d4
Compare
b1f9221
to
00521c0
Compare
@eduardosm I still have a bit to tweak here but would you mind giving this a second set of eyes? Current script#!/bin/bash
set -eux
files=()
# Types either defined in this crate or in `core`
prelude_types=(
c_char
c_double
c_float
c_int
c_longlong
c_long
c_short
c_uchar
c_uint
c_ulonglong
c_ulong
c_ushort
c_void
intptr_t
size_t
ssize_t
Clone
Copy
Option
Send
Sync
)
# Reexports from core
prelude_modules=(
fmt
hash
iter
mem
)
# Everything in the prelude
prelude=( "${prelude_types[@]}" "${prelude_modules[@]}" )
# Generate a list of all files excluding `lib.rs` (since the prelude being
# defined there makes string matching weird).
while IFS= read -r -d '' file; do
files+=("$file")
done < <(find src -name '*.rs' -not -name '*lib.rs' -not -name '*macros.rs' -print0)
for file in "${files[@]}"; do
needs_prelude=0
# If the file already has some sort of glob import, skip it
if rg --pcre2 -q 'use (crate|super)::(?!prelude).*\*' "$file"; then
continue
fi
# Core types always require the prelude to handle rustc-dep-of-std
if rg --pcre2 -q "\b(?<!\.)(Option|Clone|Copy|Send|Sync)\b" "$file"; then
needs_prelude=1
fi
# If we use any types that are specified in the prelude then we will import it
for ty in "${prelude[@]}"; do
# If the type is defined in the current module, we don't need it from the prelude
if rg -q "type $ty =" "$file"; then
continue
fi
if rg -qU '((crate|super)::'"$ty"'|use (crate|super)::(\{\n){0,2}.*'"$ty)" "$file"; then
echo NEEDS PRELUDE WITH TYPE $ty
needs_prelude=1
fi
done
# Check if the prelude is needed and does not already exist; if so, add it
if [ "$needs_prelude" = "1" ] && ! rg -q "use crate::prelude::\*" "$file"; then
perl -pi -0777 -e 's/(use (crate|super)::)/use crate::prelude::*;\n$1/' "$file"
fi
for ty in "${prelude[@]}"; do
export TY="$ty" # env for perl to use
# Remove simple imports `use crate::ty;`
perl -pi -0777 -e 's/use (crate|super)::($ENV{TY});//g' "$file"
# Remove the type if it is part of a group import
perl -pi -0777 -e 's/(use (crate|super)::\{?(.*|(\n.*){0,2}))\b$ENV{TY}\b,? ?/$1/g' "$file"
# Replace pathed `crate::ty`
perl -pi -0777 -e 's/(crate|super)::($ENV{TY})\b/$2/g' "$file"
done
# For some reason, rustfmt doesn't trim leading newlines. Do so manually here.
perl -pi -0777 -e 's/\A\n+//' "$file"
rustfmt "$file"
done
./ci/style.sh Edit: should be all done now. |
00521c0
to
628c89d
Compare
Script looks good to me and produces identical results in my machine. However I'm seeing some new compilation failures on some targets (Tier 3, I'm not sure how important it is): aarch64-unknown-trusty:
Maybe I believe they should be the same as riscv32imac-unknown-xous-elf:
Changing |
3e4cf1b
to
4d1c04c
Compare
Another failure on powerpc64-unknown-openbsd:
The script changed Probably because this line will not insert the prelude import unless the file has already any other import: perl -pi -0777 -e 's/(use (crate|super)::)/use crate::prelude::*;\n$1/' "$file" |
bbda648
to
1259e85
Compare
Other platforms export these types, so update Trusty to do so as well.
When building with `rustc-dep-of-std`, we don't get the core types imported by default (`Clone`, `Copy`, `Option`). In order to avoid needing to import these individually, introduce a prelude that includes them, along with commonly used C numeric types. This allows cleaning up some of the `use` statements.
Automatically apply changes with the following: #!/bin/bash set -eux files=() # Types either defined in this crate or in `core` prelude_types=( c_char c_double c_float c_int c_longlong c_long c_short c_uchar c_uint c_ulonglong c_ulong c_ushort c_void intptr_t size_t ssize_t Clone Copy Option Send Sync ) # Reexports from core prelude_modules=( fmt hash iter mem ) # Everything in the prelude prelude=( "${prelude_types[@]}" "${prelude_modules[@]}" ) # Generate a list of all files excluding `lib.rs` (since the prelude being # defined there makes string matching weird). while IFS= read -r -d '' file; do files+=("$file") done < <(find src -name '*.rs' -not -name '*lib.rs' -not -name '*macros.rs' -not -name 'fixed_width_ints.rs' -print0) for file in "${files[@]}"; do needs_prelude=0 # If the file already has some sort of glob import, skip it if rg --pcre2 -q 'use (crate|super)::(?!prelude).*\*' "$file"; then continue fi # Core types always require the prelude to handle rustc-dep-of-std if rg --pcre2 -q '\b(?<!\.)(Option|Clone|Copy|Send|Sync|fmt|hash|iter|mem)\b' "$file"; then needs_prelude=1 fi # If we use any types that are specified in the prelude then we will import it for ty in "${prelude[@]}"; do # If the type is defined in the current module, we don't need it from the prelude if rg -q "type $ty =" "$file"; then continue fi if rg -qU '((crate|super)::'"$ty"'|use (crate|super)::(\{\n){0,2}.*'"$ty)" "$file"; then needs_prelude=1 fi done # Check if the prelude is needed and does not already exist; if so, add it if [ "$needs_prelude" = "1" ] && ! rg -q 'use crate::prelude::\*' "$file"; then # Split the file into two parts: module-level attributes and rest # Imports will be added after module-level attributes attrs=$(awk '/^#!|^\/\/!/ {found=NR} {lines[NR]=$0} END {for (i=1; i<=found; i++) print lines[i]}' "$file") rest=$(awk '/^#!|^\/\/!/ {found=NR} END {if (found) {for (i=found+1; i<=NR; i++) print lines[i]} else {for (i=1; i<=NR; i++) print lines[i]}} {lines[NR]=$0}' "$file") printf "%s\n" "$attrs" > "$file" printf "\n%s\n\n" "use crate::prelude::*;" >> "$file" printf "%s" "$rest" >> "$file" fi for ty in "${prelude[@]}"; do export TY="$ty" # env for perl to use # Remove simple imports `use crate::ty;` perl -pi -0777 -e 's/use ((crate|super)::)?($ENV{TY});//g' "$file" # Remove the type if it is part of a group import perl -pi -0777 -e 's/(use (crate|super)::\{?(.*|(\n.*){0,2}))\b$ENV{TY}\b,? ?/$1/g' "$file" # Replace pathed `crate::ty` perl -pi -0777 -e 's/(crate|super)::($ENV{TY})\b/$2/g' "$file" done # For some reason, rustfmt doesn't trim leading newlines. Do so manually here. perl -pi -0777 -e 's/\A\n+//' "$file" rustfmt "$file" done ./ci/style.sh
1259e85
to
f8a018a
Compare
Great catches, thank you for taking a look! Updated to add I'll make sure to verify builds for tier3 once this is closer to ready for a release which will probably be tomorrow, since I need to make some other adjustments to fix Current script: Current script#!/bin/bash
set -eux
files=()
# Types either defined in this crate or in `core`
prelude_types=(
c_char
c_double
c_float
c_int
c_longlong
c_long
c_short
c_uchar
c_uint
c_ulonglong
c_ulong
c_ushort
c_void
intptr_t
size_t
ssize_t
Clone
Copy
Option
Send
Sync
)
# Reexports from core
prelude_modules=(
fmt
hash
iter
mem
)
# Everything in the prelude
prelude=( "${prelude_types[@]}" "${prelude_modules[@]}" )
# Generate a list of all files excluding `lib.rs` (since the prelude being
# defined there makes string matching weird).
while IFS= read -r -d '' file; do
files+=("$file")
done < <(find src -name '*.rs' -not -name '*lib.rs' -not -name '*macros.rs' -not -name 'fixed_width_ints.rs' -print0)
for file in "${files[@]}"; do
needs_prelude=0
# If the file already has some sort of glob import, skip it
if rg --pcre2 -q 'use (crate|super)::(?!prelude).*\*' "$file"; then
continue
fi
# Core types always require the prelude to handle rustc-dep-of-std
if rg --pcre2 -q '\b(?<!\.)(Option|Clone|Copy|Send|Sync|fmt|hash|iter|mem)\b' "$file"; then
needs_prelude=1
fi
# If we use any types that are specified in the prelude then we will import it
for ty in "${prelude[@]}"; do
# If the type is defined in the current module, we don't need it from the prelude
if rg -q "type $ty =" "$file"; then
continue
fi
if rg -qU '((crate|super)::'"$ty"'|use (crate|super)::(\{\n){0,2}.*'"$ty)" "$file"; then
needs_prelude=1
fi
done
# Check if the prelude is needed and does not already exist; if so, add it
if [ "$needs_prelude" = "1" ] && ! rg -q 'use crate::prelude::\*' "$file"; then
# Split the file into two parts: module-level attributes and rest
# Imports will be added after module-level attributes
attrs=$(awk '/^#!|^\/\/!/ {found=NR} {lines[NR]=$0} END {for (i=1; i<=found; i++) print lines[i]}' "$file")
rest=$(awk '/^#!|^\/\/!/ {found=NR} END {if (found) {for (i=found+1; i<=NR; i++) print lines[i]} else {for (i=1; i<=NR; i++) print lines[i]}} {lines[NR]=$0}' "$file")
printf "%s\n" "$attrs" > "$file"
printf "\n%s\n\n" "use crate::prelude::*;" >> "$file"
printf "%s" "$rest" >> "$file"
fi
for ty in "${prelude[@]}"; do
export TY="$ty" # env for perl to use
# Remove simple imports `use crate::ty;`
perl -pi -0777 -e 's/use ((crate|super)::)?($ENV{TY});//g' "$file"
# Remove the type if it is part of a group import
perl -pi -0777 -e 's/(use (crate|super)::\{?(.*|(\n.*){0,2}))\b$ENV{TY}\b,? ?/$1/g' "$file"
# Replace pathed `crate::ty`
perl -pi -0777 -e 's/(crate|super)::($ENV{TY})\b/$2/g' "$file"
done
# For some reason, rustfmt doesn't trim leading newlines. Do so manually here.
perl -pi -0777 -e 's/\A\n+//' "$file"
rustfmt "$file"
done
./ci/style.sh |
The Trusty change looks good 👍 Thanks for adding those. |
Other platforms export these types, so update Trusty to do so as well. (backport <rust-lang#4161>) (cherry picked from commit 6bee30e)
When building with `rustc-dep-of-std`, we don't get the core types imported by default (`Clone`, `Copy`, `Option`). In order to avoid needing to import these individually, introduce a prelude that includes them, along with commonly used C numeric types. This allows cleaning up some of the `use` statements. (backport <rust-lang#4161>) (cherry picked from commit 30bc78b)
Automatically apply changes with the following: #!/bin/bash set -eux files=() # Types either defined in this crate or in `core` prelude_types=( c_char c_double c_float c_int c_longlong c_long c_short c_uchar c_uint c_ulonglong c_ulong c_ushort c_void intptr_t size_t ssize_t Clone Copy Option Send Sync ) # Reexports from core prelude_modules=( fmt hash iter mem ) # Everything in the prelude prelude=( "${prelude_types[@]}" "${prelude_modules[@]}" ) # Generate a list of all files excluding `lib.rs` (since the prelude being # defined there makes string matching weird). while IFS= read -r -d '' file; do files+=("$file") done < <(find src -name '*.rs' -not -name '*lib.rs' -not -name '*macros.rs' -not -name 'fixed_width_ints.rs' -print0) for file in "${files[@]}"; do needs_prelude=0 # If the file already has some sort of glob import, skip it if rg --pcre2 -q 'use (crate|super)::(?!prelude).*\*' "$file"; then continue fi # Core types always require the prelude to handle rustc-dep-of-std if rg --pcre2 -q '\b(?<!\.)(Option|Clone|Copy|Send|Sync|fmt|hash|iter|mem)\b' "$file"; then needs_prelude=1 fi # If we use any types that are specified in the prelude then we will import it for ty in "${prelude[@]}"; do # If the type is defined in the current module, we don't need it from the prelude if rg -q "type $ty =" "$file"; then continue fi if rg -qU '((crate|super)::'"$ty"'|use (crate|super)::(\{\n){0,2}.*'"$ty)" "$file"; then needs_prelude=1 fi done # Check if the prelude is needed and does not already exist; if so, add it if [ "$needs_prelude" = "1" ] && ! rg -q 'use crate::prelude::\*' "$file"; then # Split the file into two parts: module-level attributes and rest # Imports will be added after module-level attributes attrs=$(awk '/^#!|^\/\/!/ {found=NR} {lines[NR]=$0} END {for (i=1; i<=found; i++) print lines[i]}' "$file") rest=$(awk '/^#!|^\/\/!/ {found=NR} END {if (found) {for (i=found+1; i<=NR; i++) print lines[i]} else {for (i=1; i<=NR; i++) print lines[i]}} {lines[NR]=$0}' "$file") printf "%s\n" "$attrs" > "$file" printf "\n%s\n\n" "use crate::prelude::*;" >> "$file" printf "%s" "$rest" >> "$file" fi for ty in "${prelude[@]}"; do export TY="$ty" # env for perl to use # Remove simple imports `use crate::ty;` perl -pi -0777 -e 's/use ((crate|super)::)?($ENV{TY});//g' "$file" # Remove the type if it is part of a group import perl -pi -0777 -e 's/(use (crate|super)::\{?(.*|(\n.*){0,2}))\b$ENV{TY}\b,? ?/$1/g' "$file" # Replace pathed `crate::ty` perl -pi -0777 -e 's/(crate|super)::($ENV{TY})\b/$2/g' "$file" done # For some reason, rustfmt doesn't trim leading newlines. Do so manually here. perl -pi -0777 -e 's/\A\n+//' "$file" rustfmt "$file" done ./ci/style.sh (backport <rust-lang#4161>) (cherry picked from commit f8a018a) Applied by rerunning the script rather than resolving conflicts manually.
When building with
rustc-dep-of-std
, we don't get the core types imported by default (Clone
,Copy
,Option
). In order to avoid needing to import these individually, introduce a prelude that includes them.This also includes the C numeric types that are frequently used.