fmt: remove unused selective imports (#8595)
							parent
							
								
									cd4f7101f7
								
							
						
					
					
						commit
						9f59b04e86
					
				| 
						 | 
					@ -865,8 +865,12 @@ You can also import specific functions and types from modules directly:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```v
 | 
					```v
 | 
				
			||||||
import os { input }
 | 
					import os { input }
 | 
				
			||||||
import crypto.sha256 { sum }
 | 
					
 | 
				
			||||||
import time { Time }
 | 
					fn main() {
 | 
				
			||||||
 | 
						// read text from stdin
 | 
				
			||||||
 | 
						name := input('Enter your name: ')
 | 
				
			||||||
 | 
						println('Hello, $name!')
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Note: This is not allowed for constants - they must always be prefixed.
 | 
					Note: This is not allowed for constants - they must always be prefixed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,9 +36,10 @@ pub mut:
 | 
				
			||||||
	file               ast.File
 | 
						file               ast.File
 | 
				
			||||||
	did_imports        bool
 | 
						did_imports        bool
 | 
				
			||||||
	is_assign          bool
 | 
						is_assign          bool
 | 
				
			||||||
	auto_imports       []string // automatically inserted imports that the user forgot to specify
 | 
						auto_imports       []string        // automatically inserted imports that the user forgot to specify
 | 
				
			||||||
	import_pos         int      // position of the imports in the resulting string for later autoimports insertion
 | 
						import_pos         int             // position of the imports in the resulting string for later autoimports insertion
 | 
				
			||||||
	used_imports       []string // to remove unused imports
 | 
						used_imports       []string        // to remove unused imports
 | 
				
			||||||
 | 
						import_syms_used   map[string]bool // to remove unused import symbols.
 | 
				
			||||||
	is_debug           bool
 | 
						is_debug           bool
 | 
				
			||||||
	mod2alias          map[string]string // for `import time as t`, will contain: 'time'=>'t'
 | 
						mod2alias          map[string]string // for `import time as t`, will contain: 'time'=>'t'
 | 
				
			||||||
	use_short_fn_args  bool
 | 
						use_short_fn_args  bool
 | 
				
			||||||
| 
						 | 
					@ -82,6 +83,7 @@ pub fn (mut f Fmt) process_file_imports(file &ast.File) {
 | 
				
			||||||
		for sym in imp.syms {
 | 
							for sym in imp.syms {
 | 
				
			||||||
			f.mod2alias['${imp.mod}.$sym.name'] = sym.name
 | 
								f.mod2alias['${imp.mod}.$sym.name'] = sym.name
 | 
				
			||||||
			f.mod2alias[sym.name] = sym.name
 | 
								f.mod2alias[sym.name] = sym.name
 | 
				
			||||||
 | 
								f.import_syms_used[sym.name] = false
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	f.auto_imports = file.auto_imports
 | 
						f.auto_imports = file.auto_imports
 | 
				
			||||||
| 
						 | 
					@ -235,11 +237,15 @@ pub fn (mut f Fmt) mark_types_import_as_used(typ table.Type) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// `name` is a function (`foo.bar()`) or type (`foo.Bar{}`)
 | 
					// `name` is a function (`foo.bar()`) or type (`foo.Bar{}`)
 | 
				
			||||||
pub fn (mut f Fmt) mark_import_as_used(name string) {
 | 
					pub fn (mut f Fmt) mark_import_as_used(name string) {
 | 
				
			||||||
	if !name.contains('.') {
 | 
						parts := name.split('.')
 | 
				
			||||||
 | 
						last := parts.last()
 | 
				
			||||||
 | 
						if last in f.import_syms_used {
 | 
				
			||||||
 | 
							f.import_syms_used[last] = true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if parts.len == 1 {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pos := name.last_index('.') or { 0 }
 | 
						mod := parts[0..parts.len - 1].join('.')
 | 
				
			||||||
	mod := name[..pos]
 | 
					 | 
				
			||||||
	if mod in f.used_imports {
 | 
						if mod in f.used_imports {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -284,12 +290,13 @@ pub fn (mut f Fmt) imports(imports []ast.Import) {
 | 
				
			||||||
pub fn (f Fmt) imp_stmt_str(imp ast.Import) string {
 | 
					pub fn (f Fmt) imp_stmt_str(imp ast.Import) string {
 | 
				
			||||||
	is_diff := imp.alias != imp.mod && !imp.mod.ends_with('.' + imp.alias)
 | 
						is_diff := imp.alias != imp.mod && !imp.mod.ends_with('.' + imp.alias)
 | 
				
			||||||
	mut imp_alias_suffix := if is_diff { ' as $imp.alias' } else { '' }
 | 
						mut imp_alias_suffix := if is_diff { ' as $imp.alias' } else { '' }
 | 
				
			||||||
	if imp.syms.len > 0 {
 | 
					
 | 
				
			||||||
		names := imp.syms.map(it.name)
 | 
						syms := imp.syms.map(it.name).filter(f.import_syms_used[it])
 | 
				
			||||||
 | 
						if syms.len > 0 {
 | 
				
			||||||
		imp_alias_suffix += if imp.syms[0].pos.line_nr == imp.pos.line_nr {
 | 
							imp_alias_suffix += if imp.syms[0].pos.line_nr == imp.pos.line_nr {
 | 
				
			||||||
			' { ' + names.join(', ') + ' }'
 | 
								' { ' + syms.join(', ') + ' }'
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			' {\n\t' + names.join(',\n\t') + ',\n}'
 | 
								' {\n\t' + syms.join(',\n\t') + ',\n}'
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return '$imp.mod$imp_alias_suffix'
 | 
						return '$imp.mod$imp_alias_suffix'
 | 
				
			||||||
| 
						 | 
					@ -1218,6 +1225,7 @@ pub fn (mut f Fmt) ident(node ast.Ident) {
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						short := mod_prefix + '.' + const_name
 | 
											short := mod_prefix + '.' + const_name
 | 
				
			||||||
						f.write(short)
 | 
											f.write(short)
 | 
				
			||||||
 | 
											f.mark_import_as_used(short)
 | 
				
			||||||
						return
 | 
											return
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -1226,9 +1234,7 @@ pub fn (mut f Fmt) ident(node ast.Ident) {
 | 
				
			||||||
		name := f.short_module(node.name)
 | 
							name := f.short_module(node.name)
 | 
				
			||||||
		// f.write('<$it.name => $name>')
 | 
							// f.write('<$it.name => $name>')
 | 
				
			||||||
		f.write(name)
 | 
							f.write(name)
 | 
				
			||||||
		if name.contains('.') {
 | 
							f.mark_import_as_used(name)
 | 
				
			||||||
			f.mark_import_as_used(name)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1911,6 +1917,7 @@ fn should_decrease_arr_penalty(e ast.Expr) bool {
 | 
				
			||||||
pub fn (mut f Fmt) array_init(it ast.ArrayInit) {
 | 
					pub fn (mut f Fmt) array_init(it ast.ArrayInit) {
 | 
				
			||||||
	if it.exprs.len == 0 && it.typ != 0 && it.typ != table.void_type {
 | 
						if it.exprs.len == 0 && it.typ != 0 && it.typ != table.void_type {
 | 
				
			||||||
		// `x := []string{}`
 | 
							// `x := []string{}`
 | 
				
			||||||
 | 
							f.mark_types_import_as_used(it.typ)
 | 
				
			||||||
		f.write(f.table.type_to_str_using_aliases(it.typ, f.mod2alias))
 | 
							f.write(f.table.type_to_str_using_aliases(it.typ, f.mod2alias))
 | 
				
			||||||
		f.write('{')
 | 
							f.write('{')
 | 
				
			||||||
		if it.has_len {
 | 
							if it.has_len {
 | 
				
			||||||
| 
						 | 
					@ -2022,6 +2029,7 @@ pub fn (mut f Fmt) array_init(it ast.ArrayInit) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn (mut f Fmt) map_init(it ast.MapInit) {
 | 
					pub fn (mut f Fmt) map_init(it ast.MapInit) {
 | 
				
			||||||
	if it.keys.len == 0 {
 | 
						if it.keys.len == 0 {
 | 
				
			||||||
 | 
							f.mark_types_import_as_used(it.typ)
 | 
				
			||||||
		f.write(f.table.type_to_str(it.typ))
 | 
							f.write(f.table.type_to_str(it.typ))
 | 
				
			||||||
		f.write('{}')
 | 
							f.write('{}')
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
| 
						 | 
					@ -2064,9 +2072,11 @@ pub fn (mut f Fmt) struct_init(it ast.StructInit) {
 | 
				
			||||||
			f.comments(it.pre_comments, inline: true, has_nl: true, level: .indent)
 | 
								f.comments(it.pre_comments, inline: true, has_nl: true, level: .indent)
 | 
				
			||||||
			f.write('}')
 | 
								f.write('}')
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							f.mark_import_as_used(name)
 | 
				
			||||||
	} else if it.is_short {
 | 
						} else if it.is_short {
 | 
				
			||||||
		// `Foo{1,2,3}` (short syntax )
 | 
							// `Foo{1,2,3}` (short syntax )
 | 
				
			||||||
		f.write('$name{')
 | 
							f.write('$name{')
 | 
				
			||||||
 | 
							f.mark_import_as_used(name)
 | 
				
			||||||
		if it.has_update_expr {
 | 
							if it.has_update_expr {
 | 
				
			||||||
			f.write('...')
 | 
								f.write('...')
 | 
				
			||||||
			f.expr(it.update_expr)
 | 
								f.expr(it.update_expr)
 | 
				
			||||||
| 
						 | 
					@ -2089,6 +2099,7 @@ pub fn (mut f Fmt) struct_init(it ast.StructInit) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if !use_short_args {
 | 
							if !use_short_args {
 | 
				
			||||||
			f.write('$name{')
 | 
								f.write('$name{')
 | 
				
			||||||
 | 
								f.mark_import_as_used(name)
 | 
				
			||||||
			if single_line_fields {
 | 
								if single_line_fields {
 | 
				
			||||||
				f.write(' ')
 | 
									f.write(' ')
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,12 @@
 | 
				
			||||||
import math { max, min }
 | 
					import math { max, min }
 | 
				
			||||||
import os {
 | 
					import os {
 | 
				
			||||||
	input,
 | 
					 | 
				
			||||||
	user_os,
 | 
						user_os,
 | 
				
			||||||
 | 
						file_ext,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
						println(max(0.1, 0.2))
 | 
				
			||||||
 | 
						println(min(0.1, 0.2))
 | 
				
			||||||
 | 
						println(user_os())
 | 
				
			||||||
 | 
						println(file_ext('main.v'))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,5 +2,11 @@ import math { max,
 | 
				
			||||||
	min,
 | 
						min,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
import os {
 | 
					import os {
 | 
				
			||||||
	input, user_os }
 | 
						input, user_os, file_ext }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
						println(max(0.1, 0.2))
 | 
				
			||||||
 | 
						println(min(0.1, 0.2))
 | 
				
			||||||
 | 
						println(user_os())
 | 
				
			||||||
 | 
						println(file_ext('main.v'))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue